jxl导出excel实践
程序员文章站
2024-02-24 12:49:16
...
最近做了些导出excel,主要分两种,直接导出和根据模板导出两种形式。
值得导出就不说了,网上比较多的例子,
模板导出还是有点意思.
1.先看要导出的模板:
${exportTitle} | ||||||||||
编号:QDZB-6.3-06 | ||||||||||
序号 | 设备名称 | 型号规格 | 启用年份 | 原值(万元) | 安装地点 | 使用单位 | 当前技术状况评估 | |||
${serialNumber} | ${assetName} | ${model} | ${usingDate} | ${preValue} | ${installPlace} | ${usingOuName} | ${assetStatusCn} | |||
${applicantName} | ${depCommentName} | ${zbbmCommentName} |
其中1,2,5行的数据是固定的,第4行动数据是动态生成的,也就是可以循环得出结果。
2.我这里设想就是提供一个通用的导出excel类,用于公用。
比如:ExcelUtils.getInstance().createXlsFileWithList(tplXlsFilePath, list, outputStream, parameters, dataRowIndex);
tplXlsFilePath:模板的路径,list要循环的数据集合,parameters 是Map对象,存的是不需要循环的数据,dataRowIndex:是指第几行要循环。
3.现在看createXlsFileWithList方法,里面有代码解释,其匹配过程是通过Ognl:
/**
* 根据Xls模板文件创建并填充数据
* @param templateXlsFilePath 获取xls模板文件的路径
* @param dataSourceList 填充的数据对象
* @param exportFilePath 要导出的文件路径
* @param parameters 传入的参数
* @param dataRowIndex 数据起始行索引
* @return
* @throws EgrandException
*/
public void createXlsFileWithList(String templateXlsFilePath,List dataSourceList,String exportFilePath,Map parameters,int dataRowIndex) throws EgrandException{
if(null == templateXlsFilePath || templateXlsFilePath.length() == 0 || null == dataSourceList || dataSourceList.isEmpty())
return ;
logger.debug(" dataSourceList size :"+dataSourceList.size());
logger.debug(" templateXlsFilePath :"+templateXlsFilePath);
try {
logger.debug(" exportFilePath :"+exportFilePath);
//创建导出文件的目录
File exportFile=new File(exportFilePath.substring(0,exportFilePath.lastIndexOf("/")));
logger.debug(" exportFile value:"+exportFile+" path :"+exportFilePath.substring(0,exportFilePath.lastIndexOf("/")));
if(!exportFile.exists() || !exportFile.isDirectory()){
exportFile.mkdirs();
}
FileOutputStream outStream = new FileOutputStream(exportFilePath);
//定义正则表达式匹配对象
Pattern pattern = Pattern.compile("\\$\\{(.*)\\}");
// Excel获得文件
Workbook templateWorkbook = Workbook.getWorkbook(new File(templateXlsFilePath));
// 打开一个文件的副本,并且指定数据写回到原文件
WritableWorkbook book = Workbook.createWorkbook(outStream, templateWorkbook);
// 添加一个工作表
WritableSheet sheet = book.getSheet(0);
//获取工作表格中的行数
int rows = sheet.getRows();
//获取工作表格中的列数
int cols = sheet.getColumns();
//正则表达式的匹配对象
Matcher matcher=null;
//单元格的格式对象
CellFormat cellFormat=null;
//获取数据表达式
Map patternColumMap=new HashMap();
//单元格对象
Cell curCell=null;
for (int row = 0; row 0)
sheet.insertRow(currDataStartRowIndex);
for(Iterator patternColIterator=patternColumMap.keySet().iterator();patternColIterator.hasNext();){
String patternColumnName=(String)patternColIterator.next();
Object value=null;
try{
value = Ognl.getValue(patternColumnName, domain);
logger.debug(" property name :"+patternColumnName+" value:"+value);
}catch(OgnlException ex){
ex.printStackTrace();
}
Label tempLabel=(Label)patternColumMap.get(patternColumnName);
sheet.addCell(new Label(tempLabel.getColumn(), currDataStartRowIndex, null == value ? "" : value.toString(),tempLabel.getCellFormat()));
colIndex++;
}
index++;
}
book.write();
book.close();
outStream.flush();
outStream.close();
} catch (Exception ex) {
throw new EgrandException(ex);
}
}
4.操作起来还是比较简单,方法可以不断改善,做到更符合实际,这是上传了ExcelUtils工具包,可以不断改进
,还有一些比较好导出excel的网上资料:http://jxls.sourceforge.net/samples/collectionsample.html。
下一篇: jxl导出excel