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

这篇具有很好参考价值的文章主要介绍了POI实现导出复杂Excel(动态行,复杂单元格,水印,Excel转换为PDF)。。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 文章来源地址https://www.toymoban.com/news/detail-457651.html

一、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模板   脱产培训与网络培训两个列表不相同,并且为动态,数据条数未知,所以要动态添加数据与动态合并单元格。

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

需求如此,多以抛弃使用模板填充方式,改为从第一行构建到最后一行,并且将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++);
        row2.setHeight((short) 700);
        String[] row_2_str = {"姓名","", Convert.toStr(resultMap.get("name")), "性别", Convert.toStr(resultMap.get("sex")), "政治面貌", Convert.toStr(resultMap.get("politicVal"))};
        for (int i = 0; i < row_2_str.length; i++) {
            XSSFCell tempCell = row2.createCell(i);
            tempCell.setCellStyle(headerStyle);
            tempCell.setCellValue(row_2_str[i]);
        }

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


        //第四行
        XSSFRow row3 = sheet.createRow(rowNum++);
        row3.setHeight((short) 700);
        String[] row_3_str = {"学历","",Convert.toStr(resultMap.get("educationVal")), "行政级别",Convert.toStr(resultMap.get("administrationVal")), "",""};
        for (int i = 0; i < row_3_str.length; i++) {
            XSSFCell tempCell = row3.createCell(i);
            tempCell.setCellStyle(headerStyle);
            tempCell.setCellValue(row_3_str[i]);
        }

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

        //第五行
        XSSFRow row4 = sheet.createRow(rowNum++);
        row4.setHeight((short) 700);
        String[] row_4_str = {"单位名称","",Convert.toStr(resultMap.get("companyName")), "内设机构",Convert.toStr(resultMap.get("mechanism")), "职务",Convert.toStr(resultMap.get("studentDuties"))};
        for (int i = 0; i < row_4_str.length; i++) {
            XSSFCell tempCell = row4.createCell(i);
            tempCell.setCellStyle(headerStyle);
            tempCell.setCellValue(row_4_str[i]);
        }

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

        //第六行
        XSSFRow row5 = sheet.createRow(rowNum++);
        row5.setHeight((short) 700);
        String[] row_5_str = {"脱产培训","培训班名称","", "培训时间","", "主办单位","学分"};
        for (int i = 0; i < row_5_str.length; i++) {
            XSSFCell tempCell = row5.createCell(i);
            tempCell.setCellStyle(headerStyle);
            tempCell.setCellValue(row_5_str[i]);
        }

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


        //第六行带的数据  循环插入

        for (Map<String, Object> actuaLData : actualList) {
            XSSFRow tempRow = sheet.createRow(rowNum++);
            tempRow.setHeight((short) 700);
            // 循环单元格填入数据
            for (int j = 0; j < 7; j++) {
                XSSFCell tempCell = tempRow.createCell(j);
                tempCell.setCellStyle(contentStyle);
                String tempValue;
                if (j == 0) {
                    tempValue = "";
                } else if (j == 1) {
                    tempValue = Convert.toStr(actuaLData.get("actualName"));
                } else if (j == 2) {
                    tempValue = "";
                } else if (j == 3) {
                    tempValue = Convert.toStr(actuaLData.get("actualTime"));
                } else if (j == 4) {
                    tempValue = "";
                } else if (j == 5) {
                    tempValue = Convert.toStr(actuaLData.get("actualOrgan"));
                } else {
                    tempValue = Convert.toStr(actuaLData.get("actualPoint"));
                }
                tempCell.setCellValue(tempValue);
            }
            sheet.addMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 1, 2));//标题合并单元格操作,7为总列数
            sheet.addMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 3, 4));//标题合并单元格操作,7为总列数
        }



        //培训班小计行
        XSSFRow rowxj = sheet.createRow(rowNum++);
        rowxj.setHeight((short) 700);
        String[] row_xj_str = {"","小计","", "","", "",Convert.toStr(resultMap.get("totalActualPoint"))};
        for (int i = 0; i < row_5_str.length; i++) {
            XSSFCell tempCell = rowxj.createCell(i);
            tempCell.setCellStyle(headerStyle);
            tempCell.setCellValue(row_xj_str[i]);
        }

        // 合并单元格,参数依次为起始行,结束行,起始列,结束列 (索引0开始)
        //此处没有任何问题,程序不让运行,就给捕获了,不用操作别的,之后的代码也是一样
        try {
            sheet.addMergedRegion(new CellRangeAddress(rowNum-1, rowNum - 1, 1, 5));//标题合并单元格操作,7为总列数
            sheet.addMergedRegion(new CellRangeAddress(5, rowNum - 1, 0, 0));//标题合并单元格操作,7为总列数
        } catch (Exception e){

        }

        //网络培训标题行
        XSSFRow rowNetworkTitle = sheet.createRow(rowNum++);
        rowNetworkTitle.setHeight((short) 700);
        String[] row_networkTitle_str = {"网络培训","所学课程类别","", "","", "课程数","学分"};
        for (int i = 0; i < row_networkTitle_str.length; i++) {
            XSSFCell tempCell = rowNetworkTitle.createCell(i);
            tempCell.setCellStyle(headerStyle);
            tempCell.setCellValue(row_networkTitle_str[i]);
        }

        try {
            // 合并单元格,参数依次为起始行,结束行,起始列,结束列 (索引0开始)
            sheet.addMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 1, 4));//标题合并单元格操作,7为总列数
        } catch (Exception e){

        }

        //做标记,动态计算坐标合并
        int startIndex = rowNum - 1;
        //网络培训list数据填充
        for (Map<String, Object> networkData : netWorkList) {
            XSSFRow tempRow = sheet.createRow(rowNum++);
            tempRow.setHeight((short) 700);
            // 循环单元格填入数据
            for (int j = 0; j < 7; j++) {
                XSSFCell tempCell = tempRow.createCell(j);
                tempCell.setCellStyle(contentStyle);
                String tempValue;
                if (j == 0) {
                    tempValue = "";
                } else if (j == 1) {
                    tempValue = Convert.toStr(networkData.get("name"));
                } else if (j == 2) {
                    tempValue = "";
                } else if (j == 3) {
                    tempValue = "";
                } else if (j == 4) {
                    tempValue = "";
                } else if (j == 5) {
                    tempValue = Convert.toStr(networkData.get("networkCount"));
                } else {
                    tempValue = Convert.toStr(networkData.get("point"));
                }
                tempCell.setCellValue(tempValue);
            }
            sheet.addMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 1, 4));//标题合并单元格操作,7为总列数
        }

        //网络培训专题班行
        XSSFRow rowNetworkZtb = sheet.createRow(rowNum++);
        rowNetworkZtb.setHeight((short) 700);
        String[] row_NetworkZtb_str = {"","专题班","", "","", Convert.toStr(resultMap.get("lessonCount")),Convert.toStr(resultMap.get("pointSum"))};
        for (int i = 0; i < row_NetworkZtb_str.length; i++) {
            XSSFCell tempCell = rowNetworkZtb.createCell(i);
            tempCell.setCellStyle(headerStyle);
            tempCell.setCellValue(row_NetworkZtb_str[i]);
        }
        //合并
        try {
            sheet.addMergedRegion(new CellRangeAddress(rowNum-1, rowNum - 1, 1, 4));//标题合并单元格操作,7为总列数
        } catch (Exception e){

        }

        // 合并单元格,参数依次为起始行,结束行,起始列,结束列 (索引0开始)
        //此处没有任何问题,程序不让运行,就给捕获了,不用操作别的,之后的代码也是一样

        //网络培训小计行
        XSSFRow rowNetworkXj = sheet.createRow(rowNum++);
        rowNetworkXj.setHeight((short) 700);
        String[] row_NetworkXj_str = {"","小计","", "","", Convert.toStr(resultMap.get("networkCount")),Convert.toStr(resultMap.get("networkPoint"))};
        for (int i = 0; i < row_NetworkXj_str.length; i++) {
            XSSFCell tempCell = rowNetworkXj.createCell(i);
            tempCell.setCellStyle(headerStyle);
            tempCell.setCellValue(row_NetworkXj_str[i]);
        }

        // 合并单元格,参数依次为起始行,结束行,起始列,结束列 (索引0开始)
        //此处没有任何问题,程序不让运行,就给捕获了,不用操作别的,之后的代码也是一样
        try {
            sheet.addMergedRegion(new CellRangeAddress(rowNum-1, rowNum - 1, 1, 4));//标题合并单元格操作,7为总列数
            sheet.addMergedRegion(new CellRangeAddress(startIndex, rowNum - 1, 0, 0));//标题合并单元格操作,7为总列数
        } catch (Exception e){

        }

        //年度完成专题班行
        XSSFRow rowYearNetwork = sheet.createRow(rowNum++);
        rowYearNetwork.setHeight((short) 700);
        String yearNetwork =  Convert.toStr(resultMap.get("yearNetwork"));
        String[] row_YearNetwork_str;
        if (yearNetwork == null){
            row_YearNetwork_str = new String[]{"年度完成专题班", "", "", "", "", "个", ""};
        }else {
           row_YearNetwork_str = new String[]{"年度完成专题班", "", "", "", "", Convert.toStr(resultMap.get("yearNetworkCount")) + "个", ""};
        }
        for (int i = 0; i < row_YearNetwork_str.length; i++) {
            XSSFCell tempCell = rowYearNetwork.createCell(i);
            tempCell.setCellStyle(headerStyle);
            tempCell.setCellValue(row_YearNetwork_str[i]);
        }

        // 合并单元格,参数依次为起始行,结束行,起始列,结束列 (索引0开始)
        //此处没有任何问题,程序不让运行,就给捕获了,不用操作别的,之后的代码也是一样
        try {
            sheet.addMergedRegion(new CellRangeAddress(rowNum-1, rowNum - 1, 0, 4));//标题合并单元格操作,7为总列数
            sheet.addMergedRegion(new CellRangeAddress(rowNum-1, rowNum - 1, 5, 6));//标题合并单元格操作,7为总列数
        } catch (Exception e){

        }

        //学分合计行
        XSSFRow rowPointCount = sheet.createRow(rowNum++);
        rowPointCount.setHeight((short) 700);
        String[] row_PointCount_str = new String[]{"学分合计", "", "", "", "", Convert.toStr(resultMap.get("yearPoint")), ""};
        for (int i = 0; i < row_PointCount_str.length; i++) {
            XSSFCell tempCell = rowPointCount.createCell(i);
            tempCell.setCellStyle(headerStyle);
            tempCell.setCellValue(row_PointCount_str[i]);
        }

        // 合并单元格,参数依次为起始行,结束行,起始列,结束列 (索引0开始)
        //此处没有任何问题,程序不让运行,就给捕获了,不用操作别的,之后的代码也是一样
        try {
            sheet.addMergedRegion(new CellRangeAddress(rowNum-1, rowNum - 1, 0, 4));//标题合并单元格操作,7为总列数
            sheet.addMergedRegion(new CellRangeAddress(rowNum-1, rowNum - 1, 5, 6));//标题合并单元格操作,7为总列数
        } catch (Exception e){

        }

        //excel底部两行
        XSSFRow rowUnder2 = sheet.createRow(rowNum++);
        rowUnder2.setHeight((short) 900);
        String[] row_Under2_str = new String[]{"主管部门意见", "", "", Convert.toStr(resultMap.get("is")), "", "", ""};
        for (int i = 0; i < row_Under2_str.length; i++) {
            XSSFCell tempCell = rowUnder2.createCell(i);
            tempCell.setCellStyle(headerStyle);
            tempCell.setCellValue(row_Under2_str[i]);
        }

        try {
            sheet.addMergedRegion(new CellRangeAddress(rowNum-1, rowNum - 1, 3, 6));//标题合并单元格操作,7为总列数
        } catch (Exception e){

        }

        XSSFRow rowUnder1 = sheet.createRow(rowNum++);
        rowUnder1.setHeight((short) 800);
        String[] row_Under1_str = new String[]{"", "", "", "", "", Convert.toStr(resultMap.get("pdfTime")), ""};
        for (int i = 0; i < row_Under1_str.length; i++) {
            XSSFCell tempCell = rowUnder1.createCell(i);
            tempCell.setCellStyle(headerStyle);
            tempCell.setCellValue(row_Under1_str[i]);
        }

        // 合并单元格,参数依次为起始行,结束行,起始列,结束列 (索引0开始)
        //此处没有任何问题,程序不让运行,就给捕获了,不用操作别的,之后的代码也是一样
        try {
            sheet.addMergedRegion(new CellRangeAddress(rowNum-1, rowNum - 1, 3, 4));//标题合并单元格操作,7为总列数
            sheet.addMergedRegion(new CellRangeAddress(rowNum-1, rowNum - 1, 5, 6));//标题合并单元格操作,7为总列数
            sheet.addMergedRegion(new CellRangeAddress(rowNum-2, rowNum - 1, 0, 2));//标题合并单元格操作,7为总列数
        } catch (Exception e){

        }

        //备注行
        XSSFRow rowremarks = sheet.createRow(rowNum++);
        rowremarks.setHeight((short) 1300);
        String[] row_remarks_str = new String[]{"注:根据《干部教育培训工作条例》,干部参加教育培训,每年累计不少于12天或者90学时,因故未按规定参加教育培训或者未达到教育培训要求的,应当及时补训。干部教育培训考核不合格的,年度考核不得确定为优秀等次。", "", "", "", "","", ""};
        for (int i = 0; i < row_remarks_str.length; i++) {
            XSSFCell tempCell = rowremarks.createCell(i);
            tempCell.setCellStyle(headerStyle);
            tempCell.setCellValue(row_remarks_str[i]);
        }

        // 合并单元格,参数依次为起始行,结束行,起始列,结束列 (索引0开始)
        //此处没有任何问题,程序不让运行,就给捕获了,不用操作别的,之后的代码也是一样
        try {
            sheet.addMergedRegion(new CellRangeAddress(rowNum-1, rowNum - 1, 0, 6));//标题合并单元格操作,7为总列数
        } catch (Exception e){

        }

        try {
            //添加图片水印
            FileOutputStream fileOut = null;
            BufferedImage bufferImg = null;

            ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
            //加载图片
            bufferImg = ImageIO.read(new File("src/main/resources/static/template/peqk.png"));


            ImageIO.write(bufferImg, "png", byteArrayOut);

            XSSFDrawing patriarch = sheet.createDrawingPatriarch();
            XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0,5, rowNum-3, 7,rowNum-1 );
            //插入图片 1
            patriarch.createPicture(anchor, wb.addPicture(byteArrayOut.toByteArray(), XSSFWorkbook.PICTURE_TYPE_PNG));

