欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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