POI3.5_HSSF_和XSSF_Excel操作快速入门手册
POI操作Excel常用方法总结
POI操作Excel常用方法总结POI操作Excel常用方法总结一、POI简介Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
二、HSSF概况HSSF 是Horrible SpreadSheet Format的缩写,通过HSSF,你可以用纯Java代码来读取、写入、修改Excel文件。
HSSF 为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型”。
三、POI EXCEL文档结构类HSSFWorkbook excel文档对象HSSFSheet excel的sheet HSSFRow excel的行HSSFCell excel的单元格HSSFFont excel字体HSSFName 名称HSSFDataFormat 日期格式HSSFHeader sheet头HSSFFooter sheet尾HSSFCellStyle cell样式HSSFDateUtil 日期HSSFPrintSetup 打印HSSFErrorConstants 错误信息表四、EXCEL常用操作方法1、得到Excel常用对象view plaincopy to clipboardprint?1.POIFSFileSystem fs=newPOIFSFileSystem(new FileInputStream("d:/test.xls"));2.//得到Excel工作簿对象3.HSSFWorkbook wb = new HSSFWorkbook(fs);4.//得到Excel工作表对象5.HSSFSheet sheet = wb.getSheetAt(0);6.//得到Excel工作表的行7.HSSFRow row = sheet.getRow(i);8.//得到Excel工作表指定行的单元格9.HSSFCell cell = row.getCell((short) j);10.cellStyle = cell.getCellStyle();//得到单元格样式1.HSSFWorkbook wb = new HSSFWorkbook();//创建Excel工作簿对象2.HSSFSheet sheet = wb.createSheet("new sheet");//创建Excel工作表对象3.HSSFRow row = sheet.createRow((short)0); //创建Excel工作表的行4.cellStyle = wb.createCellStyle();//创建单元格样式5.row.createCell((short)0).setCellStyle(cellStyle); //创建Excel 工作表指定行的单元格6.row.createCell((short)0).setCellValue(1); //设置Excel工作表的值3、设置sheet名称和单元格内容view plaincopy to clipboardprint?1.wb.setSheetName(1, "第一张工作表",HSSFCell.ENCODING_UTF_16);2.cell.setEncoding((short) 1);3.cell.setCellValue("单元格内容");1.wb.getNumberOfSheets()1.HSSFSheet sheet = wb.getSheetAt(0);1.int rowcount = sheet.getLastRowNum();view plaincopy to clipboardprint?1.row.getLastCellNum();1.cell.setCellType(HSSFCell.CELL_TYPE_STRING); //设置单元格为STRING类型2.cell.getNumericCellValue();//读取为数值类型的单元格内容1.sheet.setColumnWidth((short)column,(short)width);2.row.setHeight((short)height);1.Region region = new Region((short)rowFrom,(short)columnFrom,(short)rowT o2.,(short)columnT o);//合并从第rowFrom行columnFrom列3.sheet.addMergedRegion(region);// 到rowTo行columnT o 的区域4.//得到所有区域5.sheet.getNumMergedRegions()1.FileOutputStream fileOut = new FileOutputStream(path);2.wb.write(fileOut);1.public String getCellStringValue(HSSFCell cell) {2. String cellValue = "";3. switch (cell.getCellType()) {4. case HSSFCell.CELL_TYPE_STRING://字符串类型5. cellValue = cell.getStringCellValue();6. if(cellValue.trim().equals("")||cellValue.trim().length()<=0)7. cellValue=" ";8. break;9. case HSSFCell.CELL_TYPE_NUMERIC: //数值类型10. cellValue = String.valueOf(cell.getNumericCellValue());11. break;12. case HSSFCell.CELL_TYPE_FORMULA: //公式13. cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);14. cellValue = String.valueOf(cell.getNumericCellValue());15. break;16. case HSSFCell.CELL_TYPE_BLANK:17. cellValue=" ";18. break;19. case HSSFCell.CELL_TYPE_BOOLEAN:20. break;21. case HSSFCell.CELL_TYPE_ERROR:22. break;23. default:24. break;25. }26. return cellValue;27. }13、常用单元格边框格式view plaincopy to clipboardprint?1.HSSFCellStyle style = wb.createCellStyle();2.style.setBorderBottom(HSSFCellStyle.BORDER_DOTTED);//下边框3.style.setBorderLeft(HSSFCellStyle.BORDER_DOTTED);//左边框4.style.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框5.style.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框1.HSSFFont f = wb.createFont();2. f.setFontHeightInPoints((short) 11);//字号3. f.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);//加粗4.style.setFont(f);5.style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//左右居中6.style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTE R);//上下居中7.style.setRotation(short rotation);//单元格内容的旋转的角度8.HSSFDataFormat df = wb.createDataFormat();9.style1.setDataFormat(df.getFormat("0.00%"));//设置单元格数据格式10.cell.setCellFormula(string);//给单元格设公式11.style.setRotation(short rotation);//单元格内容的旋转的角度1.//先把读进来的图片放到一个ByteArrayOutputStream中,以便产生ByteArray2. ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();3. BufferedImage bufferImg = ImageIO.read(new File("ok.jpg"));4. ImageIO.write(bufferImg,"jpg",byteArrayOut);5.//读进一个excel模版6.FileInputStream fos = new FileInputStream(filePathName+"/stencil.xlt");7.fs = new POIFSFileSystem(fos);8.//创建一个工作薄9.HSSFWorkbook wb = new HSSFWorkbook(fs);10.HSSFSheet sheet = wb.getSheetAt(0);11.HSSFPatriarch patriarch = sheet.createDrawingPatriarch();12.HSSFClientAnchor anchor = new HSSFClientAnchor(0,0,1023,255,(short) 0,0,(short)10,10);13.patriarch.createPicture(anchor ,wb.addPicture(byteArrayOut.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG));1.HSSFWorkbook wb = new HSSFWorkbook();2.HSSFSheet sheet = wb.createSheet("format sheet");3.HSSFPrintSetup ps = sheet.getPrintSetup();4.sheet.setAutobreaks(true);5.ps.setFitHeight((short)1);6.ps.setFitWidth((short)1);1.HSSFSheet sheet = wb.createSheet("Sheet1");2.wb.setPrintArea(0, "$A$1:$C$2");1.HSSFSheet sheet = wb.createSheet("format sheet");2.HSSFFooter footer = sheet.getFooter()3.footer.setRight( "Page " + HSSFFooter.page() + " of " + HSSFFooter.numPages() );1.HSSFWorkbook wb = new HSSFWorkbook();2.HSSFSheet sheet = wb.createSheet("row sheet");3.// Create various cells and rows for spreadsheet.4.// Shift rows 6 - 11 on the spreadsheet to the top (rows 0 -5)5.sheet.shiftRows(5, 10, -5);20、选中指定的工作表view plaincopy to clipboardprint?1.HSSFSheet sheet = wb.createSheet("row sheet");2.heet.setSelected(true);1.HSSFSheet sheet1 = wb.createSheet("new sheet");2.sheet1.setZoom(1,2); // 50 percent magnification1.HSSFSheet sheet = wb.createSheet("new sheet");2.HSSFHeader header = sheet.getHeader();3.header.setCenter("Center Header");4.header.setLeft("Left Header");5.header.setRight(HSSFHeader.font("Stencil-Normal", "Italic") +6.HSSFHeader.fontSize((short) 16) + "Right w/ Stencil-Normal Italic font and size 16");1.HSSFCellStyle style = wb.createCellStyle();2.style.setFillForegroundColor(HSSFColor.LIME.index);3.style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);4.HSSFFont font = wb.createFont();5.font.setColor(HSSFColor.RED.index);6.style.setFont(font);7.cell.setCellStyle(style);1.HSSFCellStyle style = wb.createCellStyle();2.style.setFillBackgroundColor(HSSFColor.AQUA.index);3.style.setFillPattern(HSSFCellStyle.BIG_SPOTS);4.HSSFCell cell = row.createCell((short) 1);5.cell.setCellValue("X");6.style = wb.createCellStyle();7.style.setFillForegroundColor(HSSFColor.ORANGE.index);8.style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);9.cell.setCellStyle(style);1.HSSFFormulaEvaluator eval=new HSSFFormulaEvaluator((HSSFWorkbook) wb);2.private static void updateFormula(Workbook wb,Sheet s,int row){3. Row r=s.getRow(row);4. Cell c=null;5. FormulaEcaluator eval=null;6. if(wb instanceof HSSFWorkbook)7. eval=new HSSFFormulaEvaluator((HSSFWorkbook) wb);8. else if(wb instanceof XSSFWorkbook)9. eval=new XSSFFormulaEvaluator((XSSFWorkbook) wb);10. for(int i=r.getFirstCellNum();i<r.getlastcellnum();i++){< p="">11. c=r.getCell(i);12. if(c.getCellType()==Cell.CELL_TYPE_FORMULA)13. eval.evaluateFormulaCell(c);14. }15. }laCells(HSSFWorkbook wb) ,计算一个Excel文件的所有公式,用起来很方便。
HSSFworkbook,XSSFworkbook,SXSSFworkbook区别总结
HSSFworkbook,XSSFworkbook,SXSSFworkbook区别总结⽤JavaPOI导出Excel时,我们需要考虑到Excel版本及数据量的问题。
针对不同的Excel版本,要采⽤不同的⼯具类,如果使⽤错了,会出现错误信息。
JavaPOI导出Excel有三种形式,他们分别是1.HSSFWorkbook 2.XSSFWorkbook 3.SXSSFWorkbook。
HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls;XSSFWorkbook:是操作Excel2007后的版本,扩展名是.xlsx;SXSSFWorkbook:是操作Excel2007后的版本,扩展名是.xlsx;第⼀种:HSSFWorkbookpoi导出excel最常⽤的⽅式;但是此种⽅式的局限就是导出的⾏数⾄多为65535⾏,超出65536条后系统就会报错。
此⽅式因为⾏数不⾜七万⾏所以⼀般不会发⽣内存不⾜的情况(OOM)。
第⼆种:XSSFWorkbook这种形式的出现是为了突破HSSFWorkbook的65535⾏局限。
其对应的是excel2007(1048576⾏,16384列)扩展名为“.xlsx”,最多可以导出104万⾏,不过这样就伴随着⼀个问题---OOM内存溢出,原因是你所创建的book sheet row cell等此时是存在内存的并没有持久化。
第三种:SXSSFWorkbook从POI 3.8版本开始,提供了⼀种基于XSSF的低内存占⽤的SXSSF⽅式。
对于⼤型excel⽂件的创建,⼀个关键问题就是,要确保不会内存溢出。
其实,就算⽣成很⼩的excel(⽐如⼏Mb),它⽤掉的内存是远⼤于excel⽂件实际的size的。
如果单元格还有各种格式(⽐如,加粗,背景标红之类的),那它占⽤的内存就更多了。
对于⼤型excel的创建且不会内存溢出的,就只有SXSSFWorkbook了。
poi教程
poi教程Poi教程概述:Poi是一款Java库,用于处理Microsoft Office格式文件,如Excel、Word和PowerPoint。
它提供了丰富的API,使开发人员能够读取、写入和修改这些文件。
Poi教程内容:1. 安装Poi库:首先,你需要下载并安装Poi库。
你可以从Apache的官方网站上找到最新版本的Poi库。
安装过程包括将Poi库添加到你的Java项目的构建路径中。
2. 创建Excel文档:使用Poi,你可以创建一个新的Excel文档。
你可以定义工作表、行和单元格,并在单元格中添加数据。
你还可以设置单元格的格式,如字体、颜色和边框。
3. 读取Excel文件:Poi可以读取现有的Excel文件。
你可以打开一个文件并读取工作表、行和单元格中的数据。
你还可以根据需要筛选和处理数据。
4. 写入Excel文件:除了读取数据,Poi还可以将数据写入现有的Excel文件。
你可以创建新的工作表、行和单元格,并在其中插入数据。
你可以使用Poi的API来设置单元格的格式和其他属性。
5. 处理Word和PowerPoint文件:除了处理Excel文件,Poi还可以读取和写入Word和PowerPoint文件。
你可以打开Word文档并访问其中的段落、表格和其他元素。
你还可以修改PowerPoint演示文稿中的幻灯片、文本和图像。
6. 添加图表和图像:Poi提供了创建和修改图表的功能。
你可以使用Poi的API创建各种类型的图表,并在其中添加数据。
此外,你还可以在Excel文件中添加图像,并设置其大小、位置和其他属性。
7. 导出数据:一旦你完成了对Excel、Word或PowerPoint文件的处理,你可以使用Poi将其导出为其他格式,如PDF或HTML。
这使得你可以轻松地共享和打印处理过的文件。
8. 错误处理和异常处理:在使用Poi时,可能会遇到各种错误和异常。
你需要学会如何正确处理这些错误,以确保你的代码能够顺利运行。
Apache POI HSSF和XSSF读写EXCEL总结
Apache POI HSSF和XSSF读写EXCEL总结HSSF是指2007年以前的,XSSF是指2007年版本以上的这个还是比较好用的,这些总结来自Apache的官方向导的点点滴滴还有好多没有没有写的,详细的请参考/spreadsheet/quick-guide.html 还有LOG也比较好看Java代码public class SummaryHSSF {public static void main(String[] args) throws IOException {//创建Workbook对象(这一个对象代表着对应的一个Excel文件)//HSSFWorkbook表示以xls为后缀名的文件Workbook wb = new HSSFWorkbook();//获得CreationHelper对象,这个应该是一个帮助类CreationHelper helper = wb.getCreationHelper();//创建Sheet并给名字(表示Excel的一个Sheet)Sheet sheet1 = wb.createSheet("HSSF_Sheet_1");Sheet sheet2 = wb.createSheet("HSSF_Sheet_2");//Row表示一行Cell表示一列Row row = null;Cell cell = null;for(int i=0;i<60;i=i+2){//获得这个sheet的第i行row = sheet1.createRow(i);//设置行长度自动//row.setHeight((short)500);row.setHeightInPoints(20);//row.setZeroHeight(true);for(int j=0;j<25;j++){//设置每个sheet每一行的宽度,自动,根据需求自行确定sheet1.autoSizeColumn(j+1, true);//创建一个基本的样式CellStyle cellStyle = SummaryHSSF.createStyleCell(wb);//获得这一行的每j列cell = row.createCell(j);if(j==0){//设置文字在单元格里面的位置cellStyle = SummaryHSSF.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER,CellStyle.VERTICAL_CENTER);//先创建字体样式,并把这个样式加到单元格的字体里面cellStyle.setFont(createFonts(wb));//把这个样式加到单元格里面cell.setCellStyle(cellStyle);//给单元格设值cell.setCellValue(true);}else if(j==1){//设置文字在单元格里面的位置cellStyle = SummaryHSSF.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER);//设置这个样式的格式(Format)cellStyle = SummaryHSSF.setCellFormat(helper,cellStyle, "#,##0.0000");//先创建字体样式,并把这个样式加到单元格的字体里面cellStyle.setFont(createFonts(wb));//把这个样式加到单元格里面cell.setCellStyle(cellStyle);//给单元格设值cell.setCellValue(new Double(2008.2008));}else if(j==2){cellStyle = SummaryHSSF.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER);cellStyle.setFont(createFonts(wb));cell.setCellStyle(cellStyle);cell.setCellValue(helper.createRichTextString("RichString"+i+j));}else if(j==3){cellStyle = SummaryHSSF.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER);cellStyle = SummaryHSSF.setCellFormat(helper,cellStyle, "MM-yyyy-dd");cell.setCellStyle(cellStyle);cell.setCellValue(new Date());}else if(j==24){cellStyle = SummaryHSSF.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER);cellStyle.setFont(createFonts(wb));//设置公式cell.setCellFormula("SUM(E"+(i+1)+":X"+(i+1)+")");}else{cellStyle = SummaryHSSF.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER);cellStyle = SummaryHSSF.setFillBackgroundColors(cellStyle,IndexedColors.ORANGE.getIndex(),IndexedColor s.ORANGE.getIndex(),CellStyle.SOLID_FOREGROUND);cell.setCellStyle(cellStyle);cell.setCellValue(1);}}}//输出OutputStream os = new FileOutputStream(new File("c://SummaryHSSF.xls"));wb.write(os);os.close();}/*** 边框* @param wb* @return*/public static CellStyle createStyleCell(Workbook wb){CellStyle cellStyle = wb.createCellStyle();//设置一个单元格边框颜色cellStyle.setBorderBottom(CellStyle.BORDER_THIN);cellStyle.setBorderTop(CellStyle.BORDER_THIN);cellStyle.setBorderLeft(CellStyle.BORDER_THIN);cellStyle.setBorderRight(CellStyle.BORDER_THIN);//设置一个单元格边框颜色cellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());cellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());cellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());cellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());return cellStyle;}/*** 设置文字在单元格里面的位置* CellStyle.ALIGN_CENTER* CellStyle.VERTICAL_CENTER* @param cellStyle* @param halign* @param valign* @return*/public static CellStyle setCellStyleAlignment(CellStyle cellStyle,short halign,short valign){ //设置上下cellStyle.setAlignment(CellStyle.ALIGN_CENTER);//设置左右cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);return cellStyle;/*** 格式化单元格* 如#,##0.00,m/d/yy去HSSFDataFormat或XSSFDataFormat里面找* @param cellStyle* @param fmt* @return*/public static CellStyle setCellFormat(CreationHelper helper,CellStyle cellStyle,String fmt){ //还可以用其它方法创建formatcellStyle.setDataFormat(helper.createDataFormat().getFormat(fmt));return cellStyle;}/*** 前景和背景填充的着色* @param cellStyle* @param bg IndexedColors.ORANGE.getIndex();* @param fg IndexedColors.ORANGE.getIndex();* @param fp CellStyle.SOLID_FOREGROUND* @return*/public static CellStyle setFillBackgroundColors(CellStyle cellStyle,short bg,short fg,short fp){ //cellStyle.setFillBackgroundColor(bg);cellStyle.setFillForegroundColor(fg);cellStyle.setFillPattern(fp);return cellStyle;}/*** 设置字体* @param wb* @return*/public static Font createFonts(Workbook wb){//创建Font对象Font font = wb.createFont();//设置字体font.setFontName("黑体");//着色font.setColor(HSSFColor.BLUE.index);//斜体font.setItalic(true);//字体大小font.setFontHeight((short)300);return font;}public class SummaryHSSF {public static void main(String[] args) throws IOException {//创建Workbook对象(这一个对象代表着对应的一个Excel文件)//HSSFWorkbook表示以xls为后缀名的文件Workbook wb = new HSSFWorkbook();//获得CreationHelper对象,这个应该是一个帮助类CreationHelper helper = wb.getCreationHelper();//创建Sheet并给名字(表示Excel的一个Sheet)Sheet sheet1 = wb.createSheet("HSSF_Sheet_1");Sheet sheet2 = wb.createSheet("HSSF_Sheet_2");//Row表示一行Cell表示一列Row row = null;Cell cell = null;for(int i=0;i<60;i=i+2){//获得这个sheet的第i行row = sheet1.createRow(i);//设置行长度自动//row.setHeight((short)500);row.setHeightInPoints(20);//row.setZeroHeight(true);for(int j=0;j<25;j++){//设置每个sheet每一行的宽度,自动,根据需求自行确定sheet1.autoSizeColumn(j+1, true);//创建一个基本的样式CellStyle cellStyle = SummaryHSSF.createStyleCell(wb);//获得这一行的每j列cell = row.createCell(j);if(j==0){//设置文字在单元格里面的位置cellStyle = SummaryHSSF.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER);//先创建字体样式,并把这个样式加到单元格的字体里面cellStyle.setFont(createFonts(wb));//把这个样式加到单元格里面cell.setCellStyle(cellStyle);//给单元格设值cell.setCellValue(true);}else if(j==1){//设置文字在单元格里面的位置cellStyle = SummaryHSSF.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER,CellStyle.VERTICAL_CENTER);//设置这个样式的格式(Format)cellStyle = SummaryHSSF.setCellFormat(helper,cellStyle, "#,##0.0000");//先创建字体样式,并把这个样式加到单元格的字体里面cellStyle.setFont(createFonts(wb));//把这个样式加到单元格里面cell.setCellStyle(cellStyle);//给单元格设值cell.setCellValue(new Double(2008.2008));}else if(j==2){cellStyle = SummaryHSSF.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER);cellStyle.setFont(createFonts(wb));cell.setCellStyle(cellStyle);cell.setCellValue(helper.createRichTextString("RichString"+i+j));}else if(j==3){cellStyle = SummaryHSSF.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER);cellStyle = SummaryHSSF.setCellFormat(helper,cellStyle, "MM-yyyy-dd");cell.setCellStyle(cellStyle);cell.setCellValue(new Date());}else if(j==24){cellStyle = SummaryHSSF.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER);cellStyle.setFont(createFonts(wb));//设置公式cell.setCellFormula("SUM(E"+(i+1)+":X"+(i+1)+")");}else{cellStyle = SummaryHSSF.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER);cellStyle = SummaryHSSF.setFillBackgroundColors(cellStyle,IndexedColors.ORANGE.getIndex(),IndexedColor s.ORANGE.getIndex(),CellStyle.SOLID_FOREGROUND);cell.setCellStyle(cellStyle);cell.setCellValue(1);}}}//输出OutputStream os = new FileOutputStream(new File("c://SummaryHSSF.xls"));wb.write(os);os.close();}/*** 边框* @param wb* @return*/public static CellStyle createStyleCell(Workbook wb){CellStyle cellStyle = wb.createCellStyle();//设置一个单元格边框颜色cellStyle.setBorderBottom(CellStyle.BORDER_THIN);cellStyle.setBorderTop(CellStyle.BORDER_THIN);cellStyle.setBorderLeft(CellStyle.BORDER_THIN);cellStyle.setBorderRight(CellStyle.BORDER_THIN);//设置一个单元格边框颜色cellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());cellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());cellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());cellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());return cellStyle;}/*** 设置文字在单元格里面的位置* CellStyle.ALIGN_CENTER* CellStyle.VERTICAL_CENTER* @param cellStyle* @param halign* @param valign* @return*/public static CellStyle setCellStyleAlignment(CellStyle cellStyle,short halign,short valign){ //设置上下cellStyle.setAlignment(CellStyle.ALIGN_CENTER);//设置左右cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);return cellStyle;}/*** 格式化单元格* 如#,##0.00,m/d/yy去HSSFDataFormat或XSSFDataFormat里面找* @param cellStyle* @param fmt* @return*/public static CellStyle setCellFormat(CreationHelper helper,CellStyle cellStyle,String fmt){ //还可以用其它方法创建formatcellStyle.setDataFormat(helper.createDataFormat().getFormat(fmt));return cellStyle;}/*** 前景和背景填充的着色* @param cellStyle* @param bg IndexedColors.ORANGE.getIndex();* @param fg IndexedColors.ORANGE.getIndex();* @param fp CellStyle.SOLID_FOREGROUND* @return*/public static CellStyle setFillBackgroundColors(CellStyle cellStyle,short bg,short fg,short fp){ //cellStyle.setFillBackgroundColor(bg);cellStyle.setFillForegroundColor(fg);cellStyle.setFillPattern(fp);return cellStyle;}/*** 设置字体* @param wb* @return*/public static Font createFonts(Workbook wb){//创建Font对象Font font = wb.createFont();//设置字体font.setFontName("黑体");//着色font.setColor(HSSFColor.BLUE.index);//斜体font.setItalic(true);//字体大小font.setFontHeight((short)300);return font;}}读取Excel文件Java代码public class ReadExcel {public static void main(String[] args) throws Exception {InputStream is = new FileInputStream(new File("c://SummaryHSSF.xls"));//根据输入流创建Workbook对象Workbook wb = WorkbookFactory.create(is);//get到Sheet对象Sheet sheet = wb.getSheetAt(0);//这个必须用接口for(Row row : sheet){for(Cell cell : row){//cell.getCellType是获得cell里面保存的值的type//如Cell.CELL_TYPE_STRINGswitch(cell.getCellType()){case Cell.CELL_TYPE_BOOLEAN://得到Boolean对象的方法System.out.print(cell.getBooleanCellValue()+" ");break;case Cell.CELL_TYPE_NUMERIC://先看是否是日期格式if(DateUtil.isCellDateFormatted(cell)){//读取日期格式System.out.print(cell.getDateCellValue()+" ");}else{//读取数字System.out.print(cell.getNumericCellValue()+" ");}break;case Cell.CELL_TYPE_FORMULA://读取公式System.out.print(cell.getCellFormula()+" ");break;case Cell.CELL_TYPE_STRING://读取StringSystem.out.print(cell.getRichStringCellValue().toString()+" ");break;}}System.out.println("");}}}public class ReadExcel {public static void main(String[] args) throws Exception {InputStream is = new FileInputStream(new File("c://SummaryHSSF.xls")); //根据输入流创建Workbook对象Workbook wb = WorkbookFactory.create(is);//get到Sheet对象Sheet sheet = wb.getSheetAt(0);//这个必须用接口for(Row row : sheet){for(Cell cell : row){//cell.getCellType是获得cell里面保存的值的type//如Cell.CELL_TYPE_STRINGswitch(cell.getCellType()){case Cell.CELL_TYPE_BOOLEAN://得到Boolean对象的方法System.out.print(cell.getBooleanCellValue()+" ");break;case Cell.CELL_TYPE_NUMERIC://先看是否是日期格式if(DateUtil.isCellDateFormatted(cell)){//读取日期格式System.out.print(cell.getDateCellValue()+" ");}else{//读取数字System.out.print(cell.getNumericCellValue()+" ");}break;case Cell.CELL_TYPE_FORMULA://读取公式System.out.print(cell.getCellFormula()+" ");break;case Cell.CELL_TYPE_STRING://读取StringSystem.out.print(cell.getRichStringCellValue().toString()+" "); break;}}System.out.println("");}}}还有一种传统的读法Java代码Sheet sheet = wb.getSheetAt(0);for (Iterator rit = sheet.rowIterator(); rit.hasNext(); ) {Row row = (Row)rit.next();for (Iterator cit = row.cellIterator(); cit.hasNext(); ) {Cell cell = (Cell)cit.next();// Do something here}}HSSFSheet sheet = wb.getSheetAt(0);for (Iterator<HSSFRow> rit = (Iterator<HSSFRow>)sheet.rowIterator(); rit.hasNext(); ) { HSSFRow row = rit.next();for (Iterator<HSSFCell> cit = (Iterator<HSSFCell>)row.cellIterator(); cit.hasNext(); ) { HSSFCell cell = cit.next();// Do something here}}Sheet sheet = wb.getSheetAt(0);for (Iterator rit = sheet.rowIterator(); rit.hasNext(); ) {Row row = (Row)rit.next();for (Iterator cit = row.cellIterator(); cit.hasNext(); ) {Cell cell = (Cell)cit.next();// Do something here}}HSSFSheet sheet = wb.getSheetAt(0);for (Iterator<HSSFRow> rit = (Iterator<HSSFRow>)sheet.rowIterator(); rit.hasNext(); ) { HSSFRow row = rit.next();for (Iterator<HSSFCell> cit = (Iterator<HSSFCell>)row.cellIterator(); cit.hasNext(); ) { HSSFCell cell = cit.next();// Do something here}}。
最直观的poi的使用帮助(告诉你怎么使用poi的官网),操作word,excel,ppt
最直观的poi的使⽤帮助(告诉你怎么使⽤poi的官⽹),操作
word,excel,ppt
最直观的poi的使⽤帮助(告诉你怎么使⽤poi的官⽹),poi操作word,excel,ppt
写在最前⾯
其实poi的官⽹上⾯有poi的各种类和接⼝的使⽤说明,还有⾮常详细的样例,所以照着这些样例来进⾏poi的开发会变得很容易。
就是excel的帮助⽂档,每⼀个链接都是⼀个实例。
说明
官⽹的Conponents APIs就告诉我们操作office的每⼀种⽂件需要的组件。
⽐如说word就需要HWPF(⽤来操作word2003,后缀为.doc)和XWPF(⽤来操作word2007,后缀为.docx)
Conponent Map⾥⾯就有每⼀个版块所属的jar包,⽐如HWPF组件的jar包就是poi-scratchpad。
我们来看下载好的(如何下载后⾯会说)poi-3.17包,根据上⾯的所属关系,我们可以轻松知道HWPF组件要⽤到poi-3.17.jar包,⽽XHPF 要⽤到poi-ooxml-3.17.jar包。
下载
现在最新的poi的版本为poi-bin-3.17-20170915,我们就⽤这个说明
把我们要的poi-bin-3.17-20170915.zip jar包下载下来就好。
实例
下⾯我们来到官⽹找到操作word的两个组件HWPF和XWPF的操作样例
我们以HWPF的Quick Guide页⾯来做说明
从这个页⾯的最右下⾓箭头指向的位置点下去,就会得到样例界⾯
为了⽅便读者,直接把这个链接的传送门弄下来:
到这个界⾯就可以⾃⼰去找⾃⼰喜欢的实例了。
java_POI教程
java_POI教程
POI(Poor Obfuscation Implementation)是一个Apache基金会下
的开源项目,全称为Apache POI,提供了Java程序操作Office文档的
功能。
其中最常用的组件为POI.HSSF用于操作Excel文档、POI.XSSF用
于操作Excel 2024及以上版本的文档、POI.HSLF用于操作PowerPoint
文档以及POI.XSLF用于操作PowerPoint 2024及以上版本的文档。
1. Excel文档操作
2. Excel图表生成
POI.HSSF也支持在Excel文档中生成各种图表。
可以通过Sheet对
象的createDrawingPatriarch(方法创建绘图对象,并使用绘图对象的createChart(方法创建图表。
通过图表对象可以设置图表的标题、图例、
数据源等属性,并使用createData(方法创建数据区域,再使用setDataFormula(方法设置数据源等。
3. PowerPoint文档操作
4. Word文档操作
以上是POI的基本使用方法和常见功能的简要介绍。
实际使用POI时,还可以通过POI提供的API进行更加复杂的操作,例如合并单元格、设置
样式、添加图片等。
此外,POI还支持读写不同格式的Office文档,
如.xlsx、pptx和.docx等。
POI操作excel大全
POI操作excel大全第一讲:基本的Excel读写本文主要演示一下POI的基本操作,例如怎样读取和创建一个具体的Excel文件。
按照惯例,拿HelloWorld说事儿。
说明:本文主要内容皆包含于官方帮助手册,之所以要拿出来,出于两个原因,手册是英文的+手册是对应2.5.1的。
核心代码如下,注释部分为讲解。
这里只挑干的讲,完整的代码请参考(下载代码)。
//创建一个空白的WorkBook HSSFWorkbook wb = new HSSFWorkbook(); //基于上面的WorkBook创建属于此WorkBook 的Sheet, //3.0.1版在使用全角Sheet名的时候不必再setEncdoing了,个人感觉方便了许多。
H SSFSheet st = wb.createSheet(“测试页“); //创建属于上面Sheet的Row,参数0可以是0~65535之间的任何一个, //注意,尽管参数是Int类型,但是Excel最多支持65536行 HSSFRow row = st.createRow(0); //创建属于上面Row的Cell,参数0可以是0~255之间的任何一个, //同样,是因为Excel最大支持的列数为256列 HSSFCell cell = row.createCell((short)0); //设置此单元格的格式为文本,此句可以省略,Excel会自动识别。
//其他还有几种常用的格式,请参考本文底部的补充部分。
c ell.setCellType(HSSFCell.CELL_TYPE_STRING); //此处是3.0.1版的改进之处,上一版可以直接setCellValue(“Hello, World!“), //但是在3.0.1里,被deprecated了。
c ell.setCellValue(new HSSFRichTextString(“Hello, World!“)); //创建一个文件输出流,指定到C盘根目录下(C盘都有吧?) //xls是Excel97-2003的标准扩展名,xx是xlsx,目前的POI能直接生产的还是xls格式, //如果此处把扩展名改成xlsx,在用Excelxx打开此文件时会报错。
关于poi导出excel三种方式HSSFWorkbook,SXSSFWorkbook,csv的总结
关于poi导出excel三种⽅式HSSFWorkbook,SXSSFWorkbook,csv的总结poi导出excel最常⽤的是第⼀种⽅式HSSFWorkbook,不过这种⽅式数据量⼤的话会产⽣内存溢出问题,SXSSFWorkbook是⼀种⼤数据量导出格式,csv是另⼀种excel导出的⼀种轻快的实现。
先介绍⼀下这三种格式的特点1 HSSFWorkbook excel⽂件底层是txt实现,我们经常见到的excel都是这种实现的。
2 SXSSFWorkbook excel⽂件底层是xml实现,同样的数据量,⼤约是第⼀种的1/6-1/4之间3 csv 这个⽐较新潮,数据量应该更⼩,可以百度。
⼀ HSSFWorkbook 实现Map<String, Object> dataMap = service.AssignMiddleExcel(page);ObjectExcelView erv = new ObjectExcelView("逾期客户表"); //执⾏excel操作mv = new ModelAndView(erv,dataMap);dataMap 是个map ,包含两个键值对⼀个是标题列Map<String,Object> dataMap = new HashMap<String,Object>();List<String> titles = new ArrayList<String>();titles.add("借款⼈姓名"); //1titles.add("⾝份证号"); //2titles.add("借款⼈⼿机号");dataMap.put("titles", titles);这是标题列vpd是个mapvpd.put("var1", userList.get(i).getString("realName")); //1vpd.put("var2", userList.get(i).getString("contIdCard")); //2vpd.put("var3", userList.get(i).getString("telephone")); //3List<PageData> varList = new ArrayList<PageData>();PageData就是个HashMapvarList.add(vpd);dataMap.put("varList", varList);这就是dataMap的由来public class ObjectExcelView extends AbstractExcelView{private String fileName;public ObjectExcelView(){}public ObjectExcelView(String fileName){this.fileName = fileName;}@Overrideprotected void buildExcelDocument(Map<String, Object> model,HSSFWorkbook workbook, HttpServletRequest request,HttpServletResponse response) throws Exception {// TODO Auto-generated method stub//String fileName = "逾期客户表-待催收";HSSFSheet sheet;HSSFCell cell;response.setContentType("application/x-download");//下⾯三⾏是关键代码,处理乱码问题response.setCharacterEncoding("utf-8");response.setHeader("Content-Disposition", "attachment;filename="+new String(fileName.getBytes("gbk"), "iso8859-1")+".xls");sheet = workbook.createSheet("sheet1");List<String> titles = (List<String>) model.get("titles");int len = titles.size();HSSFCellStyle headerStyle = workbook.createCellStyle(); //标题样式headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);headerStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);HSSFFont headerFont = workbook.createFont(); //标题字体headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);headerFont.setFontHeightInPoints((short)11);headerStyle.setFont(headerFont);short width = 20,height=25*20;sheet.setDefaultColumnWidth(width);for(int i=0; i<len; i++){ //设置标题String title = titles.get(i);cell = getCell(sheet, 0, i);cell.setCellStyle(headerStyle);setText(cell,title);}sheet.getRow(0).setHeight(height);HSSFCellStyle contentStyle = workbook.createCellStyle(); //内容样式contentStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);List<PageData> varList = (List<PageData>) model.get("varList");int varCount = varList.size();for(int i=0; i<varCount; i++){PageData vpd = varList.get(i);for(int j=0;j<len;j++){String varstr = vpd.getString("var"+(j+1)) != null ? vpd.getString("var"+(j+1)) : "";cell = getCell(sheet, i+1, j);cell.setCellStyle(contentStyle);setText(cell,varstr);}}}}⼆ SXSSFWorkbook@RequestMapping("/excel111")public Object exportExcel(Page page,HttpServletRequest request,HttpServletResponse response){ PageData pd = new PageData();pd = this.getPageData();try{//检索条件===========PageData pageData = service.setPdWithTrim(this.getPageData());page.setPd(pageData);//检索条件===========Map<String, Object> dataMap = service.AssignMiddleExcel(page);OutputStream outputStream = response.getOutputStream();String sheetName = "逾期客户表";List<String> list = (List<String>)dataMap.get("titles");String[] headers = new String[list.size()];for(int i = 0;i<list.size();i++){headers[i]=list.get(i);}List<Object[]> dataList = new ArrayList<>();List<PageData> varList = new ArrayList<PageData>();varList = (List<PageData>)dataMap.get("varList");varList.forEach(e ->{List<Object> ObjectList = new ArrayList<>();for(int i=0;i<headers.length;i++){ObjectList.add(e.get("var"+(i+1))==null?null:e.getString("var"+(i+1)));}/* for (Object v : e.values()) {ObjectList.add(v);}*/Object[] objarr = new Object[ObjectList.size()];for(int i = 0;i<ObjectList.size();i++){objarr[i] = ObjectList.get(i);}dataList.add(objarr);});ExportUtil exportUtil = new ExportUtil(sheetName,headers,dataList);//SXSSFWorkbook ⼤批量数据导出SXSSFWorkbook workBook = exportUtil.export();// 如果⽂件名有中⽂,必须URL编码String fileName1 = URLEncoder.encode(sheetName, "UTF-8");// response.reset();// response.setContentType("application/force-download");response.setContentType("application/vnd.ms-excel");response.setHeader("Content-Disposition", "attachment; filename=" + fileName1+".xls");workBook.write(outputStream);workBook.close();outputStream.flush();outputStream.close();//ObjectExcelView erv = new ObjectExcelView("逾期客户表"); //执⾏excel操作//mv = new ModelAndView(erv,dataMap);} catch(Exception e){logger.error(e.toString(), e);}return new Object();}package com.fh.controller.assign_out;import java.util.ArrayList;import java.util.List;import ermodel.HSSFCell;import ermodel.HSSFCellStyle;import ermodel.HSSFFont;import ermodel.HSSFRichTextString;import org.apache.poi.hssf.util.HSSFColor;import ermodel.Cell;import ermodel.CellStyle;import ermodel.Font;import ermodel.Row;import ermodel.Sheet;import org.apache.poi.ss.util.CellRangeAddress;import org.apache.poi.xssf.streaming.SXSSFCell;import org.apache.poi.xssf.streaming.SXSSFRow;import org.apache.poi.xssf.streaming.SXSSFWorkbook;import ermodel.XSSFCellStyle;import ermodel.XSSFFont;import org.springframework.util.StringUtils;/*** Created by dell、 on 2017/10/12.*/public class ExportUtil {private SXSSFWorkbook wb = null;//⼤数据导出格式private Sheet sheet = null;private String sheetName;private String[] headers;//表头字段private List<Object[]> dataList = new ArrayList<Object[]>();//表内容数据//构造public ExportUtil(SXSSFWorkbook wb, Sheet sheet) {this.wb = wb;this.sheet = sheet;}//构造public ExportUtil(String sheetName, String[] headers, List<Object[]> dataList) { this.dataList = dataList;this.headers = headers;this.sheetName = sheetName;}//不知道做什么public void setRegionStyle(CellRangeAddress region, XSSFCellStyle cs) {int toprowNum = region.getFirstRow();for (int i = toprowNum; i <= region.getLastRow(); i++) {SXSSFRow row = (SXSSFRow) sheet.getRow(i);for (int j = region.getFirstColumn(); j <= region.getLastColumn(); j++) {SXSSFCell cell = (SXSSFCell) row.getCell(j);cell.setCellStyle(cs);}}}// 设置表头的单元格样式public CellStyle getHeadStyle() {// 创建单元格样式CellStyle cellStyle = wb.createCellStyle();// 设置单元格的背景颜⾊为淡蓝⾊cellStyle.setFillForegroundColor(HSSFColor.PALE_BLUE.index);// 设置填充字体的样式cellStyle.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);// 设置单元格居中对齐cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);// 设置单元格垂直居中对齐cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);// 创建单元格内容显⽰不下时⾃动换⾏cellStyle.setWrapText(false);// 设置单元格字体样式XSSFFont font = (XSSFFont) wb.createFont();// font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);// 这是字体加粗font.setFontName("宋体");// 设置字体的样式font.setFontHeight(14);// 设置字体的⼤⼩cellStyle.setFont(font);// 将字体填充到表格中去// 设置单元格边框为细线条(上下左右)cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);return cellStyle;}// 设置表体的单元格样式public CellStyle getBodyStyle() {// 创建单元格样式CellStyle cellStyle = wb.createCellStyle();// 设置单元格居中对齐cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);// 设置单元格居中对齐cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);// 创建单元格内容不显⽰⾃动换⾏cellStyle.setWrapText(false);// 设置单元格字体样式XSSFFont font = (XSSFFont) wb.createFont();font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);// 这是字体加粗font.setFontName("宋体");// 设置字体font.setFontHeight(12);// 设置字体的⼤⼩cellStyle.setFont(font);// 将字体添加到表格中去// 设置单元格边框为细线条cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);return cellStyle;}//似乎没⽤到public Cell setHeadStyle(String[] titles) {Cell cell = null;CellStyle headStyle = getHeadStyle();Row headRow = sheet.createRow(0);// 构建表头for (int i = 0; i < titles.length; i++) {cell = headRow.createCell(i);cell.setCellStyle(headStyle);cell.setCellValue(titles[i]);}return cell;}/** 导出数据*/public SXSSFWorkbook export() throws Exception {// String nsheetName = new String(sheetName.getBytes("UTF-8"));/** response.setCharacterEncoding("utf-8");* response.setContentType("application/x-msdownload");* response.setHeader("Content-disposition", "attachment; filename=" +* sheetName + ".xlsx");// 组装附件名称和格式*/Integer rowaccess = 1000;// 内存中缓存记录⾏数,以免内存溢出SXSSFWorkbook workbook = new SXSSFWorkbook(rowaccess);try {Sheet sheet = workbook.createSheet(sheetName);// 产⽣表格标题⾏Row titleRow = sheet.createRow(0);Cell cellTiltle = titleRow.createCell(0);CellStyle columnTopStyle = this.getColumnTopStyle(workbook);// 获取列头样式对象 sheet.setDefaultColumnWidth(100);sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, (headers.length - 1)));cellTiltle.setCellStyle(columnTopStyle);cellTiltle.setCellValue(sheetName);Cell cell = null;CellStyle headStyle = this.getHeadStyle(workbook);// 定义所需列数int columnNum = headers.length;Row headRow = sheet.createRow(2); // 在索引2的位置创建⾏(最顶端的⾏开始的第⼆⾏)//表头for (int n = 0; n < columnNum; n++) {Cell cellRowName = headRow.createCell(n); // 创建列头对应个数的单元格cellRowName.setCellType(HSSFCell.CELL_TYPE_STRING); // 设置列头单元格的数据类型 HSSFRichTextString text = new HSSFRichTextString(headers[n]);cellRowName.setCellValue(headers[n]); // 设置列头单元格的值cellRowName.setCellStyle(headStyle); // 设置列头单元格样式sheet.setColumnWidth(n,256*20);}CellStyle bodyStyle = this.getBodyStyle(workbook);// 表体数据for (int i = 0; i < dataList.size(); i++) {Object[] obj = dataList.get(i);Row row = sheet.createRow(i + 3);// 创建所需的⾏数for (int j = 0; j < obj.length; j++) {cell = row.createCell(j);String str = String.valueOf(StringUtils.isEmpty(obj[j]) ? "" : obj[j]);cell.setCellValue(str); // 单元格的值cell.setCellStyle(bodyStyle); // 单元格的样式}}} catch (Exception e) {e.printStackTrace();}return workbook;}// 设置表头的单元格样式public CellStyle getHeadStyle(SXSSFWorkbook workbook) {// 创建单元格样式CellStyle cellStyle = workbook.createCellStyle();// 设置单元格的背景颜⾊为淡蓝⾊cellStyle.setFillForegroundColor(HSSFColor.PALE_BLUE.index);// 设置填充字体的样式cellStyle.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);// 设置单元格居中对齐cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);// 设置单元格垂直居中对齐cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);// cellStyle.setShrinkToFit(true);// 创建单元格内容显⽰不下时⾃动换⾏//cellStyle.setWrapText(true);// 设置单元格字体样式XSSFFont font = (XSSFFont) workbook.createFont();// font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);// 这是字体加粗font.setFontName("宋体");// 设置字体的样式font.setFontHeight(12);// 设置字体的⼤⼩cellStyle.setFont(font);// 将字体填充到表格中去// 设置单元格边框为细线条(上下左右)cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);return cellStyle;}// 设置表体的单元格样式public CellStyle getBodyStyle(SXSSFWorkbook workbook) {// 创建单元格样式CellStyle cellStyle = workbook.createCellStyle();// 设置单元格居中对齐cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);// 设置单元格居中对齐cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);// 创建单元格内容不显⽰⾃动换⾏//cellStyle.setWrapText(true);// 设置单元格字体样式XSSFFont font = (XSSFFont) workbook.createFont();// font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);// 这是字体加粗 font.setFontName("宋体");// 设置字体font.setFontHeight(10);// 设置字体的⼤⼩cellStyle.setFont(font);// 将字体添加到表格中去// 设置单元格边框为细线条cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);return cellStyle;}public Cell setHeadStyle(String[] titles, SXSSFWorkbook workbook) {Cell cell = null;CellStyle headStyle = getHeadStyle(workbook);Row headRow = sheet.createRow(0);// 构建表头for (int i = 0; i < titles.length; i++) {cell = headRow.createCell(i);cell.setCellStyle(headStyle);cell.setCellValue(titles[i]);}return cell;}/** 列头单元格样式*/public CellStyle getColumnTopStyle(SXSSFWorkbook workbook) {// 设置字体Font font = workbook.createFont();// 设置字体⼤⼩font.setFontHeightInPoints((short) 18);// 字体加粗font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 设置字体名字font.setFontName("Courier New");// 设置样式;CellStyle style = workbook.createCellStyle();// 设置底边框;style.setBorderBottom(HSSFCellStyle.BORDER_THIN);// 设置底边框颜⾊;style.setBottomBorderColor(HSSFColor.BLACK.index);// 设置左边框;style.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 设置左边框颜⾊;style.setLeftBorderColor(HSSFColor.BLACK.index);// 设置右边框;style.setBorderRight(HSSFCellStyle.BORDER_THIN);// 设置右边框颜⾊;style.setRightBorderColor(HSSFColor.BLACK.index);// 设置顶边框;style.setBorderTop(HSSFCellStyle.BORDER_THIN);// 设置顶边框颜⾊;style.setTopBorderColor(HSSFColor.BLACK.index);// 在样式⽤应⽤设置的字体;style.setFont(font);// 设置⾃动换⾏;style.setWrapText(false);// 设置⽔平对齐的样式为居中对齐;style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 设置垂直对齐的样式为居中对齐;style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);return style;}}三 csv/** 导出委外催收中EXCEL ⼤数据量csv导出* @return*/@RequestMapping("/excel")public Object exportExcel111(Page page, HttpServletResponse response ) {PageData pd = new PageData();pd = this.getPageData();try {//检索条件===========PageData pageData = service.setPdWithTrim(this.getPageData());page.setPd(pageData);//检索条件===========Map<String, Object> dataMap = service.AssignMiddleExcel(page);String sheetName = "逾期客户表";List<Object> headlist = (List<Object>)dataMap.get("titles");List<List<Object>> dataList = new ArrayList<>();List<PageData> varList = new ArrayList<PageData>();varList = (List<PageData>)dataMap.get("varList");varList.forEach(e ->{List<Object> ObjectList = new ArrayList<>();for(int i=0;i<headlist.size();i++){ObjectList.add(e.get("var"+(i+1))==null?null:e.getString("var"+(i+1)));}dataList.add(ObjectList);});File csvFile =CSVUtils.createCSVFile(headlist,dataList,sheetName);BufferedInputStream bis = null;BufferedOutputStream bos = null;response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(csvFile.getName(), "UTF-8")); response.setHeader("Content-Length", String.valueOf(csvFile.length()));bis = new BufferedInputStream(new FileInputStream(csvFile));bos = new BufferedOutputStream(response.getOutputStream());byte[] buff = new byte[2048];while (true) {int bytesRead;if (-1 == (bytesRead = bis.read(buff, 0, buff.length))) break;bos.write(buff, 0, bytesRead);}bis.close();bos.close();csvFile.delete();}catch (Exception e){e.printStackTrace();}return new Object();}package com.fh.controller.assign_out;import javax.servlet.http.HttpServletRequest;import java.io.*;import java.util.*;/*** Created by dell、 on 2017/10/12.*/public class CSVUtils {/*** CSV⽂件⽣成⽅法* @param head* @param dataList* @param filename* @return*/public static File createCSVFile(List<Object> head, List<List<Object>> dataList,String filename) {File csvFile = null;BufferedWriter csvWtriter = null;try {csvFile = new File( "temp123/"+ File.separator + filename + ".csv");File parent = csvFile.getParentFile();if (parent != null && !parent.exists()) {parent.mkdirs();}csvFile.createNewFile();// GB2312使正确读取分隔符","csvWtriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(csvFile), "GB2312"), 1024);// 写⼊⽂件头部writeRow(head, csvWtriter);// 写⼊⽂件内容for (List<Object> row : dataList) {writeRow(row, csvWtriter);}csvWtriter.flush();} catch (Exception e) {e.printStackTrace();} finally {try {csvWtriter.close();} catch (IOException e) {e.printStackTrace();}}return csvFile;}/*** 写⼀⾏数据⽅法* @param row* @param csvWriter* @throws IOException*/private static void writeRow(List<Object> row, BufferedWriter csvWriter) throws IOException { // 写⼊⽂件头部for (Object data : row) {StringBuffer sb = new StringBuffer();String rowStr = sb.append("\"").append(data).append("\",").toString();csvWriter.write(rowStr);}csvWriter.newLine();}public static File createCSVFile(HttpServletRequest request){List< Map<String,Object>> list = new ArrayList<>();for(int i =0;i<10;i++){Map<String,Object> mao = new HashMap<>();mao.put("cutomerName","zhangsan"+i);mao.put("cutomerNam1","zhangsan"+i);mao.put("cutomerNam2","zhangsan"+i);mao.put("cutomerNam3","zhangsan"+i);mao.put("cutomerNam4","zhangsan"+i);mao.put("cutomerNam5","zhangsan"+i);mao.put("cutomerNam6","zhangsan"+i);mao.put("cutomerNam7","zhangsan"+i);mao.put("cutomerNam8","zhangsan"+i);mao.put("cutomerNam9", "2017-10-17 22:33:33 12.00");mao.put("cutomerNam10",555555556);/* mao.put("cutomerNam11","zhangsan"+i);mao.put("cutomerNam12","zhangsan"+i);mao.put("cutomerNam13","zhangsan"+i);mao.put("cutomerNam14","zhangsan"+i);mao.put("cutomerNam15","zhangsan"+i);mao.put("cutomerNam16","zhangsan"+i);mao.put("cutomerNam17","zhangsan"+i);mao.put("cutomerNam18","zhangsan"+i);mao.put("cutomerNam19","zhangsan"+i);mao.put("cutomerNam20","zhangsan"+i);mao.put("cutomerNam21","zhangsan"+i);mao.put("cutomerNam22","zhangsan"+i);mao.put("cutomerNam23","zhangsan"+i);mao.put("cutomerNam24","zhangsan"+i);mao.put("cutomerNam25","zhangsan"+i);mao.put("cutomerNam26","zhangsan"+i);mao.put("cutomerNam27","zhangsan"+i);mao.put("cutomerNam28","zhangsan"+i);mao.put("cutomerNam29","zhangsan"+i);mao.put("cutomerNam30","zhangsan"+i);mao.put("cutomerNam31","zhangsan"+i);mao.put("cutomerNam32","zhangsan"+i);mao.put("cutomerNam33","zhangsan"+i);mao.put("cutomerNam34","zhangsan"+i);mao.put("cutomerNam35","zhangsan"+i);mao.put("cutomerNam36","zhangsan"+i);mao.put("cutomerNam37","zhangsan"+i);mao.put("cutomerNam38","zhangsan"+i);mao.put("cutomerNam39","zhangsan"+i);mao.put("cutomerNam40","zhangsan"+i);mao.put("cutomerNam41","zhangsan"+i);mao.put("cutomerNam42","zhangsan"+i);mao.put("cutomerNam43","zhangsan"+i);mao.put("cutomerNam44","zhangsan"+i);mao.put("cutomerNam45","zhangsan"+i);*/list.add(mao);}// 设置表格头Object[] head = {"客户姓名", "证件类型", "证件号码", "银⾏账号", "理财账号", "客户类型", "风险等级", "归属状况", "归属机构", "客户经理", "营销⽐例(%)" }; List<Object> headList = Arrays.asList(head);// 设置数据List<List<Object>> dataList = new ArrayList<List<Object>>();List<Object> rowList = null;for (int i = 0; i < list.size(); i++) {rowList = new ArrayList<Object>();Map<String,Object> maovo = list.get(i);rowList.add(maovo.get("cutomerName"));rowList.add(maovo.get("cutomerNam1"));rowList.add(maovo.get("cutomerNam2"));rowList.add(maovo.get("cutomerNam3"));rowList.add(maovo.get("cutomerNam4"));rowList.add(maovo.get("cutomerNam5"));rowList.add(maovo.get("cutomerNam6"));rowList.add(maovo.get("cutomerNam7"));rowList.add(maovo.get("cutomerNam8"));rowList.add(maovo.get("cutomerNam9"));rowList.add(maovo.get("cutomerNam10"));dataList.add(rowList);}// 导出⽂件路径// String downloadFilePath = request.getContextPath();// 导出⽂件名称String fileName = "客户列表_";// 导出CSV⽂件File csvFile = CSVUtils.createCSVFile(headList, dataList, fileName);return csvFile;}}。
POI操作Excel
POI操作Excel⼀、POI概述 Apache POI是Apache软件基⾦会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
结构:HSSF -提供读写Microsoft Excel格式档案的功能。
XSSF -提供读写Microsoft Excel OOXML格式档案的功能。
HWPF -提供读写Microsoft Word格式档案的功能。
HSLF -提供读写Microsoft PowerPoint格式档案的功能。
HDGF -提供读写Microsoft Visio格式档案的功能。
使⽤必须引⼊依赖<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></dependency> 注:3.17版本是⽀持jdk6的最后版本⼆、HSSF概况 HSSF 是Horrible SpreadSheet Format的缩写,通过HSSF,你可以⽤纯Java代码来读取、写⼊、修改Excel⽂件。
HSSF 为读取操作提供了两类API:usermodel和eventusermodel,即“⽤户模型”和“事件-⽤户模型”。
三、 POI EXCEL⽂档结构类HSSFWorkbook excel⽂档对象HSSFSheet excel的sheetHSSFRow excel的⾏HSSFCell excel的单元格HSSFFont excel字体HSSFName 名称HSSFDataFormat ⽇期格式HSSFHeader sheet头HSSFFooter sheet尾HSSFCellStyle cell样式HSSFDateUtil ⽇期HSSFPrintSetup 打印HSSFErrorConstants 错误信息表四、EXCEL的读写操作1、读取“区域数据.xls”并储存于list集合中,“区域数据.xls”如下图1public List<Area> importXLS(){23 ArrayList<Area> list = new ArrayList<>();4try {5 //1、获取⽂件输⼊流6 InputStream inputStream = new FileInputStream("/Users/Shared/区域数据.xls");7 //2、获取Excel⼯作簿对象8 HSSFWorkbook workbook = new HSSFWorkbook(inputStream);9 //3、得到Excel⼯作表对象10 HSSFSheet sheetAt = workbook.getSheetAt(0);11//4、循环读取表格数据12 for (Row row : sheetAt) {13 //⾸⾏(即表头)不读取14if (row.getRowNum() == 0) {15continue;16 }17//读取当前⾏中单元格数据,索引从0开始18 String areaNum = row.getCell(0).getStringCellValue();19 String province = row.getCell(1).getStringCellValue();20 String city = row.getCell(2).getStringCellValue();21 String district = row.getCell(3).getStringCellValue();22 String postcode = row.getCell(4).getStringCellValue();2324 Area area = new Area();25 area.setCity(city);26 area.setDistrict(district);27 area.setProvince(province);28 area.setPostCode(postcode);29 list.add(area);30 }31 //5、关闭流32 workbook.close();33 } catch (IOException e) {34 e.printStackTrace();35 }36 return list;37 }2、导出数据到“区域数据.xls”⽂件中,页⾯数据如下图:1public void exportExcel() throws IOException {23 Page<Area> page = areaService.pageQuery(null);4 List<Area> list = page.getContent();56//1.在内存中创建⼀个excel⽂件7 HSSFWorkbook hssfWorkbook = new HSSFWorkbook();8//2.创建⼯作簿9 HSSFSheet sheet = hssfWorkbook.createSheet();10//3.创建标题⾏11 HSSFRow titlerRow = sheet.createRow(0);12 titlerRow.createCell(0).setCellValue("省");13 titlerRow.createCell(1).setCellValue("市");14 titlerRow.createCell(2).setCellValue("区");15 titlerRow.createCell(3).setCellValue("邮编");16 titlerRow.createCell(4).setCellValue("简码");17 titlerRow.createCell(5).setCellValue("城市编码");1819//4.遍历数据,创建数据⾏20for (Area area : list) {21//获取最后⼀⾏的⾏号22int lastRowNum = sheet.getLastRowNum();23 HSSFRow dataRow = sheet.createRow(lastRowNum + 1);24 dataRow.createCell(0).setCellValue(area.getProvince());25 dataRow.createCell(1).setCellValue(area.getCity());26 dataRow.createCell(2).setCellValue(area.getDistrict());27 dataRow.createCell(3).setCellValue(area.getPostcode());28 dataRow.createCell(4).setCellValue(area.getShortcode());29 dataRow.createCell(5).setCellValue(area.getCitycode());30 }31//5.创建⽂件名32 String fileName = "区域数据统计.xls";33//6.获取输出流对象34 HttpServletResponse response = ServletActionContext.getResponse();35 ServletOutputStream outputStream = response.getOutputStream();3637//7.获取mimeType38 ServletContext servletContext = ServletActionContext.getServletContext();39 String mimeType = servletContext.getMimeType(fileName);40//8.获取浏览器信息,对⽂件名进⾏重新编码41 HttpServletRequest request = ServletActionContext.getRequest();42 fileName = FileUtils.filenameEncoding(fileName, request);4344//9.设置信息头45 response.setContentType(mimeType);46 response.setHeader("Content-Disposition","attachment;filename="+fileName);47//10.写出⽂件,关闭流48 hssfWorkbook.write(outputStream);49 hssfWorkbook.close();50 }⼯具类1public class FileUtils {23public static String filenameEncoding(String filename, HttpServletRequest request) throws IOException { 4 String agent = request.getHeader("User-Agent"); //获取浏览器5if (agent.contains("Firefox")) {6 BASE64Encoder base64Encoder = new BASE64Encoder();7 filename = "=?utf-8?B?"8 + base64Encoder.encode(filename.getBytes("utf-8"))9 + "?=";10 } else if(agent.contains("MSIE")) {11 filename = URLEncoder.encode(filename, "utf-8");12 } else if(agent.contains ("Safari")) {13 filename = new String (filename.getBytes ("utf-8"),"ISO8859-1");14 } else {15 filename = URLEncoder.encode(filename, "utf-8");16 }17return filename;18 }19 }写出xls⽂件:五、 EXCEL常⽤操作⽅法1、得到Excel常⽤对象1 POIFSFileSystem fs=newPOIFSFileSystem(new FileInputStream("d:/test.xls")); 2//得到Excel⼯作簿对象3 HSSFWorkbook wb = new HSSFWorkbook(fs);4//得到Excel⼯作表对象5 HSSFSheet sheet = wb.getSheetAt(0);6//得到Excel⼯作表的⾏7 HSSFRow row = sheet.getRow(i);8//得到Excel⼯作表指定⾏的单元格9 HSSFCell cell = row.getCell((short) j);10 cellStyle = cell.getCellStyle();//得到单元格样式2、建⽴Excel常⽤对象1 HSSFWorkbook wb = new HSSFWorkbook();//创建Excel⼯作簿对象2 HSSFSheet sheet = wb.createSheet("new sheet");//创建Excel⼯作表对象3 HSSFRow row = sheet.createRow((short)0); //创建Excel⼯作表的⾏4 cellStyle = wb.createCellStyle();//创建单元格样式5 row.createCell((short)0).setCellStyle(cellStyle); //创建Excel⼯作表指定⾏的单元格6 row.createCell((short)0).setCellValue(1); //设置Excel⼯作表的值3、设置sheet名称和单元格内容1 wb.setSheetName(1, "第⼀张⼯作表",HSSFCell.ENCODING_UTF_16);2 cell.setEncoding((short) 1);3 cell.setCellValue("单元格内容");4、取得sheet的数⽬1 wb.getNumberOfSheets()5、根据index取得sheet对象1 HSSFSheet sheet = wb.getSheetAt(0);6、取得有效的⾏数1int rowcount = sheet.getLastRowNum();7、取得⼀⾏的有效单元格个数1 row.getLastCellNum();8、单元格值类型读写1 cell.setCellType(HSSFCell.CELL_TYPE_STRING); //设置单元格为STRING类型2 cell.getNumericCellValue();//读取为数值类型的单元格内容9、设置列宽、⾏⾼1 sheet.setColumnWidth((short)column,(short)width);2 row.setHeight((short)height);10、添加区域,合并单元格1 Region region = new Region((short)rowFrom,(short)columnFrom,(short)rowTo2 ,(short)columnTo);//合并从第rowFrom⾏columnFrom列3 sheet.addMergedRegion(region);// 到rowTo⾏columnTo的区域4//得到所有区域5 sheet.getNumMergedRegions()11、保存Excel⽂件1 FileOutputStream fileOut = new FileOutputStream(path);2 wb.write(fileOut);12、根据单元格不同属性返回字符串数值1public String getCellStringValue(HSSFCell cell) {2 String cellValue = "";3 switch (cell.getCellType()) {4 case HSSFCell.CELL_TYPE_STRING://字符串类型5 cellValue = cell.getStringCellValue();6 if(cellValue.trim().equals("")||cellValue.trim().length()<=0)7 cellValue=" ";8 break;9 case HSSFCell.CELL_TYPE_NUMERIC: //数值类型10 cellValue = String.valueOf(cell.getNumericCellValue());11 break;12 case HSSFCell.CELL_TYPE_FORMULA: //公式13 cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);14 cellValue = String.valueOf(cell.getNumericCellValue());15 break;16 case HSSFCell.CELL_TYPE_BLANK:17 cellValue=" ";18 break;19 case HSSFCell.CELL_TYPE_BOOLEAN:20 break;21 case HSSFCell.CELL_TYPE_ERROR:22 break;23 default:24 break;25 }26 return cellValue;27 }13、常⽤单元格边框格式1 HSSFCellStyle style = wb.createCellStyle();2 style.setBorderBottom(HSSFCellStyle.BORDER_DOTTED);//下边框3 style.setBorderLeft(HSSFCellStyle.BORDER_DOTTED);//左边框4 style.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框5 style.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框14、设置字体和内容位置1 HSSFFont f = wb.createFont();2 f.setFontHeightInPoints((short) 11);//字号3 f.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);//加粗4 style.setFont(f);5 style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//左右居中6 style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//上下居中7 style.setRotation(short rotation);//单元格内容的旋转的⾓度8 HSSFDataFormat df = wb.createDataFormat();9 style1.setDataFormat(df.getFormat("0.00%"));//设置单元格数据格式10 cell.setCellFormula(string);//给单元格设公式11 style.setRotation(short rotation);//单元格内容的旋转的⾓度15、插⼊图⽚1//先把读进来的图⽚放到⼀个ByteArrayOutputStream中,以便产⽣ByteArray2 ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();3 BufferedImage bufferImg = ImageIO.read(new File("ok.jpg"));4 ImageIO.write(bufferImg,"jpg",byteArrayOut);5//读进⼀个excel模版6 FileInputStream fos = new FileInputStream(filePathName+"/stencil.xlt");7 fs = new POIFSFileSystem(fos);8//创建⼀个⼯作薄9 HSSFWorkbook wb = new HSSFWorkbook(fs);10 HSSFSheet sheet = wb.getSheetAt(0);11 HSSFPatriarch patriarch = sheet.createDrawingPatriarch();12 HSSFClientAnchor anchor = new HSSFClientAnchor(0,0,1023,255,(short) 0,0,(short)10,10);13 patriarch.createPicture(anchor , wb.addPicture(byteArrayOut.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG));16、调整⼯作表位置1 HSSFWorkbook wb = new HSSFWorkbook();2 HSSFSheet sheet = wb.createSheet("format sheet");3 HSSFPrintSetup ps = sheet.getPrintSetup();4 sheet.setAutobreaks(true);5 ps.setFitHeight((short)1);6 ps.setFitWidth((short)1);。
POI海量数据大数据文件生成SXSSFWorkbook使用简介
POI海量数据⼤数据⽂件⽣成SXSSFWorkbook使⽤简介 在之前我们知道处理xls的excel⽤的workbook是HSSFWorkbook,处理xlsx的excel⽤的是XSSFWorkbook。
上⾯两个类导出excel的时候数据会驻留在内存中,所以当数据量⼤的时候容易造成内存溢出。
SXSSFWorkbook是⽤来⽣成海量excel数据⽂件,主要原理是借助临时存储空间⽣成excel。
POI要求3.8以上,⽣成的⽂件格式要求是07及以上版本,因为excel07级以上版本的⾏数1048576,量很⼤,⽽03版本的只有6万多。
读取07及以上版本的excel仍然是“XSSFWorkbook”,写⼊则为“SXSSFWorkbook ”。
导出的代码:(⼀个简单的测试,如果想封装⼯具类,参考:)package cn.xm.exam.utils;import java.io.File;import java.io.FileOutputStream;import ermodel.Cell;import ermodel.Row;import ermodel.Sheet;import ermodel.Workbook;import org.apache.poi.xssf.streaming.SXSSFWorkbook;public class SXSSFExcelUtil {public static void main(String[] args) {String[] title = { "id", "name", "sex" };// 创建⼀个⼯作簿Workbook workbook = new SXSSFWorkbook();// 创建⼀个⼯作表sheetSheet sheet = workbook.createSheet();// 创建第⼀⾏Row row = sheet.createRow(0);// 创建⼀个单元格Cell cell = null;// 创建表头for (int i = 0; i < title.length; i++) {cell = row.createCell(i);cell.setCellValue(title[i]);}// 从第⼆⾏开始追加数据for (int i = 1; i <= 10000; i++) {// 创建第i⾏Row nextRow = sheet.createRow(i);// 参数代表第⼏列Cell cell2 = nextRow.createCell(0);cell2.setCellValue("a" + i);cell2 = nextRow.createCell(1);cell2.setCellValue("user" + i);cell2 = nextRow.createCell(2);cell2.setCellValue("男");}// 创建⼀个⽂件File file = new File("G:/tt1.xls");try {file.createNewFile();// 打开⽂件流FileOutputStream outputStream = new FileOutputStream(file);workbook.write(outputStream);outputStream.close();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}补充:SXFFSWoorkbook导出的excel相⽐于XSSFWoorkbook导出的更节省空间:下⾯分别是SXXFS\XFFS\HFFS导出上⾯1万条数据的excel的⽂件⼤⼩:补充:测试HSSF\XSSF导出的数据占⽤内存,⽽SXFFS导出的数据不容易造成内存溢出数据改为5万条并且写⼊之后查看内存信息:(1)查看XSSF导出的时候占⽤JVM内存package cn.xm.exam.utils;import java.io.File;import java.io.FileOutputStream;import ermodel.Cell;import ermodel.Row;import ermodel.Sheet;import ermodel.Workbook;import ermodel.XSSFWorkbook;public class SXSSFExcelUtil {public static void main(String[] args) {String[] title = { "id", "name", "sex" };// 创建⼀个⼯作簿Workbook workbook = new XSSFWorkbook();// 创建⼀个⼯作表sheetSheet sheet = workbook.createSheet();// 创建第⼀⾏Row row = sheet.createRow(0);// 创建⼀个单元格Cell cell = null;// 创建表头for (int i = 0; i < title.length; i++) {cell = row.createCell(i);cell.setCellValue(title[i]);}// 从第⼆⾏开始追加数据for (int i = 1; i <= 50000; i++) {// 创建第i⾏Row nextRow = sheet.createRow(i);// 参数代表第⼏列Cell cell2 = nextRow.createCell(0);cell2.setCellValue("a" + i);cell2 = nextRow.createCell(1);cell2.setCellValue("user" + i);cell2 = nextRow.createCell(2);cell2.setCellValue("男");}// 创建⼀个⽂件File file = new File("G:/tt1.xls");try {file.createNewFile();// 打开⽂件流FileOutputStream outputStream = new FileOutputStream(file);workbook.write(outputStream);outputStream.close();// dispose of temporary files backing this workbook on disk// ((SXSSFWorkbook) workbook).dispose();System.out.println("创建完成");System.out.println("总的内存->" + Runtime.getRuntime().totalMemory() / 1024 / 1024 + "MB"); System.out.println("剩余的内存->" + Runtime.getRuntime().freeMemory() / 1024 / 1024 + "MB"); } catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}结果:创建完成总的内存->883MB剩余的内存->550MB(2)查看SXSSF导出的时候占⽤JVM内存将上⾯XSSF改为SXFFS查看结果:创建完成总的内存->182MB剩余的内存->175MB。
POI操作Excel详解,HSSF和XSSF两种方式
POI操作Excel详解,HSSF和XSSF两种⽅式HSSF⽅式:1package com.tools.poi.lesson1;23import java.io.FileInputStream;4import java.io.FileNotFoundException;5import java.io.FileOutputStream;6import java.io.IOException;7import java.text.ParseException;8import java.text.SimpleDateFormat;9import java.util.ArrayList;10import java.util.List;1112import ermodel.HSSFCell;13import ermodel.HSSFCellStyle;14import ermodel.HSSFRow;15import ermodel.HSSFSheet;16import ermodel.HSSFWorkbook;17import org.apache.poi.hssf.util.HSSFColor;18import org.apache.poi.poifs.filesystem.POIFSFileSystem;19import ermodel.Cell;20import ermodel.CellStyle;2122import com.tools.poi.bean.Student;2324public class ExcelUtilWithHSSF {25public static void main(String[] args) {26try {27 getExcelAsFile("aaa");28 } catch (FileNotFoundException e) {29 e.printStackTrace();30 } catch (IOException e) {31 e.printStackTrace();32 }333435// try {36// CreateExcelDemo1();37// } catch (ParseException e) {38// e.printStackTrace();39// }404142 }4344/**45 * 得到Excel,并解析内容46 * @param file47 * @throws FileNotFoundException48 * @throws IOException49*/50public static void getExcelAsFile(String file) throws FileNotFoundException, IOException{51//1.得到Excel常⽤对象52// POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("d:/FTP/test.xls"));53 POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("d:/FTP/new1.xls"));54//2.得到Excel⼯作簿对象55 HSSFWorkbook wb = new HSSFWorkbook(fs);56//3.得到Excel⼯作表对象57 HSSFSheet sheet = wb.getSheetAt(0);58//总⾏数59int trLength = sheet.getLastRowNum();60//4.得到Excel⼯作表的⾏61 HSSFRow row = sheet.getRow(0);62//总列数63int tdLength = row.getLastCellNum();64//5.得到Excel⼯作表指定⾏的单元格65 HSSFCell cell = row.getCell((short)1);66//6.得到单元格样式67 CellStyle cellStyle = cell.getCellStyle();68for(int i=0;i<trLength;i++){69//得到Excel⼯作表的⾏70 HSSFRow row1 = sheet.getRow(i);71for(int j=0;j<tdLength;j++){7273//得到Excel⼯作表指定⾏的单元格74 HSSFCell cell1 = row1.getCell(j);7576/**77 * 为了处理:Excel异常Cannot get a text value from a numeric cell78 * 将所有列中的内容都设置成String类型格式79*/80if(cell1!=null){81 cell1.setCellType(Cell.CELL_TYPE_STRING);82 }8384//获得每⼀列中的值85 System.out.print(cell1.getStringCellValue()+"\t\t\t");86 }87 System.out.println();88 }89 }909192/**93 * 创建Excel,并写⼊内容94*/95public static void CreateExcel(){9697//1.创建Excel⼯作薄对象98 HSSFWorkbook wb = new HSSFWorkbook();99//2.创建Excel⼯作表对象100 HSSFSheet sheet = wb.createSheet("new Sheet");101//3.创建Excel⼯作表的⾏102 HSSFRow row = sheet.createRow(6);103//4.创建单元格样式104 CellStyle cellStyle =wb.createCellStyle();105// 设置这些样式106 cellStyle.setFillForegroundColor(HSSFColor.SKY_BLUE.index);107 cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);108 cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);109 cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);110 cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);111 cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);112 cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);113114115116//5.创建Excel⼯作表指定⾏的单元格117 row.createCell(0).setCellStyle(cellStyle);118//6.设置Excel⼯作表的值119 row.createCell(0).setCellValue("aaaa");120121 row.createCell(1).setCellStyle(cellStyle);122 row.createCell(1).setCellValue("bbbb");123124125//设置sheet名称和单元格内容126 wb.setSheetName(0,"第⼀张⼯作表");127//设置单元格内容 cell.setCellValue("单元格内容");128129// 最后⼀步,将⽂件存到指定位置130try131 {132 FileOutputStream fout = new FileOutputStream("E:/students.xls");133 wb.write(fout);134 fout.close();135 }136catch (Exception e)137 {138 e.printStackTrace();139 }140 }141142/**143 * 创建Excel的实例144 * @throws ParseException145*/146public static void CreateExcelDemo1() throws ParseException{147 List list = new ArrayList();148 SimpleDateFormat df = new SimpleDateFormat("yyyy-mm-dd");149 Student user1 = new Student(1, "张三", 16,true, df.parse("1997-03-12"));150 Student user2 = new Student(2, "李四", 17,true, df.parse("1996-08-12"));151 Student user3 = new Student(3, "王五", 26,false, df.parse("1985-11-12"));152 list.add(user1);153 list.add(user2);154 list.add(user3);155156157// 第⼀步,创建⼀个webbook,对应⼀个Excel⽂件158 HSSFWorkbook wb = new HSSFWorkbook();159// 第⼆步,在webbook中添加⼀个sheet,对应Excel⽂件中的sheet160 HSSFSheet sheet = wb.createSheet("学⽣表⼀");161// 第三步,在sheet中添加表头第0⾏,注意⽼版本poi对Excel的⾏数列数有限制short 162 HSSFRow row = sheet.createRow((int) 0);163// 第四步,创建单元格,并设置值表头设置表头居中164 HSSFCellStyle style = wb.createCellStyle();165 style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建⼀个居中格式166167 HSSFCell cell = row.createCell((short) 0);168 cell.setCellValue("学号");169 cell.setCellStyle(style);170 cell = row.createCell((short) 1);171 cell.setCellValue("姓名");172 cell.setCellStyle(style);173 cell = row.createCell((short) 2);174 cell.setCellValue("年龄");175 cell.setCellStyle(style);176 cell = row.createCell((short) 3);177 cell.setCellValue("性别");178 cell.setCellStyle(style);179 cell = row.createCell((short) 4);180 cell.setCellValue("⽣⽇");181 cell.setCellStyle(style);182183// 第五步,写⼊实体数据实际应⽤中这些数据从数据库得到,184185for (int i = 0; i < list.size(); i++)186 {187 row = sheet.createRow((int) i + 1);188 Student stu = (Student) list.get(i);189// 第四步,创建单元格,并设置值190 row.createCell((short) 0).setCellValue((double) stu.getId());191 row.createCell((short) 1).setCellValue(stu.getName());192 row.createCell((short) 2).setCellValue((double) stu.getAge());193 row.createCell((short)3).setCellValue(stu.getSex()==true?"男":"⼥"); 194 cell = row.createCell((short) 4);195 cell.setCellValue(new SimpleDateFormat("yyyy-mm-dd").format(stu 196 .getBirthday()));197 }198// 第六步,将⽂件存到指定位置199try200 {201 FileOutputStream fout = new FileOutputStream("E:/students.xls"); 202 wb.write(fout);203 fout.close();204 }205catch (Exception e)206 {207 e.printStackTrace();208 }209210211212 }213 }XSSF⽅式:1package com.tools.poi.lesson1;23import java.io.File;4import java.io.FileInputStream;5import java.io.FileNotFoundException;6import java.io.FileOutputStream;7import java.io.IOException;8import java.io.InputStream;9import java.io.OutputStream;10import java.text.ParseException;11import java.text.SimpleDateFormat;12import java.util.ArrayList;13import java.util.List;1415import ermodel.HSSFCell;16import ermodel.HSSFCellStyle;17import ermodel.HSSFRow;18import ermodel.HSSFSheet;19import ermodel.HSSFWorkbook;20import org.apache.poi.hssf.util.HSSFColor;21import org.apache.poi.openxml4j.exceptions.InvalidFormatException;22import org.apache.poi.poifs.filesystem.POIFSFileSystem;23import ermodel.Cell;24import ermodel.CellStyle;25import ermodel.Row;26import ermodel.Sheet;27import ermodel.Workbook;28import ermodel.WorkbookFactory;29import org.apache.poi.ss.util.WorkbookUtil;3031import com.tools.poi.bean.Student;3233public class ExcelUtilWithXSSF {34public static void main(String[] args) {35try {36 getExcelAsFile("d:/FTP/系统报表.xls");37 } catch (FileNotFoundException e) {38 e.printStackTrace();39 } catch (IOException e) {40 e.printStackTrace();41 } catch (InvalidFormatException e) {42 e.printStackTrace();43 }444546// try {47// CreateExcelDemo1();48// } catch (ParseException e) {49// e.printStackTrace();50// }515253 }5455/**56 * 得到Excel,并解析内容对2007及以上版本使⽤XSSF解析57 * @param file58 * @throws FileNotFoundException59 * @throws IOException60 * @throws InvalidFormatException61*/62public static void getExcelAsFile(String file) throws FileNotFoundException, IOException, InvalidFormatException{ 63////1.得到Excel常⽤对象64// POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("d:/FTP/new1.xls"));65////2.得到Excel⼯作簿对象66// HSSFWorkbook wb = new HSSFWorkbook(fs);67686970 InputStream ins = null;71 Workbook wb = null;72 ins=new FileInputStream(new File(file));73//ins= ExcelService.class.getClassLoader().getResourceAsStream(filePath);74 wb = WorkbookFactory.create(ins);75 ins.close();767778//3.得到Excel⼯作表对象79 Sheet sheet = wb.getSheetAt(0);80//总⾏数81int trLength = sheet.getLastRowNum();82//4.得到Excel⼯作表的⾏83 Row row = sheet.getRow(0);84//总列数85int tdLength = row.getLastCellNum();86//5.得到Excel⼯作表指定⾏的单元格87 Cell cell = row.getCell((short)1);88//6.得到单元格样式89 CellStyle cellStyle = cell.getCellStyle();9091for(int i=5;i<trLength;i++){92//得到Excel⼯作表的⾏93 Row row1 = sheet.getRow(i);94for(int j=0;j<tdLength;j++){95//得到Excel⼯作表指定⾏的单元格96 Cell cell1 = row1.getCell(j);97/**98 * 为了处理:Excel异常Cannot get a text value from a numeric cell99 * 将所有列中的内容都设置成String类型格式100*/101if(cell1!=null){102 cell1.setCellType(Cell.CELL_TYPE_STRING);103 }104105if(j==5&&i<=10){106 cell1.setCellValue("1000");107 }108109//获得每⼀列中的值110 System.out.print(cell1+" ");111 }112 System.out.println();113 }114115//将修改后的数据保存116 OutputStream out = new FileOutputStream(file);117 wb.write(out);118 }119120121/**122 * 创建Excel,并写⼊内容123*/124public static void CreateExcel(){125126//1.创建Excel⼯作薄对象127 HSSFWorkbook wb = new HSSFWorkbook();128//2.创建Excel⼯作表对象129 HSSFSheet sheet = wb.createSheet("new Sheet");130//3.创建Excel⼯作表的⾏131 HSSFRow row = sheet.createRow(6);132//4.创建单元格样式133 CellStyle cellStyle =wb.createCellStyle();134// 设置这些样式135 cellStyle.setFillForegroundColor(HSSFColor.SKY_BLUE.index);136 cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);137 cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);138 cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);139 cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);140 cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);141 cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);142143144145//5.创建Excel⼯作表指定⾏的单元格146 row.createCell(0).setCellStyle(cellStyle);147//6.设置Excel⼯作表的值148 row.createCell(0).setCellValue("aaaa");149150 row.createCell(1).setCellStyle(cellStyle);151 row.createCell(1).setCellValue("bbbb");152153154//设置sheet名称和单元格内容155 wb.setSheetName(0,"第⼀张⼯作表");156//设置单元格内容 cell.setCellValue("单元格内容");157158// 最后⼀步,将⽂件存到指定位置159try160 {161 FileOutputStream fout = new FileOutputStream("E:/students.xls");162 wb.write(fout);163 fout.close();164 }165catch (Exception e)166 {167 e.printStackTrace();168 }169 }170171/**172 * 创建Excel的实例173 * @throws ParseException174*/175public static void CreateExcelDemo1() throws ParseException{176 List list = new ArrayList();177 SimpleDateFormat df = new SimpleDateFormat("yyyy-mm-dd");178 Student user1 = new Student(1, "张三", 16,true, df.parse("1997-03-12"));179 Student user2 = new Student(2, "李四", 17,true, df.parse("1996-08-12"));180 Student user3 = new Student(3, "王五", 26,false, df.parse("1985-11-12"));181 list.add(user1);182 list.add(user2);183 list.add(user3);184185186// 第⼀步,创建⼀个webbook,对应⼀个Excel⽂件187 HSSFWorkbook wb = new HSSFWorkbook();188// 第⼆步,在webbook中添加⼀个sheet,对应Excel⽂件中的sheet189 HSSFSheet sheet = wb.createSheet("学⽣表⼀");190// 第三步,在sheet中添加表头第0⾏,注意⽼版本poi对Excel的⾏数列数有限制short 191 HSSFRow row = sheet.createRow((int) 0);192// 第四步,创建单元格,并设置值表头设置表头居中193 HSSFCellStyle style = wb.createCellStyle();194 style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建⼀个居中格式195196 HSSFCell cell = row.createCell((short) 0);197 cell.setCellValue("学号");198 cell.setCellStyle(style);199 cell = row.createCell((short) 1);200 cell.setCellValue("姓名");201 cell.setCellStyle(style);202 cell = row.createCell((short) 2);203 cell.setCellValue("年龄");204 cell.setCellStyle(style);205 cell = row.createCell((short) 3);206 cell.setCellValue("性别");207 cell.setCellStyle(style);208 cell = row.createCell((short) 4);209 cell.setCellValue("⽣⽇");210 cell.setCellStyle(style);211212// 第五步,写⼊实体数据实际应⽤中这些数据从数据库得到,213214for (int i = 0; i < list.size(); i++)215 {216 row = sheet.createRow((int) i + 1);217 Student stu = (Student) list.get(i);218// 第四步,创建单元格,并设置值219 row.createCell((short) 0).setCellValue((double) stu.getId());220 row.createCell((short) 1).setCellValue(stu.getName());221 row.createCell((short) 2).setCellValue((double) stu.getAge());222 row.createCell((short)3).setCellValue(stu.getSex()==true?"男":"⼥"); 223 cell = row.createCell((short) 4);224 cell.setCellValue(new SimpleDateFormat("yyyy-mm-dd").format(stu 225 .getBirthday()));226 }227// 第六步,将⽂件存到指定位置228try229 {230 FileOutputStream fout = new FileOutputStream("E:/students.xls"); 231 wb.write(fout);232 fout.close();233 }234catch (Exception e)235 {236 e.printStackTrace();237 }238239240241 }242 }。
使用POI进行Excel操作的总结一——创建Workbook,Sheet,Row以及Cell
使⽤POI进⾏Excel操作的总结⼀——创建Workbook,Sheet,Row以及Cell前段时间,看在其他的⽹站上给出Excel⽂档的导⼊与导出操作,感觉很酷的样⼦,所以就学习了⼀下如何使⽤POI进⾏Excel的操作,现在对之前的学习过程进⾏⼀个总结。
⼀、现在普遍使⽤的Excel⽂档有xls以及xlsx这两种Excel⽂档,其中xls格式的Excel⽂档⼜分为5.0/95⼯作簿以及97-2003⼯作簿这两种。
需要注意的是,由于5.0/95⼯作簿的版本太低,现在的POI⽂档不再⽀持这种类型的Excel⽂档的读取⼯作,当试图读取这种类型的Excel⽂档的时候,POI会抛出⼀个异常(OldExcelFormatException)。
我现在使⽤的POI是3.14版本。
⼆、Workbook的创建1、由于Excel中存在xls以及xlsx这两种格式,所以创建⽅式也有所不同。
其中对于xls格式的⽂档,需要使⽤HSSFWorkbook来创建⼯作簿对象,⽽对于xlsx格式的Excel⽂档,则需要使⽤XSSFWrokbook来创建⼯作簿。
有⼀点需要注意的是,HSSFWorkbook与XSSFWorkbook 这两个类其实都是Workbook接⼝的⼀个实现类。
好了,下⾯就是创建⼯作簿对象的代码://创建⼀个不存在的excel⽂件private static Workbook createWorkbookIfNotExist(String fileName) throws Exception {Workbook wb = null;if(fileName.endsWith(".xls")) {wb = new HSSFWorkbook();} else if(fileName.endsWith(".xlsx")) {wb = new XSSFWorkbook();} else {throw new Exception("⽂件类型错误!");}try{OutputStream output = new FileOutputStream(fileName);wb.write(output);}catch(FileNotFoundException e) {System.out.println("⽂件创建失败,失败原因为:" + e.getMessage());throw new FileNotFoundException();}System.out.println(fileName + "⽂件创建成功!");return wb;}//创建⼀个新的或者已存在的Excel⽂档的Workbookpublic static Workbook createWorkbook(String fileName) throws Exception {InputStream input = null;Workbook wb = null;try{input = new FileInputStream(fileName);wb = WorkbookFactory.create(input);} catch(FileNotFoundException e) {System.out.println("要打开的⽂件不存在,正试图创建该⽂件,请稍后……!");wb = createWorkbookIfNotExist(fileName);} catch(OldExcelFormatException e) {System.out.println("⽂件打开失败,原因:要打开的Excel⽂件版本过低!");throw new OldExcelFormatException("⽂件版本过低");} finally {if(input != null) {input.close();}}return wb;}2、创建Sheet的时候,同样的也存在HSSFSheet以及XSSHSheet这两种类型。
POI入门教程
内部资料不得拷贝POI报表--用POI与Excel交互AURISOFT第一章POI简介--Jakata Poi HSSF:纯java的Excel解决方案在我们实际的开发中,表现层的解决方案虽然有多样,但是IE浏览器已成为最多人使用的浏览器,因为大家都用Windows。
在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统、银行系统)。
或者是:我们已经习惯用Excel打印。
Apache的Jakata项目的POI子项目,目前比较成熟的是HSSF接口,处理MSExcel对象。
它不象我们仅仅是用csv生成的没有格式的可以由Excel转换的东西,而是真正的Excel 对象,你可以控制一些属性如sheet,cell等等。
首先,理解一下一个Excel的文件的组织形式,一个Excel文件对应于一个workbook(HSSFWorkbook),一个workbook可以有多个sheet(HSSFSheet)组成,一个sheet是由多个row(HSSFRow)组成,一个row是由多个cell(HSSFCell)组成。
POI可以到下载到。
实际运行时,需要有poi包就可以了。
HSSF提供给用户使用的对象在ermodel包中,主要部分包括Excel对象,样式和格式,还有辅助操作。
有以下几种对象:HSSFWorkbook excel的文档对象HSSFSheet excel的表单HSSFRow excel的行HSSFCell excel的格子单元HSSFFont excel字体HSSFDataFormat 日期格式在poi1.7中才有以下2项:HSSFHeader sheet头HSSFFooter sheet尾(只有打印的时候才能看到效果)和这个样式HSSFCellStyle cell样式辅助操作包括HSSFDateUtil 日期HSSFPrintSetup 打印HSSFErrorConstants 错误信息表以下可能需要使用到如下的类import ermodel.HSSFCell;import ermodel.HSSFCellStyle;import ermodel.HSSFDataFormat;import ermodel.HSSFFont;import ermodel.HSSFRow;import ermodel.HSSFSheet;import ermodel.HSSFWorkbook;import org.apache.poi.hssf.util.HSSFColor;先看poi的examples包中提供的最简单的例子,建立一个空xls文件。
ApachePOI使用指南(HSSFWorkbook生成excel)
ApachePOI使⽤指南(HSSFWorkbook⽣成excel)说明:官⽹:由于poi的功能多样,可以⽣成ppt、word、excel.......,本⽂就以⽣成excel为例进⾏说明,相信聪明的你⼀定能举⼀反三使⽤的版本4.0.1maven依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.0.1</version> </dependency> poi组件说明Apache POI组件组件组件类型HSSF Microsoft Excel XLS格式档案XSSF Microsoft Excel OOXML XLSX格式档案HWPF Microsoft Word DOC格式档案HSLF Microsoft PowerPoint格式档案HDGF Microsoft Visio格式档案HPBF Microsoft Publisher格式档案HSMF Microsoft Outlook格式档案⽣成⼀个excel⽂档demo代码public static void hssfDemo1() throws Exception{//1.创建⼀个⽂档对象HSSFWorkbook (⼀个excel⽂档就对应⼀个HSSFWorkbook实例), 有两种创建⽅式//⽅式⼀HSSFWorkbook wb = new HSSFWorkbook();//⽅式⼆// HSSFWorkbook wb = HSSFWorkbookFactory.createWorkbook();//2.我们都知道excel⽂档⾥⾯对应了sheet(可以有多个sheet),所以第⼆个步骤就是⽣成sheet对象HSSFSheet sheet1 = wb.createSheet("sheet1"); //"sheet1"未对应的sheet的名称//3.sheet⾥⾯的内容都是⼀⾏⼀⾏的格⼦组成,所以需要创建“⾏对象”HSSFRow row0 = sheet1.createRow(0); //创建第⼀⾏,"0"为⾏号的下标//4.⽣成列HSSFCell cell0 = row0.createCell(0); //⽣成第⼀⾏的第⼀列HSSFCell cell1 = row0.createCell(1); //⽣成第⼀⾏的第⼆列HSSFCell cell2 = row0.createCell(2); //⽣成第⼀⾏的第三列HSSFCell cell3 = row0.createCell(3); //⽣成第⼀⾏的第四列//5.给列进⾏赋值cell0.setCellValue("姓名");cell1.setCellValue("年龄");cell2.setCellValue("地址");cell3.setCellValue("电话");//6.输出excel⽂件FileOutputStream fileOut = new FileOutputStream("C:/workbook.xls");wb.write(fileOut);}⽣成⽂件结果相信聪明的你看了上⾯的demo,对⽣成excel有了⼀个感性的认识,下⾯来⽣成⼀个有点样⼦的excel⽂档(合并单元格、设置样式、设置字体。
用POI HSSF处理EXCEL表格
用POI HSSF处理EXCEL表格POI的主页:/poiPOI HSSF的Quick Guide,教初学者如何快速上手使用POI HSSF:/poi/hssf/quick-guide.html笔者据使用经验以为:POI HSSF是当今市面上最强大的处理EXCEL表格的java工具,比韩国人写的那个JExcelApi或其它几种工具都要好。
而且它是Apache的开源项目。
当然POI HSSF也有缺点:不能直接支持EXCEL图表,API文档粗糙简略,有些类和方法需要引用Apache 项目中的其它一些包,包与包之间依赖关系比较复杂等等。
本文内容不在于提供一个POI HSSF 的完整使用指南(上面那个Apache主页上的Quick Guide已经非常详细),而是列出一些笔者在项目开发过程中找到的一些技巧、经验。
下图是定义的模板PoiTest.xls:通过POI生成的最终结果:(单元格中的数据发生变化时,图表中的柱状、折线也会跟着变化)处理图表目前POI版本为2.5.1,ermodel包里有一个HSSFChart类,里面只有一个空方法createBarChart(),表明POI还不直接支持EXCEL图表。
替代方法还是有的:因为EXCEL图表的源数据引用自EXCEL单元格。
我们可以先新建一个EXCEL工作薄,作为模板,在里面创建图表,指定它引用工作表中的一些特定单元格。
然后我们用POI来读取这个工作薄,把数据写入到那些特定单元格。
首先要在模板里创建可以动态引用单元格的“名称”,利用“名称”来创建图表中的“系列”。
一、打开模板PoiTest.xls,点击[插入]>[名称]>[定义],创建四个“名称”sx,s1y,s2y,s3y:sx=OFFSET(Sheet1!$A$17,0,2,1,COUNTA(Sheet1!$17:$17)-4)s1y=OFFSET(Sheet1!$A$18,0,2,1,COUNTA(Sheet1!$18:$18)-4)s2y=OFFSET(Sheet1!$A$19,0,2,1,COUNTA(Sheet1!$19:$19)-3)s3y=OFFSET(Sheet1!$A$20,0,2,1,COUNTA(Sheet1!$20:$20)-3)这里用到了两个EXCEL函数,OFFSET()和COUNTA()函数。
Java使用POI的SXSSFWorkbook与HSSFWorkbook导出复杂表头
Java使⽤POI的SXSSFWorkbook与HSSFWorkbook导出复杂表头⼀、HSSFWorkbook与SXSSFWorkbook的区别:HSSFWorkbook是对Excel2003以前的版本进⾏操作的,即后缀名为.xlsSXSSFWorkbook时对Excel2007的版本就⾏操作,即后缀名为.xlsxps:1、SXSSFWorkbook是在POI3.8版本开始提供基于XSSF低内存占⽤的SXSSFSXSSF通过⼀个滑动窗⼝来限制访问Row的数量从⽽达到低内存占⽤的⽬录,XSSF可以访问所有⾏。
SXSSF通过设置rowAccessWindowSize的⼤⼩实现滑动窗⼝中存储数据量的row数量,当⾏数超过滑动窗⼝设定的值时,此时旧的数据不再出现在滑动窗⼝且不可对此进⾏访问,同时将此数据写⼊磁盘。
也可通过flushRow(int keepRows)设定⾏数通过周期性的调⽤来修改。
注意:针对 SXSSF Beta 3.8下,会有临时⽂件产⽣,⽐如:poi-sxssf-sheet4654655121378979321.xml⽂件位置:java.io.tmpdir这个环境变量下的位置Windows 7下是C:\Users\xxxxxAppData\Local\TempLinux下是 /var/tmp/2、当数据量超出65536条后,在使⽤HSSFWorkbook或XSSFWorkbook,程序会报OutOfMemoryError:heap space;内存溢出错误。
这时应该⽤SXSSFworkbook⼆、所需jar包1、SXSSFWorkbook所需jar包<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>3.17</version></dependency><dependency><groupId>mons</groupId><artifactId>commons-collections4</artifactId><version>4.1</version></dependency><dependency><groupId>org.apache.xmlbeans</groupId><artifactId>xmlbeans</artifactId><version>2.6.0</version></dependency>2、HSSFWorkbook所需jar<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></dependency>三、代码实例:1、SXSSFWorkbook:package com.test.excel;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.List;import ermodel.Cell;import ermodel.CellStyle;import ermodel.HorizontalAlignment;import ermodel.Row;import ermodel.Sheet;import ermodel.VerticalAlignment;import ermodel.Workbook;import org.apache.poi.ss.util.CellRangeAddress;import org.apache.poi.xssf.streaming.SXSSFSheet;import org.apache.poi.xssf.streaming.SXSSFWorkbook;public class SXSSFExecelPOI {public static void main(String[] args) {try {boolean createExcelFile = createExcelFile();if (createExcelFile) {System.out.println("SXSSF_excel导出成功");} else {System.out.println("SXSSFexcel导出失败");}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}private static boolean createExcelFile() throws Exception {boolean state = false;OutputStream os = null;FileOutputStream fos = null;String resultFileName = null;String fileName = "";try {ermodel.Workbook wb;fileName = "kemu.xlsx";wb = createReportWorkbook();SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");resultFileName = "E:\\" + File.separator + "excel" + File.separator + sdf.format(new Date()) + File.separator + fileName;resultFileName = resultFileName.replaceAll("\\\\", "/");File file = new File(resultFileName);if (!file.exists()) {file.getParentFile().mkdirs();}fos = new FileOutputStream(file);os = new BufferedOutputStream(fos, 1024);wb.write(os);os.flush();state = true;} finally {if (os != null)os.close();}return state;}private static Workbook createReportWorkbook() {String[] titles = { "时间", "科⽬", "科⽬", "科⽬", "科⽬", "备注" };String[] handClum = { "0,1,0,0", "0,0,1,4", "0,1,5,5" };String[] titles2 = { "时间", "科⽬⼀", "科⽬⼆", "科⽬三", "科⽬四", "备注" };// 100 指定Excel在屏幕尺⼨下可滑动数据为100条SXSSFWorkbook wb = new SXSSFWorkbook(100);CellStyle style = wb.createCellStyle();style.setAlignment(HorizontalAlignment.CENTER);// 设置单元格⽔平居中style.setVerticalAlignment(VerticalAlignment.CENTER);// 设置单元格垂直居中Sheet sheet = wb.createSheet("sheet1");for (int i = 0; i < titles.length; i++) {sheet.setColumnWidth(i, 5000);}Row row = sheet.createRow(0);// 创建表头1for (int i = 0; i < titles.length; i++) {Cell cell = row.createCell(i);cell.setCellStyle(style);cell.setCellValue(titles[i]);}// 动态合并单元格for (int i = 0; i < handClum.length; i++) {// sheet.autoSizeColumn(i, true);String[] temp = handClum[i].split(",");Integer startrow = Integer.parseInt(temp[0]);Integer overrow = Integer.parseInt(temp[1]);Integer startcol = Integer.parseInt(temp[2]);Integer overcol = Integer.parseInt(temp[3]);sheet.addMergedRegion(new CellRangeAddress(startrow, overrow, startcol, overcol)); }row = sheet.createRow(1);// 创建表头2for (int i = 0; i < titles2.length; i++) {Cell cell = row.createCell(i);cell.setCellStyle(style);cell.setCellValue(titles2[i]);}List<keMu> kemus = new ArrayList<keMu>();for (int i = 0; i < 1000; i++) {keMu kemu = new keMu();kemu.setCreateDate("2018/11/06");kemu.setKe1("理论" + i);kemu.setKe2("模拟" + i);kemu.setKe3("上机" + i);kemu.setKe4("实操" + i);kemu.setRemark("通过");kemus.add(kemu);}// 填充数据if (kemus != null && kemus.size() > 0) {for (int i = 0; i < kemus.size(); i++) {Row contentRow = sheet.createRow(i + 2);// 填充类容,从第2⾏开始,0⾏给表头if (i % 100 == 0) {try {((SXSSFSheet) sheet).flushRows(100);} catch (IOException e) {e.printStackTrace();}}for (int j = 0; j < titles2.length; j++) {Cell cell = contentRow.createCell(j);cell.setCellStyle(style);keMu content = kemus.get(i);switch (j) {case 0:cell.setCellValue(content.getCreateDate());break;case 1:cell.setCellValue(content.getKe1());break;case 2:cell.setCellValue(content.getKe2());break;case 3:cell.setCellValue(content.getKe3());break;case 4:cell.setCellValue(content.getKe4());break;case 5:cell.setCellValue(content.getRemark());break;}}}}return wb;}static class keMu {private String createDate;private String ke1;private String ke2;private String ke3;private String ke4;private String remark;public String getCreateDate() {return createDate;}public void setCreateDate(String createDate) {this.createDate = createDate;}public String getKe1() {return ke1;}public void setKe1(String ke1) {this.ke1 = ke1;}public String getKe2() {return ke2;}public void setKe2(String ke2) {this.ke2 = ke2;}public String getKe3() {return ke3;}public void setKe3(String ke3) {this.ke3 = ke3;}public String getKe4() {return ke4;}public void setKe4(String ke4) {this.ke4 = ke4;}public String getRemark() {return remark;}public void setRemark(String remark) {this.remark = remark;}}}2、HSSFWorkbook:package com.test.excel;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.List;import ermodel.HSSFCell; import ermodel.HSSFRow; import ermodel.HSSFSheet; import ermodel.HSSFWorkbook; import ermodel.CellStyle;import ermodel.HorizontalAlignment; import ermodel.VerticalAlignment; import ermodel.Workbook;import org.apache.poi.ss.util.CellRangeAddress;public class HSSFExcel {public static void main(String[] args) {try {boolean createExcelFile = createExcelFile();if (createExcelFile) {System.out.println("HSSF_excel导出成功"); } else {System.out.println("hssf_excel导出失败");}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}private static boolean createExcelFile() throws Exception {boolean state = false;OutputStream os = null;FileOutputStream fos = null;String resultFileName = null;String fileName = "";try {ermodel.Workbook wb;fileName = "hkemu.xls";wb = createReportWorkbook();SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");resultFileName = "E:\\" + File.separator + "excel" + File.separator + sdf.format(new Date()) + File.separator + fileName;resultFileName = resultFileName.replaceAll("\\\\", "/");File file = new File(resultFileName);if (!file.exists()) {file.getParentFile().mkdirs();}fos = new FileOutputStream(file);os = new BufferedOutputStream(fos, 1024);wb.write(os);os.flush();state = true;} finally {if (os != null)os.close();}return state;}private static Workbook createReportWorkbook() {String[] titles = { "时间", "科⽬", "科⽬", "科⽬", "科⽬", "备注" };String[] handClum = { "0,1,0,0", "0,0,1,4", "0,1,5,5" };String[] titles2 = { "时间", "科⽬⼀", "科⽬⼆", "科⽬三", "科⽬四", "备注" };// 创建HSSFWorkbook对象,对应⼀个Excel⽂件HSSFWorkbook wb = new HSSFWorkbook();// 在wb中添加⼀个sheet,对应Excel⽂件中的sheetHSSFSheet sheet = wb.createSheet("test");CellStyle style = wb.createCellStyle();style.setAlignment(HorizontalAlignment.CENTER);// 设置单元格⽔平居中style.setVerticalAlignment(VerticalAlignment.CENTER);// 设置单元格垂直居中for (int i = 0; i < titles.length; i++) {sheet.setColumnWidth(i, 5000);}// 在sheet中添加表头第0⾏,注意⽼版本poi对Excel的⾏数列数有限制shortHSSFRow row = sheet.createRow(0);// 创建表头1for (int i = 0; i < titles.length; i++) {HSSFCell cell = row.createCell(i);cell.setCellStyle(style);cell.setCellValue(titles[i]);}// 动态合并单元格for (int i = 0; i < handClum.length; i++) {// sheet.autoSizeColumn(i, true);String[] temp = handClum[i].split(",");Integer startrow = Integer.parseInt(temp[0]);Integer overrow = Integer.parseInt(temp[1]);Integer startcol = Integer.parseInt(temp[2]);Integer overcol = Integer.parseInt(temp[3]);sheet.addMergedRegion(new CellRangeAddress(startrow, overrow, startcol, overcol));}row = sheet.createRow(1);// 创建表头2for (int i = 0; i < titles2.length; i++) {HSSFCell cell = row.createCell(i);cell.setCellStyle(style);cell.setCellValue(titles2[i]);}List<keMu> kemus = new ArrayList<keMu>();for (int i = 0; i < 1000; i++) {keMu kemu = new keMu();kemu.setCreateDate("2018/11/06");kemu.setKe1("理论" + i);kemu.setKe2("模拟" + i);kemu.setKe3("上机" + i);kemu.setKe4("实操" + i);kemu.setRemark("通过");kemus.add(kemu);}// 填充数据if (kemus != null && kemus.size() > 0) {for (int i = 0; i < kemus.size(); i++) {HSSFRow contentRow = sheet.createRow(i + 2);// 填充类容,从第2⾏开始,0⾏给表头for (int j = 0; j < titles2.length; j++) {HSSFCell cell = contentRow.createCell(j);cell.setCellStyle(style);keMu content = kemus.get(i);switch (j) {case 0:cell.setCellValue(content.getCreateDate());break;case 1:cell.setCellValue(content.getKe1());break;case 2:cell.setCellValue(content.getKe2());break;case 3:cell.setCellValue(content.getKe3());break;case 4:cell.setCellValue(content.getKe4());break;case 5:cell.setCellValue(content.getRemark());break;}}}}return wb;}static class keMu {private String createDate;private String ke1;private String ke2;private String ke3;private String ke4;private String remark;public String getCreateDate() {return createDate;}public void setCreateDate(String createDate) {this.createDate = createDate;}public String getKe1() {return ke1;}public void setKe1(String ke1) {this.ke1 = ke1;}public String getKe2() {return ke2;}public void setKe2(String ke2) {this.ke2 = ke2;}public String getKe3() {return ke3;}public void setKe3(String ke3) {this.ke3 = ke3;}public String getKe4() {return ke4;}public void setKe4(String ke4) {this.ke4 = ke4;}public String getRemark() {return remark;}public void setRemark(String remark) {this.remark = remark;}}}。
Apache POI HSSF and SSF 快速指南 帮助 API poi
Apache POI HSSF and XSSF 快速指南帮助文档API 目录Apache POI HSSF and XSSF 快速指南帮助文档API参考版本为: 代码测试所用软件:NetBeans 希望对大家有所帮助提示:测试代码需要导入poi的全部以jar结尾的文件,导入到库中2016/10/18 Tuesday1、如何创建一个新的WorkbookWorkbook wb = new HSSFWorkbook();FileOutputStream fileOut = new FileOutputStream("");(fileOut);();Workbook wb = new XSSFWorkbook();FileOutputStream fileOut = new FileOutputStream("");(fileOut);();2、如何创建一个表Workbook wb = new HSSFWorkbook(); etCellValue;(2).setCellValue(("This is a string"));(3).setCellValue(true);etFormat("m/d/yy h:mm"));cell = (1);(new Date());(cellStyle);etCellValue;(1).setCellValue(new Date());(2).setCellValue());(3).setCellValue("a string");(4).setCellValue(true);(5).setCellType;ls HSSFWorkbook或.xlsx XSSFWorkbook)时,可以从文件或InputStream加载Workbook 。
使用File对象允许较低的内存消耗,而InputStream需要更多的内存,因为它必须缓冲整个文件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2010-08-08
2 本文翻译自 /spreadsheet/quick-guide.html 欢迎交流指正
岑坚(高凯)
POI3.5 HSSF&XSSF Excel 操作快速入门
POI3.5 HSSF&XSSF Excel 操作快速入门
岑坚(高凯)翻译 2010-08-08
1 本文翻译自 /spreadsheet/quick-guide.html 欢迎交流指正
岑坚(高凯)
POI3.5 HSSF&XSSF Excel 操作快速入门
写在前面
想尽快的使用 HSSF 和 XSSF 对电子表格进行操作吗?这个指南正是您所需要的。 现在稳定的 POI 的版本为 3.6。但最近在查阅 POI 的资料时发现,虽然资料很多, 但是大都局限于 2.x 的版本,3.x 中文资料比较少,查阅 apache 网站的时候发 现了这份文档,看着不错,就翻译了一下,希望能够对大家有所帮助。由于时间 仓促难免有翻译不当之处,还望不吝赐教,费神指正,感激不尽!
3 本文翻译自 /spreadsheet/quick-guide.html 欢迎交流指正
岑坚(高凯)
POI3.5 HSSF&XSSF Excel 操作快速入门
图形和 Graphics2d 类 ................................................................................................... 24 提纲 ................................................................................................................................. 25 图像处理 ......................................................................................................................... 26 关联范围和关联单元格 ................................................................................................. 27 为单元格添加注释 ......................................................................................................... 30 根据内容调整单元格的宽度 ......................................................................................... 31 超级链接 ......................................................................................................................... 31 数据验证 ......................................................................................................................... 33 嵌入其他资源对象 ......................................................................................................... 35