生成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();
}
}
}