为了满足用户Excel报表多变的需求,研究自定义Excel模版及表达式,通过表达式中的属性值 反射 找到对应的值。
初步研究
完成以下功能:
1、单元格一对一填值
2、单独一行表达式的循环
3、遍历多个list出多个表格
4、多个sheet
留下以下问题:
1、一个单元格 同时存在表达式和静态文本
2、一个单元格 同时存在两个以上表达式
4、如何在单独一行表达式的循环中加入静态文本框
3、如何控制多行级循环
现记录在此,供自己以后参考,要解决复杂报表问题,还有待优化
public class ExcelExportAction<T extends AbstractDomain> extends
AbstractAction<T> {
// 第一个F表达式的行号
private int writeRowNum = -1;// 写list数据到excel中的行号
// private ExcelWorkCell[] excelTable ;
private ExcelWorkTable excelTable = null;
private int excelTableRow, excelTableCol;// 暂未使用
private boolean excelTableLoading = false;// 正在装载table中 暂未使用
private HSSFWorkbook workbook = null;
private HSSFDataFormat df = null;// 单元格 格式化对象
/**
* 根据模版导出 单个sheet
*
* @param filename
* 导出的文件名
* @param param
* 导出的数据参数
* @param templatePath
* 模版路径
* @throws Exception
*/
public void export(String filename, Map<String, Object> param,
String templatePath) throws Exception {
init(filename, templatePath);
buildSheet(0, param);
printExcel();
}
/**
* 根据模版导出 多个sheet
*
* @param filename
* 导出的文件名
* @param params
* 导出的数据参数 数组序号与sheet序号匹配
* @param templatePath
* 模版路径
* @throws Exception
*/
public void export(String filename, Map<String, Object>[] params,
String templatePath) throws Exception {
init(filename, templatePath);
// 循环构建sheet
for (int i = 0; i < params.length; i++) {
buildSheet(i, params[i]);
}
printExcel();
}
private void init(String filename, String templatePath) throws Exception {
setResponseHeader(filename);
FileInputStream fi = new FileInputStream(templatePath);
POIFSFileSystem fs = new POIFSFileSystem(fi);
workbook = new HSSFWorkbook(fs);
df = wo