//            // 输出文件
//            wb.write(fileOut);

        } catch (Exception e){
            e.printStackTrace();
        }

        File fileExcel = xssfWorkbookToFile(wb, "src/main/resources/static/template/peqk.xlsx");

        ExcelToPdf excelToPdf = new ExcelToPdf();
        excelToPdf.sheetToPdf("src/main/resources/static/template/peqk.xlsx", "src/main/resources/static/template/peqk.pdf");
        File filePdf = new File("src/main/resources/static/template/peqk.pdf");



        ServletOutputStream out = null;
        try{

            out = response.getOutputStream();

            /** 导出pdf文件流 */
            response.setCharacterEncoding("UTF-8");
            response.setContentType("application/pdf");
            response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "inline; filename="+ URLEncoder.encode("公务员培训情况备案表.pdf","UTF-8"));


            FileInputStream inputStream = new FileInputStream(filePdf);
            // 读取文件流
            int len = 0;
            byte[] buffer = new byte[1024 * 10];
            while ((len = inputStream.read(buffer)) != -1) {
                out.write(buffer, 0, len);
            }
            out.close();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            fileExcel.delete();

            filePdf.delete();
        }



        return null;
    }

 下面是工具方法,样式为自定义,如果想添加表格背景颜色,字体,都是可以定义的,具体查询poi的api


    /**
     * 讲ex对象转换成文件
     * @param wb
     * @param name
     * @return
     */
    public static File xssfWorkbookToFile(XSSFWorkbook wb, String name) {
        File toFile = new File(name);
        try {
            OutputStream os = new FileOutputStream(toFile);
            wb.write(os);
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return toFile;
    }


    /**
     * 创建标题样式
     * @param wb
     * @return
     */
    private static XSSFCellStyle createTitleCellStyle(XSSFWorkbook wb) {
        XSSFCellStyle cellStyle = wb.createCellStyle();
        cellStyle.setAlignment(HorizontalAlignment.CENTER);//水平居中
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直对齐
        cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
//        cellStyle.setBorderBottom(BorderStyle.THIN); //下边框
//        cellStyle.setBorderLeft(BorderStyle.THIN); //左边框
//        cellStyle.setBorderRight(BorderStyle.THIN); //右边框
//        cellStyle.setBorderTop(BorderStyle.THIN); //上边框
//        cellStyle.setFillForegroundColor(IndexedColors.GREY_40_PERCENT.getIndex());//背景颜色

        XSSFFont headerFont1 = (XSSFFont) wb.createFont(); // 创建字体样式
//        headerFont1.setBold(true); //字体加粗
        headerFont1.setFontName("宋体"); // 设置字体类型
        headerFont1.setFontHeightInPoints((short) 17); // 设置字体大小
        cellStyle.setFont(headerFont1); // 为标题样式设置字体样式

        return cellStyle;
    }

    /**
     * 创建表头样式
     * @param wb
     * @return
     */
    private static XSSFCellStyle createHeadCellStyle(XSSFWorkbook wb) {
        XSSFCellStyle cellStyle = wb.createCellStyle();
        cellStyle.setWrapText(true);// 设置自动换行
//        cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());//背景颜色
        cellStyle.setAlignment(HorizontalAlignment.CENTER); //水平居中
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); //垂直对齐
        cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        cellStyle.setBottomBorderColor(IndexedColors.BLACK.index);
        cellStyle.setBorderBottom(BorderStyle.THIN); //下边框
        cellStyle.setBorderLeft(BorderStyle.THIN); //左边框
        cellStyle.setBorderRight(BorderStyle.THIN); //右边框
        cellStyle.setBorderTop(BorderStyle.THIN); //上边框

        XSSFFont headerFont = (XSSFFont) wb.createFont(); // 创建字体样式
//        headerFont.setBold(true); //字体加粗
        headerFont.setFontName("宋体"); // 设置字体类型
        headerFont.setFontHeightInPoints((short) 16); // 设置字体大小
//        cellStyle.setFont(headerFont); // 为标题样式设置字体样式

        return cellStyle;
    }

    /**
     * 创建内容样式
     * @param wb
     * @return
     */
    private static XSSFCellStyle createContentCellStyle(XSSFWorkbook wb) {
        XSSFCellStyle cellStyle = wb.createCellStyle();
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 垂直居中
        cellStyle.setAlignment(HorizontalAlignment.CENTER);// 水平居中
        cellStyle.setWrapText(true);// 设置自动换行
        cellStyle.setBorderBottom(BorderStyle.THIN); //下边框
        cellStyle.setBorderLeft(BorderStyle.THIN); //左边框
        cellStyle.setBorderRight(BorderStyle.THIN); //右边框
        cellStyle.setBorderTop(BorderStyle.THIN); //上边框

        // 生成12号字体
        XSSFFont font = wb.createFont();
        font.setColor((short)8);
        font.setFontHeightInPoints((short) 12);
        cellStyle.setFont(font);

        return cellStyle;
    }

 最终结果为 pdf 向导出excel把转换pdf的语句删掉就可以了

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

 

