最近需要用java POI实现一个Excel report, 提供一个Excel模板。一开始的思路是想直接读取模板然后写入数据,但是后面觉得用读取模板的方式写入数据还不如自己根据模板写份一模一样的Excel,因为是初次实现这种report,自己动手实现会快点上手。
一开始会觉得有点困难,但是在战略上藐视一下后,发现再难的东西,拆分开来也不过是由一点一滴(即一行一列)组成,其实跟写CSS差不多,只要逐个定义样式并且写入数据就可以了。
在开发的过程中,在成功生成Excel后,我发现双击单元格后(即让单元格处于编辑状态后再让鼠标移走到其他单元格)我原本定义的样式丢失了,单元格恢复到Excel默认的样式,一开始以为是微软office的问题,结果发现并不是,在上网查了一些资料后发现有些网友说是可能是因为样式定义太多了,然后我试着删除一些样式再生成文件,结果发现问题解决了。当然在实际实现中我们并不能随便删除定义好的模板样式,但是因为java中类是引用类型,所以我们可以预先定义需要的Excel样式,然后将它们放到一个Map中,这样就可以解决上面的问题了(建议一开始就应该用一个Map定义好样式,不然到后面发现上述问题后再把样式提取出来是很花费时间的)。
用到的jar文件:
poi-3.9.jar
poi-ooxml-3.9.jar
poi-ooxml-schemas-3.9.jar
dom4j.jar
xmlbeans-2.3.0.jar
Demo实现代码:
http://download.csdn.net/download/lao_fangzi/10133122
定义样式到Map参考如下:
代码块
/**
* set common styles to styleMap
*/
private void initStyle() {
XSSFDataFormat format = wb.createDataFormat();
XSSFDataFormat formatForAdd = wb.createDataFormat();
XSSFDataFormat formatForPercen = wb.createDataFormat();
XSSFDataFormat formatForAddPercen = wb.createDataFormat();
short dataFormatForPercen = formatForPercen.getFormat("0.0%");
short dataFormatForAddPercen = formatForAddPercen.getFormat("+0.0%");
short numFormat = format.getFormat("###,##0");
short numFormatForAdd = formatForAdd.getFormat("+###,##0");
XSSFCellStyle cell_title_style_5 = style.getTitleStyle(ALIGN_CENTER, Font_Arial);
XSSFCellStyle cell_title_style_6 = style.getTitleStyle(ALIGN_CENTER, Font_Calibri);
cell_title_style_6.setBorderBottom(BorderStyle.NONE);
XSSFCellStyle cell_title2_style_6 = style.getTitleStyle(ALIGN_CENTER, Font_Calibri);
cell_title2_style_6.setBorderTop(BorderStyle.NONE);
styleMap.put("cell_title_style_5", cell_title_style_5);
styleMap.put("cell_title_style_6", cell_title_style_6);
styleMap.put("cell_title2_style_6", cell_title2_style_6);
XSSFCellStyle VMTotalContentStyle = style.getVMTotalContentStyle();
XSSFCellStyle totalContentStyle = style.getTotalContentStyle();
VMTotalContentStyle.setDataFormat(dataFormatForPercen);
totalContentStyle.setDataFormat(dataFormatForPercen);
styleMap.put("VMTotalContentStyle", VMTotalContentStyle);
styleMap.put("totalContentStyle", totalContentStyle);
}
类style为自己定义的工具类,此处只是简单实现Excel的Demo,并没有实现代码优化,仅供参考。
代码块
package com;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.RichTextString;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class WritePreRegToExcel {
private static BAReportStyle style;
private static XSSFWorkbook wb;
private static String Font_Arial = "Arial";
private static Map<String, List<PreRe