- 需求
项目通过前端页面开发了一个类似Excel的编辑控件,模仿Excel的(水平居中、水平居左、水平居右、竖直居中、竖直偏上、竖直偏下、字体类型、字体大小、字体加粗、下划线)等功能,数据保存入库后,最终导出到Excel中。
- 设计
用POI(Apache)、JXL(jExcelAPI)导出Excel是常用的选择,根据需求描述,不能通过设置Excel模板然后动态设置替换值来处理,我选择的是POI框架,在开发的过程中发现POI有两套API HSSF(针对2003-97版本的Excel)文件结尾必须是.xls,XSSF (针对2007~2013版本的Excel)文件结尾必须是.xlsx。
- 创建Excel的方式1
public static void main(String[] args) throws Exception { Workbook wb = new HSSFWorkbook();//(2) Sheet sheet = wb.createSheet("new sheet"); for(int i=0;i<2000;i++){ //(1) getStyle(wb); } CellStyle style = getStyle(wb); CellStyle style2 = getStyle2(wb); for(int i=0;i<1000;i++){ Row row = sheet.createRow(i); for(int j=0;j<100;j++){ Cell cell = row.createCell(j); cell.setCellValue("设计"); if(i>5&&j==19){ cell.setCellStyle(style2); }else{ cell.setCellStyle(style); } } } // Write the output to a file FileOutputStream fileOut = new FileOutputStream("workbook.xls");//(3) wb.write(fileOut); fileOut.close(); } public static CellStyle getStyle(Workbook wb ){ CellStyle style = wb.createCellStyle(); style.setBorderBottom(CellStyle.BORDER_THIN); style.setBorderLeft(CellStyle.BORDER_THIN); style.setBorderRight(CellStyle.BORDER_THIN); style.setBorderTop(CellStyle.BORDER_THIN); return style; }
注意(2)、(3)的内容,当对每一个单元格都设置样式的时候,这种方式(通过HSSFWorkbook创建工作薄,输出.xls 2003版本的Excel文件)时,当wb.createCellStyle创建的样式对象太多时,会导致生成的workbook.xls文件样式丢失,我测试发现(1)处的for循环等于43的时候,输出.xls(即生成2003版本的Excel文件)会丢失单元格的边框样式。
2. 创建Excel 方式2
Workbook wb = new XSSFWorkbook();//(1) ... FileOutputStream fileOut = new FileOutputStream("workbook.xlsx");//(2)
注意(1)、(2)部分的内容,调用这样的API(XSSFWorkbook创建工作薄,输出.xlsx 2007~2013版本的Excel文件),这个时候中间我们创建的【每个单元格样式在应用的时候不会丢失】,只是我们要考虑每个单元格都创建样式的性能。
注:之前一直都被POI Excel cellStyle单元格边框样式的丢失困扰,现在记录下来,以备留用!
- 问题
- HSSFWorkbook创建工作薄,生成.xlsx 结尾的Excel文件 打开文件会弹出错误提示
- 同样XSSFWorkbook创建工作薄,生成.xls 结尾的Excel文件 打开文件也会弹出错误提示