到了这里,关于POI实现导出复杂Excel(动态行,复杂单元格,水印,Excel转换为PDF)。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java使用poi导出excel针对不同数据列配置设置不同单元格格式(适用于通用导出excel数据)

    公司大部分业务都是查询相关的业务, 所以建了一个项目专门做数据查询, 数据中转等抽象通用的业务, 有一天给我安排了一个功能, 做excel导出, 配置好查询sql和表头字段映射后即可导出excel, 无需修改代码 后来因为导出数据要求保留几位小数或者转换成百分比等设置单元格格

    2024年02月07日
    浏览(55)
  • java poi导出excel单元格设置自定义背景颜色(任意颜色)

    一、思考过程(看代码的移步第二点) 现有方法 现有资料多为使用 IndexedColors 设置颜色, 但是IndexedColors能设置的颜色有限 ,而需求中所要颜色都是花里胡哨的,需要真正的自定义; 而颜色的本质是rgb ,所以只要我们能自己设置rgb的值就能获取任意想要的颜色了; 源码分

    2023年04月10日
    浏览(43)
  • 若依框架自定义导出Excel多sheet页+合并单元格(Poi)

    先看效果:     在用若依框架是发现自带的导出功能中并不能导出多个sheet和合并单元格,所以我在这里做了修改希望可以帮到你,用到的点个赞呗! 我们先一步步来 整个程序的思路为先返回下载地址,然后根据下载地址去下载excel 首先是我们需要excel的下载地址,这里我们

    2024年02月03日
    浏览(47)
  • 前端vue+elementui导出复杂(单元格合并,多级表头)表格el-table转为excel导出

    需求 :前端对el-table表格导出 插件 : npm install xlsx -S npm install file-saver --save 原理 :直接导出el-table的表格里面的数据,这样就会存在缺点,只会导出当前页面的数据,如果需要导出全部数据,可以自己重新渲染一个全部数据不可见的el-table表格,来导出就可以了 扩展 :经过

    2024年02月04日
    浏览(66)
  • POI 实现Excel导入导出

    什么是POI Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能。POI为“Poor Obfuscation Implementation”的首字母缩写,意为“简洁版的模糊实现”。 生成xls和xlsx有什么区别呢? XLS XLSX 只能打开xls格式,无法直接打开x

    2024年02月03日
    浏览(42)
  • poi实现Excel文件的导入导出

    poi结构说明 引入poi依赖包 第一步、获取表内容数据: 根据表头内容与实体类属性对应的map,利用反射机制获取get方法来取出该实体数据 第二步、开始导出 编辑表格内样式 第三步、设定响应请求头格式,发送文件到客户端 判断表格行数据是否为空 判断表格列值是否为空 设

    2024年02月12日
    浏览(47)
  • hutool poi、apache poi实现导入导出以及解析excel

    一、前言 看了例子之后后续需要更加深入学习或者更多理解其他API的话,建议看官方文档。hutool项目是中国人维护的,有中文文档,阅读起来很方便。apache poi比较底层一点,可以更加自由去二次开发自己所需的功能。 hutool官方文档 hutool官方gitee apache poi官方文档 二、基于

    2024年02月09日
    浏览(54)
  • java poi实现Excel多级表头导出

    最近碰到一个导出,比较繁琐,也查询了许多博客,在其中一篇博客的基础上修改,实现了最终想要的效果。话不多说,直接上效果图 1.主代码: 2.合并单元格 3.设置表头单元格的宽度 4.填充数据(注:我这里的数据格式是ListMapString, Object类型,可以根据自己的实际情况来封

    2024年02月03日
    浏览(47)
  • poi实现Excel文件导出【SpringBoot篇】

    在系统中,数据库的excel文件导出是一项及为基础的功能。此篇文章将通过实例利用poi实现excel文件导出。 Jakarta POI 是apache的子项目,目标是处理ole2对象。它提供了一组操纵Windows文档的Java API 。目前比较成熟的是HSSF接口,处理MS Excel(97-2002)对象。它不象我们仅仅是用csv生

    2024年02月05日
    浏览(44)
  • Java 使用 poi 和 aspose 实现 word 模板数据写入并转换 pdf 增加水印

    本项目所有源码和依赖资源都在文章顶部链接,有需要可以下载使用 1. 需求描述 从指定位置读取一个 word 模板 获取业务数据并写入该 word 模板,生成新的 word 文档 将新生成的 word 文档转换为 pdf 格式 对 pdf 文档添加水印 2. 效果预览 word 模板 带水印的 pdf 文档 3. 实现思路

    2024年02月08日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包