JXLS模板导出EXCEL

来源:互联网 发布:普通话测试软件下载 编辑:程序博客网 时间:2024/04/29 00:54
JXLS模板导出EXCEL
   最近做要做一些报表导出的功能,由于表格内容比较复杂,直接生成excel比较麻烦,所以采用模板的方式来做,可惜自己不了解,也证明了自己技术有多差!通过多次资料,终于找到了适合自己的方法。特此记录,方便以后查找。

   maven用到的包

1
2
3
4
5
6
7
8
9
10
 <dependency>
    <groupId>net.sf.jxls</groupId>
    <artifactId>jxls-core</artifactId>
    <version>1.0.6</version>
</dependency>
<dependency>
    <groupId>net.sf.jxls</groupId>
    <artifactId>jxls-reader</artifactId>
    <version>1.0.6</version>
</dependency>

Service代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public void exportChargeCount(String yearMonth, String buildId, HttpServletRequest request,HttpServletResponse response) 
    {
        String templateFile = request.getSession().getServletContext().getRealPath("/")+"/doc/reportTmp/billingInfo.xls";
        Date date = BillingDateUtil.getBillingEndTime(Integer.valueOf(yearMonth.substring(04)),Integer.valueOf(yearMonth.substring(57)));
        String buildName = dataCenter.getBuildInfoById(buildId).getBuildName();
        String fileName = buildName+"("+yearMonth+")客户汇总报表.xls";
        List<ChargeCountVO> list =  this.reportDao.getChargeCount(DateUtil.getFormatNormal(date), buildId);
        Map<String, Object> context = new HashMap<>();
        XLSTransformer transformer = new XLSTransformer();
         
        float sumMoney = 0;
        for (ChargeCountVO chargeCountVO : list) {
            sumMoney += chargeCountVO.getEnergyMoney();
        }
         
        context.put("billingList", list);
        context.put("sumMoney", sumMoney);
        context.put("billingDate", yearMonth);
        context.put("buildName",buildName );
         
        try {
            response.setContentType("application/vnd.ms-excel");  
            response.setHeader("Content-disposition""attachment;filename="+new String( fileName.getBytes("GBK"), "ISO8859-1" ));
            Workbook workbook =  transformer.transformXLS(new FileInputStream(templateFile), context);
            OutputStream ouputStream = response.getOutputStream();
            workbook.write(ouputStream);  
            ouputStream.flush();  
            ouputStream.close();  
        catch (ParsePropertyException e) {
            e.printStackTrace();
        catch (InvalidFormatException e) {
            e.printStackTrace();
        catch (IOException e) {
            e.printStackTrace();
        }
    }

采用键值对的形式


xls模板

wKioL1RzK8mwkiuHAAKM9OX8rJo428.jpg


导出效果

wKiom1RzK-yCIFCJAAZ2YZtagFI834.jpg


大家可能会遇到的问题

1、web下载中文名称不显示的问题

2、模板使用公式,下载下来不计算的问题

3、合并单元格的问题

下面逐一解答

1、中文字符转码

1
response.setHeader("Content-disposition""attachment;filename="+new String( fileName.getBytes("GBK"), "ISO8859-1" ));

2、重新加载模板公式(通用方法)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 /**
     
     * 重新设置单元格计算公式
     
     * */
    private void resetCellFormula(HSSFWorkbook wb)
    {
        HSSFFormulaEvaluator e = new HSSFFormulaEvaluator(wb);
        int sheetNum = wb.getNumberOfSheets();
        for (int i = 0; i < sheetNum; i++)
        {
            HSSFSheet sheet = wb.getSheetAt(i);
            int rows = sheet.getLastRowNum() + 1;
            for (int j = 0; j < rows; j++)
            {
                HSSFRow row = sheet.getRow(j);
                if (row == null)
                    continue;
                int cols = row.getLastCellNum();
                for (int k = 0; k < cols; k++)
                {
                    HSSFCell cell = row.getCell(k);
                    // if (cell != null)
                    // System.out.println("cell["+j+","+k+"]=:"+cell.getCellType());
                    if (cell == null)
                        continue;
                    if (cell.getCellType() == HSSFCell.CELL_TYPE_FORMULA)
                    {
                        cell.setCellFormula(cell.getCellFormula());
                        // System.out.println("----公式:"+cell.getCellFormula());
                        cell = e.evaluateInCell(cell);
                        // System.out.println("-----------"+cell.getNumericCellValue());
                    }
                }
            }
        }
    }

使用方法

wKiom1RzLbbgWz7rAAL_DEUlXHU432.jpg

3、合并单元格

1
2
3
HSSFWorkbook  workbook = (HSSFWorkbook )transformer.transformXLS(new FileInputStream(templateFile), context);
HSSFSheet sheet = workbook.getSheetAt(0); 
sheet.addMergedRegion(new CellRangeAddress(起始行号,截至行号,起始列号,截至列号));

四个参数均从0开始

0 0