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

这篇博客介绍了如何利用Apache POI库在Java中动态生成包含复杂单元格和水印的Excel文件,并将其转换为PDF。首先,详细解释了POI的不同组件和文件类型,然后讨论了在处理动态行数和合并单元格的需求时避免使用模板的方法。博主分享了具体的业务代码,并提到了选择最新版POI Jar包的重要性。最后,提供了自定义单元格样式的工具方法,以及将Excel转换为PDF的流程。
摘要由CSDN通过智能技术生成

 

一、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+
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值