POI实现导出复杂Excel(动态行,复杂单元格,水印,Excel转换为PDF)。

 

一、POI 表格框架

1.POI : POI提供API给Java程序对Microsoft Office格式档案读和写的功能

2.HSSF:Horrible SpreadSheet Format,为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型”

3.POI 文档结构类

 HSSFWorkbook 文档对象,HSSFSheet  页,HSSFRow 行,HSSFCell 单元格,HSSFFont 字体, HSSFName 名称,HSSFDataFormat 日期格式

 HSSFHeader 表头,HSSFFooter 表尾,HSSFCellStyle 单元格样式,HSSFDateUtil 日期,HSSFPrintSetup 打印, HSSFErrorConstants 错误信息表

二、POI  文件类型

         类                                      文件                                                                         jar

     HSSF -- 提供读写Microsoft  Excel  XLS格式档案的功能                                 poi
  XSSF -- 提供读写Microsoft  Excel  OOXML  XLSX格式档案的功能              poi--ooxml
  HWPF -- 提供读写Microsoft  Word  DOC格式档案的功能        poi-scratchpad
  HSLF -- 提供读写Microsoft  PowerPoint格式档案的功能         poi-scratchpad
  HDGF -- 提供读Microsoft  Visio格式档案的功能            poi-scratchpad
  HPBF -- 提供读Microsoft  Publisher格式档案的功能          poi-scratchpad
  HSMF -- 提供读Microsoft  Outlook格式档案的功能            poi-scratchpad

 原Excel模板   脱产培训与网络培训两个列表不相同,并且为动态,数据条数未知,所以要动态添加数据与动态合并单元格。

 

需求如此,多以抛弃使用模板填充方式,改为从第一行构建到最后一行,并且将excel添加水印转换成pdf。

POI  Jar包  版本之间差异看官网,尽量用新的

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.15</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.15</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>3.15</version>
        </dependency>

PDF转换Jar包 了解工具直接搜索jar包名称就行

        <dependency>
            <groupId>com.bc.ext</groupId>
            <artifactId>spire.xls.free</artifactId>
            <version>5.1.0</version>
        </dependency>

业务代码,具体行都有注释。

public File createExcel(HashMap<String, Object> resultMap, List<Map<String, Object>> actualList, List<Map<String, Object>> netWorkList, HttpServletResponse response){
        /** 第一步,创建一个Workbook,对应一个Excel文件  */
        XSSFWorkbook wb = new XSSFWorkbook();

        /** 第二步,在Workbook中添加一个sheet,对应Excel文件中的sheet  */
        XSSFSheet sheet = wb.createSheet("sheet1");

        //设置每个列有多宽  100为单位好计算
        sheet.setColumnWidth(0,100 * 12);
        sheet.setColumnWidth(1,100 * 19);
        sheet.setColumnWidth(2,100 * 38);
        sheet.setColumnWidth(3,100 * 38);
        sheet.setColumnWidth(4,100 * 38);
        sheet.setColumnWidth(5,100 * 38);
        sheet.setColumnWidth(6,100 * 38);

        /** 第三步,设置样式以及字体样式*/
        XSSFCellStyle titleStyle = createTitleCellStyle(wb);
        XSSFCellStyle headerStyle = createHeadCellStyle(wb);
        XSSFCellStyle contentStyle = createContentCellStyle(wb);

        /** 第四步,创建标题 ,合并标题单元格 */

        // 行号
        int rowNum = 0;

        // 创建第一页的第一行,索引从0开始
        XSSFRow row0 = sheet.createRow(rowNum++);
        row0.setHeight((short) 800);// 设置行高
        String title = "公务员培训情况备案表";
        XSSFCell c00 = row0.createCell(0);
        c00.setCellValue(title);
        c00.setCellStyle(titleStyle);
        // 合并单元格,参数依次为起始行,结束行,起始列,结束列 (索引0开始)
        sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 6));//标题合并单元格操作,6为总列数


        // 第二行
        XSSFRow row1 = sheet.createRow(rowNum++);
        row1.setHeight((short) 700);
        String[] row_first = {"年度","", "", "", "", "", ""};

        for (int i = 0; i < row_first.length; i++) {
            XSSFCell tempCell = row1.createCell(i);
            tempCell.setCellStyle(headerStyle);
            if (i == 0) {
                tempCell.setCellValue(Convert.toStr(resultMap.get("year")) + row_first[i]);
            }else {
                tempCell.setCellValue(row_first[i]);
            }
        }

        // 合并单元格,参数依次为起始行,结束行,起始列,结束列 (索引0开始)
        sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, 6));//标题合并单元格操作,7为总列数

        //第三行
        XSSFRow row2 = sheet.createRow(rowNum+
  • 5
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值