java apache poi 导出word的zip包

生成word文件,包含合并单元格、调整列宽、插入嵌套表格;

将多个word文件打包生成zip文件

public void exportSummary(HttpServletResponse response, String treeId) throws IOException {
        response.setContentType("application/octet-stream");
        response.setCharacterEncoding("utf-8");
        PerformanceJob job = evaluationProgressService.genJobBytreeId(treeId);
        Assert.isTrue(job.getIsUpdatedScore(), "未更新分数或发布成绩");
        String zipFileName = URLEncoder.encode(job.getName() + "总结" + DateUtil.now(), "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + zipFileName + ".zip");
        List<SummaryProgress> summaryProgressList = summaryProgressService.findAllList(QSummaryProgress.summaryProgress.performanceJob.id.eq(job.getId())
                .and(QSummaryProgress.summaryProgress.state.eq(JobStateEnum.COMPLETED.name())));
        List<Map<Object, Object>> summaryProgressMapList = new ArrayList<>();
        List<File> summayFileList = new ArrayList<>();
        // 创建压缩目录
        String path = Constants.UPLOAD_DIR + File.separator + job.getName() + File.separator + System.currentTimeMillis();
        File dir = new File(path);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        // 生成word模板可替换参数map集合
        for (SummaryProgress progress : summaryProgressList) {
            // 文件名
            String fileName = progress.getExaminee().getUsername() + ".docx";
            // 标题1
            String title1 = "考核表";
            // 考核年度
            Integer year = progress.getEvaluationYear();
            String title2 = "(" + year + "年度:" + year + "年度职能员工绩效考核)";
            // 姓名
            String username = progress.getExaminee().getUsername();
            // 部门
            String deptName = progress.getExaminee().getDept().getName();
            // 职务
            String zhiwu = StringUtils.join(progress.getExaminee().getJobs().stream().map(Job::getName).collect(Collectors.toSet()), ",");
            // 总结第一段内容
            String mainContent = progress.getSummaryContentMain();
            // 总结第二段内容
            String secondContent = progress.getSummaryContentSecondary();
            // 总结第三段内容
            String thirdContent = progress.getSummaryContentThird();
            // 任务完成不理想的原因,三行复选框 + 文本:其他原因
            String checkedReasons = progress.getCheckedReasons();
            StringBuffer resultCheckedReasons = new StringBuffer();
            for (int i = 0; i < otherReasonCheckBox.size(); i++) {
                String reason = otherReasonCheckBox.get(i);
                if (i != 0 && i != 3 && i != 7) {
                    resultCheckedReasons.append("  ");
                }
                if (StringUtils.isNotBlank(checkedReasons) && checkedReasons.contains(reason)) {
                    resultCheckedReasons.append("☑").append(reason);
                } else {
                    resultCheckedReasons.append("□").append(reason);
                }
                if (i == 2 || i == 6) {
                    resultCheckedReasons.append("\n");
                }
            }
            // 其他原因
            String otherReasons = progress.getOtherReasons();
            resultCheckedReasons.append("     其他原因:").append(otherReasons == null ? "" : otherReasons);
            // 综合考评结果
            JSONObject summaryDetailJson = summaryProgressService.detail(QSummaryProgress.summaryProgress.id.eq(progress.getId()));
            JSONArray indicatorResultArr = summaryDetailJson.getJSONArray("indicatorScoreList");
            // 总结提交时限
            String closeTime = DateUtil.format(progress.getPerformanceJob().getSummaryCloseTime(), "yyyy-MM-dd");
            Map<Object, Object> map = new HashMap<>();
            map.put("fileName", fileName);
            map.put("year", year);
            map.put("title1", title1);
            map.put("title2", title2);
            map.put("username", username);
            map.put("deptFullName", deptName);
            map.put("zhiwu", zhiwu);
            map.put("mainContent", mainContent);
            map.put("secondContent", secondContent);
            map.put("thirdContent", thirdContent);
            map.put("resultCheckedReasons", resultCheckedReasons.toString());
            map.put("indicatorResultArr", indicatorResultArr);
            map.put("closeTime", closeTime);
            summaryProgressMapList.add(map);
        }
        for (Map<Object, Object> objectObjectMap : summaryProgressMapList) {
            // 创建文件
            String fileName = (String) objectObjectMap.get("fileName");
            fileName = dir + File.separator + fileName;
            File zongjieFile = new File(fileName);
            if (!zongjieFile.exists()) {
                zongjieFile.createNewFile();
            }
            summayFileList.add(zongjieFile);
            XWPFDocument doc = new XWPFDocument();
            XWPFParagraph p1 = doc.createParagraph();
            p1.setAlignment(ParagraphAlignment.CENTER);
            XWPFRun r1 = p1.createRun();
            r1.setBold(true);
            r1.setFontFamily("宋体");
            r1.setFontSize(18);
            r1.setText((String) objectObjectMap.get("title1"));
            r1.addBreak();
            XWPFParagraph p2 = doc.createParagraph();
            p2.setAlignment(ParagraphAlignment.CENTER);
            XWPFRun r2 = p2.createRun();
            r2.setBold(true);
            r2.setFontFamily("宋体");
            r2.setFontSize(16);
            r2.setText((String) objectObjectMap.get("title2"));
            r2.addBreak();
            XWPFParagraph p3 = doc.createParagraph();
            p3.setAlignment(ParagraphAlignment.CENTER);
            XWPFRun r3 = p3.createRun();
            r3.setBold(true);
            r3.setFontFamily("宋体");
            r3.setFontSize(10);
            StringBuffer line3 = new StringBuffer();
            line3.append("姓名:").append(objectObjectMap.get("username")).append("  ")
                    .append("部门:").append(objectObjectMap.get("deptName")).append("  ")
                    .append("职务:").append(objectObjectMap.get("zhiwu"));
            r3.setText(line3.toString());
            r3.addBreak();
            XWPFTable table = doc.createTable(11, 2);
            // 设置行高
            table.getRows().forEach(row -> row.setHeight(400));
            // 设置表格宽度
            table.setWidth("130%");
            table.setTableAlignment(TableRowAlign.CENTER);
            int tableWidth = (int) (table.getWidth() * 1.3);
            XWPFTableCell row13Cell0 = table.getRow(0).getCell(0);
            //设置单元格宽度
            CTTcPr tcpr = row13Cell0.getCTTc().addNewTcPr();
            CTTblWidth cellW = tcpr.addNewTcW();
            cellW.setType(STTblWidth.DXA);
            cellW.setW(BigInteger.valueOf((long) (tableWidth * 0.8)));
            XWPFTableCell row13Cell1 = table.getRow(0).getCell(1);
            //设置单元格宽度
            CTTcPr tcpr1 = row13Cell1.getCTTc().addNewTcPr();
            CTTblWidth cellW1 = tcpr1.addNewTcW();
            cellW1.setType(STTblWidth.DXA);
            cellW1.setW(BigInteger.valueOf((long) (tableWidth * 0.2)));
            // 第一行
            XWPFParagraph tableP1 = table.getRow(0).getCell(0).getParagraphs().get(0);
            tableP1.setAlignment(ParagraphAlignment.CENTER);
            XWPFRun tableR1 = tableP1.createRun();
            tableR1.setText("列举工作任务");
            setBoldRunStyle(tableR1,true);
            XWPFRun tableR11 = tableP1.createRun();
            tableR11.setText("(注明角色等)");
            setBoldRunStyle(tableR11, false);
            mergeTableCellH(table, 0, 0);
            // 第二行
            table.getRow(1).getCell(0).setText((String) objectObjectMap.get("mainContent"));
            mergeTableCellH(table, 1, 0);
            // 第三行
            XWPFTableCell row3Cell0 = table.getRow(2).getCell(0);
            XWPFParagraph tableP3 = row3Cell0.getParagraphs().get(0);
            tableP3.setAlignment(ParagraphAlignment.CENTER);
            XWPFRun tableP3Run = tableP3.createRun();
            tableP3Run.setText("任务完成不理想的原因(请在相应的□内划“√”)");
            tableP3Run.addBreak();
            setBoldRunStyle(tableP3Run, true);
            mergeTableCellH(table, 2, 0);
            String resultCheckedReasonsStr = (String) objectObjectMap.get("resultCheckedReasons");
            String[] cell3StrArr = resultCheckedReasonsStr.split("\n");
            for (String s : cell3StrArr) {
                XWPFParagraph row3Paragraph = row3Cell0.addParagraph();
                XWPFRun row4CellRun = row3Paragraph.createRun();
                row4CellRun.setText(s);
                setBoldRunStyle(row4CellRun, false);
                row4CellRun.addBreak(BreakType.COLUMN);
            }
            // 第四行
            XWPFParagraph tableP5 = table.getRow(3).getCell(0).getParagraphs().get(0);
            tableP5.setAlignment(ParagraphAlignment.CENTER);
            XWPFRun tableP5Run = tableP5.createRun();
            tableP5Run.setText("其他原因");
            setBoldRunStyle(tableP5Run, true);
            mergeTableCellH(table, 3, 0);
            // 第五行
            table.getRow(4).getCell(0).setText((String) objectObjectMap.get("secondContent"));
            mergeTableCellH(table, 4, 0);
            // 第六行
            XWPFParagraph tableP7 = table.getRow(5).getCell(0).getParagraphs().get(0);
            tableP7.setAlignment(ParagraphAlignment.CENTER);
            XWPFRun tableP7Run = tableP7.createRun();
            tableP7Run.setText("对部门或公司的意见及建议");
            setBoldRunStyle(tableP7Run, true);
            mergeTableCellH(table, 5, 0);
            // 第七行
            table.getRow(6).getCell(0).setText((String) objectObjectMap.get("thirdContent"));
            mergeTableCellH(table, 6, 0);
            // 第八行
            XWPFParagraph tableP9 = table.getRow(7).getCell(0).getParagraphs().get(0);
            tableP9.setAlignment(ParagraphAlignment.CENTER);
            XWPFRun tableP9Run = tableP9.createRun();
            tableP9Run.setText("综合考评结果");
            setBoldRunStyle(tableP9Run, true);
            XWPFRun tableP91Run = tableP9.createRun();
            tableP91Run.setText("(由人力资源部填写)");
            tableP91Run.setFontFamily("宋体");
            tableP91Run.setFontSize(10);
            mergeTableCellH(table, 7, 0);
            // 第九行
            mergeTableCellH(table, 8, 0);
            XWPFTableRow row10 = table.getRow(8);
            row10.getCtRow().addNewTrPr().addNewTrHeight().setVal(BigInteger.valueOf(2000));
            // 获取游标
            XWPFTableCell cell9 = table.getRow(8).getCell(0);
            XmlCursor c = cell9.addParagraph().getCTP().newCursor();
            // 游标下移
            c.toNextSibling();
            // 插入表格
            XWPFTable cellTable = cell9.insertNewTbl(c);
            // 设置表格边框
            CTTblBorders borders=cellTable.getCTTbl().addNewTblPr().addNewTblBorders();
            CTBorder hBorder=borders.addNewInsideH();
            hBorder.setVal(STBorder.Enum.forString("single"));
            hBorder.setSz(new BigInteger("1"));
            CTBorder vBorder=borders.addNewInsideV();
            vBorder.setVal(STBorder.Enum.forString("single"));
            vBorder.setSz(new BigInteger("1"));
            CTBorder topBorder=borders.addNewTop();
            topBorder.setVal(STBorder.Enum.forString("single"));
            topBorder.setSz(new BigInteger("1"));
            CTBorder bottomBorder=borders.addNewBottom();
            bottomBorder.setVal(STBorder.Enum.forString("single"));
            bottomBorder.setSz(new BigInteger("1"));
            CTBorder leftBorder=borders.addNewLeft();
            leftBorder.setVal(STBorder.Enum.forString("single"));
            leftBorder.setSz(new BigInteger("1"));
            CTBorder rightBorder=borders.addNewRight();
            rightBorder.setVal(STBorder.Enum.forString("single"));
            rightBorder.setSz(new BigInteger("1"));
            // 设置表格宽度
            CTTblWidth cellTableWidth = cellTable.getCTTbl().getTblPr().addNewTblW();
            cellTableWidth.setW(BigInteger.valueOf((long) (table.getWidth() * 1.3 * 0.9)));
            cellTable.setTableAlignment(TableRowAlign.CENTER);
            // 这个表格第一行不能使用,删除掉
            cellTable.removeRow(0);
            // 嵌套表格第一行
            XWPFTableRow tableRow131 = cellTable.createRow();
            // 嵌套表格第二行
            XWPFTableRow tableRow132 = cellTable.createRow();
            JSONArray indicatorResultArr = (JSONArray) objectObjectMap.get("indicatorResultArr");
            for (int i = 0; i < indicatorResultArr.size(); i++) {
                JSONObject jsonObject = indicatorResultArr.getJSONObject(i);
                String cellTitle = jsonObject.getString("name");
                if (!cellTitle.equals("实际得分")) {
                    // 嵌套表格 指标实际得分第一行
                    //设置单元格宽度
                    XWPFTableCell cellI = tableRow131.createCell();
                    CTTcPr cellITcpr = cellI.getCTTc().addNewTcPr();
                    CTTblWidth cellIW = cellITcpr.addNewTcW();
                    cellIW.setType(STTblWidth.DXA);
                    cellIW.setW(BigInteger.valueOf(3000));
                    XWPFParagraph nestedTableR1 = cellI.getParagraphs().get(0);
                    nestedTableR1.setAlignment(ParagraphAlignment.CENTER);
                    XWPFRun nestedTableR1Run = nestedTableR1.createRun();
                    if (cellTitle.equals("最终考核得分") || cellTitle.equals("等级")) {
                        nestedTableR1Run.setText(cellTitle);
                    } else {
                        nestedTableR1Run.setText(cellTitle + "(" + jsonObject.getString("indicatorWeight") + "%)");
                    }
                    setBoldRunStyle(nestedTableR1Run, false);
                    // 嵌套表格 指标实际得分第二行
                    XWPFTableCell cellI1 = tableRow132.createCell();
                    CTTcPr cellI1Tcpr = cellI1.getCTTc().addNewTcPr();
                    CTTblWidth cellI1W = cellI1Tcpr.addNewTcW();
                    cellI1W.setType(STTblWidth.DXA);
                    cellI1W.setW(BigInteger.valueOf(3000));
                    XWPFParagraph nestedTableR11 = cellI1.getParagraphs().get(0);
                    nestedTableR11.setAlignment(ParagraphAlignment.CENTER);
                    XWPFRun nestedTableR11Run = nestedTableR11.createRun();
                    if (jsonObject.getBoolean("published")) {
                        if (!cellTitle.equals("等级")) {
                            nestedTableR11Run.setText(jsonObject.getBigDecimal("score").toString());
                        } else {
                            nestedTableR11Run.setText(jsonObject.getString("scoreRateName"));
                        }
                    } else {
                        nestedTableR11Run.setText("未发布");
                    }
                    setBoldRunStyle(nestedTableR11Run, false);
                }
            }
            // 第九行
            XWPFParagraph tableP11 = cell9.getParagraphs().get(1);
            tableP11.setAlignment(ParagraphAlignment.CENTER);
            tableP11.setVerticalAlignment(TextAlignment.BOTTOM);
            XWPFRun tableP11Run = tableP11.createRun();
            tableP11Run.addBreak();
            tableP11Run.addBreak();
            tableP11Run.addBreak();
            tableP11Run.addBreak();
            tableP11Run.setText("人力资源部(章)                年   月   日");
            setBoldRunStyle(tableP11Run, false);
            mergeTableCellH(table, 8, 0);
            // 第十行
            XWPFParagraph tableP12 = table.getRow(9).getCell(0).getParagraphs().get(0);
            tableP12.setAlignment(ParagraphAlignment.CENTER);
            tableP12.setVerticalAlignment(TextAlignment.BOTTOM);
            XWPFRun tableP12Run = tableP12.createRun();
            tableP12Run.setText("部门负责人反馈意见");
            setBoldRunStyle(tableP12Run, true);
            XWPFParagraph tableP121 = table.getRow(9).getCell(1).getParagraphs().get(0);
            tableP121.setAlignment(ParagraphAlignment.CENTER);
            XWPFRun tableP121Run = tableP121.createRun();
            tableP121Run.setText("被考核人反馈后签字");
            setBoldRunStyle(tableP121Run, true);
            // 第十一行
            // 设置行高
            // 设置单元格高度
            XWPFTableRow row13 = table.getRow(10);
            row13.getCtRow().addNewTrPr().addNewTrHeight().setVal(BigInteger.valueOf(1500));
            // 第十一行
            XWPFTableCell row14cell0 = row13.getCell(0);
            table.getRow(10).getCell(0).setVerticalAlignment(XWPFTableCell.XWPFVertAlign.BOTTOM);
            XWPFParagraph tableP14 = row14cell0.getParagraphs().get(0);
            tableP14.setAlignment(ParagraphAlignment.LEFT);
            tableP14.setVerticalAlignment(TextAlignment.BOTTOM);
            XWPFRun tableP14Run = tableP14.createRun();
            tableP14Run.setText("领导签字:                      年   月   日");
            setBoldRunStyle(tableP14Run, false);
            XWPFParagraph tableP141 = table.getRow(10).getCell(1).getParagraphs().get(0);
            table.getRow(10).getCell(1).setVerticalAlignment(XWPFTableCell.XWPFVertAlign.BOTTOM);
            tableP141.setAlignment(ParagraphAlignment.CENTER);
            tableP141.setVerticalAlignment(TextAlignment.BOTTOM);
            XWPFRun tableP141Run = tableP141.createRun();
            tableP141Run.setText("年   月   日");
            setBoldRunStyle(tableP141Run, false);
            XWPFParagraph plast = doc.createParagraph();
            plast.setAlignment(ParagraphAlignment.CENTER);
            XWPFRun plastRun = plast.createRun();
            plastRun.setFontFamily("宋体");
            plastRun.setFontSize(9);
            String lastString = "注:归入本人档案。";
            lastString = MessageFormat.format(lastString, objectObjectMap.get("closeTime"));
            plastRun.setText(lastString);
            // 写入
            FileOutputStream zongjieOs = new FileOutputStream(zongjieFile);
            doc.write(zongjieOs);
            zongjieOs.close();
            doc.close();
        }
        ZipOutputStream zos = new ZipOutputStream(response.getOutputStream());
        try {
            for (File srcFile : summayFileList) {
                int len;
                zos.putNextEntry(new ZipEntry(srcFile.getName()));
                FileInputStream in = new FileInputStream(srcFile);
                byte[] buf = new byte[1024];
                while ((len = in.read(buf)) != -1) {
                    zos.write(buf, 0, len);
                }
                zos.closeEntry();
            }
        } finally {
            try {
                zos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值