POI Excel导出单元格样式设置

  • 需求

项目通过前端页面开发了一个类似Excel的编辑控件,模仿Excel的(水平居中、水平居左、水平居右、竖直居中、竖直偏上、竖直偏下、字体类型、字体大小、字体加粗、下划线功能,数据保存入库后,最终导出到Excel中。

  • 设计

用POI(Apache)、JXL(jExcelAPI)导出Excel是常用的选择,根据需求描述,不能通过设置Excel模板然后动态设置替换值来处理,我选择的是POI框架,在开发的过程中发现POI有两套API HSSF(针对2003-97版本的Excel)文件结尾必须是.xls,XSSF (针对2007~2013版本的Excel)文件结尾必须是.xlsx。

 

  1. 创建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)部分的内容,调用这样的APIXSSFWorkbook创建工作薄,输出.xlsx 2007~2013版本的Excel文件),这个时候中间我们创建的【每个单元格样式在应用的时候不会丢失】,只是我们要考虑每个单元格都创建样式的性能。

注:之前一直都被POI Excel cellStyle单元格边框样式的丢失困扰,现在记录下来,以备留用!

  •  问题
  1. HSSFWorkbook创建工作薄,生成.xlsx 结尾的Excel文件 打开文件会弹出错误提示
  2. 同样XSSFWorkbook创建工作薄,生成.xls 结尾的Excel文件 打开文件也会弹出错误提示

 

你可能感兴趣的:(项目管理)