package com.ots.common.utils.poi; import cn.hutool.core.collection.CollUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.ots.common.enums.ReportTypeEnum; import com.ots.common.enums.ReportTypeNameEnum; import com.ots.common.enums.TableEnum; import com.ots.common.enums.TemplateTypeEnum; import com.ots.common.utils.StringUtils; import com.ots.framework.config.EssConfig; import com.ots.framework.web.domain.AjaxResult; import com.ots.project.exam.domain.TReportTemplate; import com.ots.project.exam.dto.JAQTableStyle; import com.ots.project.exam.dto.WordParam; import com.ots.project.tool.PdfUtil; import com.ots.project.tool.ShellTool; import com.ots.project.tool.exam.ExamUtil; import com.ots.project.tool.exam.ImageUtil; import com.ots.project.tool.exam.ZipUtil; import com.ots.project.tool.report.MAQTR.chart.MAQTRChart; import com.ots.project.tool.report.PAQ.chart.PAQChart; import org.apache.commons.collections.map.HashedMap; import org.apache.poi.ooxml.POIXMLDocument; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.util.Units; import org.apache.poi.xwpf.usermodel.*; import org.apache.xmlbeans.XmlCursor; import org.apache.xmlbeans.XmlException; import org.apache.xmlbeans.XmlObject; import org.dom4j.DocumentException; import org.jetbrains.annotations.Nullable; import org.openxmlformats.schemas.drawingml.x2006.chart.*; import org.openxmlformats.schemas.drawingml.x2006.main.CTGraphicalObject; import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTAnchor; import org.openxmlformats.schemas.wordprocessingml.x2006.main.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import java.awt.image.BufferedImage; import java.io.*; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; public class WordUtil { private static final Logger log = LoggerFactory.getLogger(WordUtil.class); public static String tempFilePath = "/Users/shawnli/Downloads/"; private static String noRunChange = ""; private static Map colorLabel = new HashMap() {{ put("", ""); }}; private static Map fontSize = new HashMap() {{ put("", ""); }}; public static final int DEFAULT_FONT_SIZE = 10; public static boolean changWord(String inputUrl, String outputUrl, Map textMap, Map tableMap) { try { XWPFDocument document = new XWPFDocument(POIXMLDocument.openPackage(inputUrl)); WordUtil.changeText(document, textMap); WordUtil.changeTable(document, textMap); File file = new File(outputUrl); FileOutputStream stream = new FileOutputStream(file); document.write(stream); stream.close(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return true; } public static OutputStream getReportWord(String inputUrl, String outputUrl, Map textMap, Map tableMap) { try { XWPFDocument document = new XWPFDocument(POIXMLDocument.openPackage(inputUrl)); WordUtil.changeText(document, textMap); WordUtil.changeTable(document, textMap); File file = new File(outputUrl); return new FileOutputStream(file); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return null; } public static boolean changWord(String inputUrl, String outputUrl, Map textMap, WordParam wordParam) { boolean changeFlag = true; try { XWPFDocument document = new XWPFDocument(POIXMLDocument.openPackage(inputUrl)); WordUtil.changeText(document, textMap); File file = new File(outputUrl); FileOutputStream stream = new FileOutputStream(file); document.write(stream); stream.close(); } catch (IOException e) { e.printStackTrace(); changeFlag = false; } catch (Exception e) { } return changeFlag; } public static void changeText(XWPFDocument document, Map textMap) throws IOException, InvalidFormatException { setHeader(document, textMap); List elements = document.getBodyElements(); List paragraphs = new ArrayList<>(); for (IBodyElement iBodyElement : elements) { if (iBodyElement instanceof XWPFParagraph) { paragraphs.add((XWPFParagraph) iBodyElement); } } for (XWPFParagraph paragraph : paragraphs) { String text = paragraph.getText(); if (checkText(text)) { List iRunElements = paragraph.getIRuns(); List runs = new ArrayList<>(); for (IRunElement iRunElement : iRunElements) { runs.add((XWPFRun) iRunElement); } int runPosition = 0; for (XWPFRun run : runs) { String changeValueStr = changeValue(run.toString(), textMap, run, paragraph, document, runPosition); if (!StringUtils.equals(changeValueStr, "NoChangValue")) { run.setText(changeValueStr, 0); } runPosition++; } } } } private static void setHeader(XWPFDocument document, Map textMap) { try { List headerList = document.getHeaderList(); for (XWPFHeader header : headerList) { List paragraphs = header.getParagraphs(); setHeadTable(document, textMap, header); setHeadParagraph(textMap, paragraphs); } } catch (Exception e) { log.info("正常的异常,没有表头数据{}", e.getMessage(), e); } } private static void setHeadParagraph(Map textMap, List paragraphs) { for (XWPFParagraph xwpfParagraph : paragraphs) { List runs = xwpfParagraph.getRuns(); for (XWPFRun run : runs) { log.info(run.toString()); if (run.toString().indexOf("%TName%") != -1) { run.setText(textMap.get("questionnaireTaker").toString(), 0); } if (run.toString().indexOf("%TTime%") != -1) { run.setText(textMap.get("reportGenerationDate").toString(), 0); } if (run.toString().indexOf("%LIBSAQGS0018%") != -1) { run.setText(textMap.get("LIBSAQGS0018").toString(), 0); } } } } private static void setHeadTable(XWPFDocument document, Map textMap, XWPFHeader header) { if (Objects.nonNull(textMap.get("questionnaireTaker"))) { textMap.put("TName", textMap.get("questionnaireTaker").toString()); } if (Objects.nonNull(textMap.get("reportGenerationDate"))) { textMap.put("TTime", textMap.get("reportGenerationDate").toString()); } List tables = header.getTables(); if (CollUtil.isEmpty(tables)) { return; } setTableValue(document, textMap, tables); } public static void changePage(XWPFDocument document) throws IOException, org.apache.poi.openxml4j.exceptions.InvalidFormatException { List paragraphs = document.getParagraphs(); for (XWPFParagraph paragraph : paragraphs) { String text = paragraph.getText(); if (text.indexOf("%page-change%") != -1) { List runs = paragraph.getRuns(); for (XWPFRun run : runs) { if (StringUtils.equals(run.toString(), "%page-change%")) { run.setText("", 0); } } paragraph.getCTP().getPPr().addNewSectPr(); } } } public static void changeLine(XWPFDocument document) throws IOException, org.apache.poi.openxml4j.exceptions.InvalidFormatException { List paragraphs = document.getParagraphs(); for (XWPFParagraph paragraph : paragraphs) { String text = paragraph.getText(); if (text.indexOf("%line-feed%") != -1) { List runs = paragraph.getRuns(); for (XWPFRun run : runs) { if (StringUtils.equals(run.toString(), "%line-feed%")) { run.setText("", 0); run.addBreak(); } } } } } private static void setPicture(XWPFRun run, WordParam wordParam) throws org.apache.poi.openxml4j.exceptions.InvalidFormatException, IOException { InputStream in = new FileInputStream(wordParam.getContent()); BufferedImage bufferedImage = ImageUtil.getImage(wordParam.getContent()); int width = (int) Math.round(bufferedImage.getWidth()); int height = (int) Math.round(bufferedImage.getHeight()); int emuSelf = 3000; run.addPicture(in, Document.PICTURE_TYPE_PNG, "TEST", width * emuSelf, height * emuSelf); in.close(); if (wordParam.isMove()) { CTDrawing drawing = run.getCTR().getDrawingArray(0); CTGraphicalObject graphicalobject = drawing.getInlineArray(0).getGraphic(); CTAnchor anchor = getAnchorWithGraphic(graphicalobject, "TEST1", Units.toEMU(wordParam.getPicWidth()), Units.toEMU(wordParam.getPicHeight()), Units.toEMU(wordParam.getX()), Units.toEMU(wordParam.getY()), false, wordParam.getTopPosition()); drawing.setAnchorArray(new CTAnchor[]{anchor}); drawing.removeInline(0); } } public static CTAnchor getAnchorWithGraphic(CTGraphicalObject ctGraphicalObject, String deskFileName, int width, int height, int leftOffset, int topOffset, boolean behind, int topPosition) { long relativeHeight = 251649024L + topPosition; String anchorXML = "" + "" + "" + "" + leftOffset + "" + "" + "" + "" + topOffset + "" + "" + "" + "" + "" + "" + ""; CTDrawing drawing = null; try { drawing = CTDrawing.Factory.parse(anchorXML); } catch (XmlException e) { e.printStackTrace(); } CTAnchor anchor = drawing.getAnchorArray(0); anchor.setGraphic(ctGraphicalObject); return anchor; } public static void changeTable(XWPFDocument document, Map textMap) { List tables = document.getTables(); setTableValue(document, textMap, tables); } /** * 设置表格值 * @param document * @param textMap * @param tables */ private static void setTableValue(XWPFDocument document, Map textMap, List tables) { for (int i = 0; i < tables.size(); i++) { log.info("第" + (i + 1) + "个表:"); try { XWPFTable table = tables.get(i); if (table.getRows().size() > 0) { log.info("表行数:{}",table.getRows().size()); log.info("表格数据:" + table.getText()); //增加表格或者減少表格 if (Objects.equals(textMap.get("sendEmailFileName"), ReportTypeEnum.JAQ.getCode())) { addOrDelTableRow(table,i,textMap); } if (checkText(table.getText())) { List rows = table.getRows(); eachTable(rows, textMap, document); } } } catch (Exception e) { log.info("表格发生了多行!"); } } } /** * 增加表格或者減少表格 * @param table 表格 * @param index 表索引 * @param textMap 赋值对象 */ private static void addOrDelTableRow(XWPFTable table, int index, Map textMap) { try { TableEnum tableEnum = TableEnum.codeOf(index); Integer tableNum = Integer.valueOf(textMap.get(tableEnum.getName()).toString()); Integer rows = table.getRows().size(); //表1-表3 需剔除表头 Integer contentRows = rows - 1; //表4 需剔除表头跟尾部预留行数 if(tableEnum == TableEnum.table4){ contentRows -= 5; rows -= 5; //表4 行为表现举例处理 Integer table4ChildrenNum = Integer.valueOf(textMap.get(TableEnum.table4Children.getName()).toString()); if(table4ChildrenNum != null && table4ChildrenNum != 3){ if(table4ChildrenNum > 3){ //追加 for (int i = 1; i < rows; i++) { XWPFTableRow row = table.getRows().get(i); List cells = row.getTableCells(); XWPFTableCell cell = cells.get(1); XWPFParagraph paragraph = cell.getParagraphs().get(0); for (int j = 3; j < cell.getParagraphs().size(); j++) { //log.info(cell.getParagraphs().get(j).getText()+""); //设置样式 cell.getParagraphs().get(j).getCTP().setPPr(cell.getParagraphs().get(0).getCTP().getPPr()); if (paragraph.getRuns() != null && paragraph.getRuns().size() > 0) { XWPFRun cellR = cell.getParagraphs().get(j).createRun(); cellR.setBold(paragraph.getRuns().get(0).isBold()); cellR.getCTR().setRPr(paragraph.getRuns().get(0).getCTR().getRPr()); } //替换文字 changeText(cell.getParagraphs().get(j),"%T4com"+i+"item"+(j+1)+"%"); } } }else{ //减少 for (int i = 1; i < rows; i++) { XWPFTableRow row = table.getRows().get(i); List cells = row.getTableCells(); XWPFTableCell cell = cells.get(1); //XWPFParagraph paragraph = cell.getParagraphs().get(0); for (int j = 3; j > table4ChildrenNum; j--) { //cell.removeParagraph(j-1); changeText(cell.getParagraphs().get(j),""); } } } } //表4 胜任力预留位置序号处理 if(tableNum != null && tableNum != 8){ for (int i = tableNum; i < tableNum+4; i++) { XWPFTableRow row = table.getRows().get(i); List cells = row.getTableCells(); changeText(cells.get(0).getParagraphs().get(0),"#"+(i+1)+"."); } } } //限制行数不为空 和 限制行数跟报告现有不一致需进行处理 if(tableNum != null && !tableNum.equals(contentRows)){ if(tableNum > contentRows){ //增加行数 Integer addRow = tableNum - contentRows; log.info("{}增加{}行",tableEnum.getName(),addRow); for (int i = rows; i < rows+addRow; i++) { addJAQTable(table,tableEnum,i,textMap); } }else{ //减少行数 Integer delRow = rows - tableNum; for (int i = contentRows; i > rows-delRow; i--) { delJAQTable(table,i); } log.info("{}减少{}行数",TableEnum.codeOf(index).getName(),delRow-1); } } }catch (Exception e){ e.printStackTrace(); log.info("表{}增加表格或者減少表格异常",index+1); } } /** * 替换段落里面的变量 * @param para * @param text */ private static void replaceInPara(XWPFParagraph para, String text) { List runs; runs = para.getRuns(); XWPFRun run = runs.get(0); // 直接调用XWPFRun的setText()方法设置文本时,在底层会重新创建一个XWPFRun,把文本附加在当前文本后面, // 所以我们不能直接设值,需要先删除当前run,然后再自己手动插入一个新的run。 para.removeRun(0); para.insertNewRun(0).setText(text); } public static void changeText(XWPFParagraph p, String newText) { List runs = p.getRuns(); if(runs.isEmpty()){ p.createRun(); } for(int i = runs.size() - 1; i > 0; i--) { p.removeRun(i); } XWPFRun run = runs.get(0); run.setText(newText, 0); } /** * 删除JAQ表格 * @param table * @param index */ private static void delJAQTable(XWPFTable table,Integer index){ table.removeRow(index); } /** * 添加JAQ表格 * @param tableEnum * @param index */ private static void addJAQTable(XWPFTable table,TableEnum tableEnum,Integer index,Map textMap){ // 在表格中指定的位置新增一行 insertRow(table,1,index); XWPFTableRow row = table.getRows().get(index); List cells = row.getTableCells(); switch (tableEnum){ case table1: cells.get(0).getParagraphs().get(0).getRuns().get(0).setText(textMap.get("T1rank"+index)+""); cells.get(1).getParagraphs().get(0).getRuns().get(0).setText(textMap.get("T1com"+index)+""); cells.get(2).getParagraphs().get(0).getRuns().get(0).setText(textMap.get("T1com"+index+"IF_M")+""); cells.get(3).getParagraphs().get(0).getRuns().get(0).setText(textMap.get("T1com"+index+"IF_L")+"-"+textMap.get("T1com"+index+"IF_H")); break; case table2: cells.get(0).getParagraphs().get(0).getRuns().get(0).setText(textMap.get("T2rank"+index)+""); cells.get(1).getParagraphs().get(0).getRuns().get(0).setText(textMap.get("T2com"+index)+""); cells.get(2).getParagraphs().get(0).getRuns().get(0).setText(textMap.get("T2Com"+index+"I_M")+""); cells.get(3).getParagraphs().get(0).getRuns().get(0).setText(textMap.get("T2com"+index+"I_L")+"-"+textMap.get("T2com"+index+"I_H")); break; case table3: cells.get(0).getParagraphs().get(0).getRuns().get(0).setText(textMap.get("T3rank"+index)+""); cells.get(1).getParagraphs().get(0).getRuns().get(0).setText(textMap.get("T3item"+index)+""); cells.get(2).getParagraphs().get(0).getRuns().get(0).setText(textMap.get("T3item"+index+"IF_M")+""); cells.get(3).getParagraphs().get(0).getRuns().get(0).setText(textMap.get("T3com"+index)+""); break; case table4: cells.get(0).getParagraphs().get(0).getRuns().get(0).setText("#"+textMap.get("T4rank"+index)+". "+textMap.get("T4com"+index)); //子集合长度 Integer table4ChildrenNum = Integer.valueOf(textMap.get(TableEnum.table4Children.getName()).toString()); List items = new ArrayList<>(); for (int j = 1; j <= table4ChildrenNum; j++) { items.add(textMap.get("T4com"+index+"item"+j)+""); } //设置值 XWPFTableCell cell = cells.get(1); XWPFParagraph paragraph = cell.getParagraphs().get(0); for (int i = 0; i < items.size(); i++) { String item = items.get(i); if(i == 0){ paragraph.getRuns().get(0).setText(item); }else{ //新增段落 cell.addParagraph(); cell.getParagraphs().get(i).getCTP().setPPr(paragraph.getCTP().getPPr()); if (paragraph.getRuns() != null && paragraph.getRuns().size() > 0) { XWPFRun cellR = cell.getParagraphs().get(i).createRun(); cellR.setBold(paragraph.getRuns().get(0).isBold()); /*cellR.setFontSize(paragraph.getRuns().get(0).getFontSize()); cellR.setFontFamily(paragraph.getRuns().get(0).getFontFamily());*/ cellR.getCTR().setRPr(paragraph.getRuns().get(0).getCTR().getRPr()); } cell.getParagraphs().get(i).getRuns().get(0).setText(item); } } //小于6个胜任力 补齐 Integer repair = 6 - table4ChildrenNum; if(repair > 0){ for (int i = 0; i < repair; i++) { //新增段落 cell.addParagraph(); cell.getParagraphs().get(cell.getParagraphs().size()-1).getCTP().setPPr(paragraph.getCTP().getPPr()); if (paragraph.getRuns() != null && paragraph.getRuns().size() > 0) { XWPFRun cellR = cell.getParagraphs().get(cell.getParagraphs().size()-1).createRun(); cellR.setBold(paragraph.getRuns().get(0).isBold()); /*cellR.setFontSize(paragraph.getRuns().get(0).getFontSize()); cellR.setFontFamily(paragraph.getRuns().get(0).getFontFamily());*/ cellR.getCTR().setRPr(paragraph.getRuns().get(0).getCTR().getRPr()); } cell.getParagraphs().get(cell.getParagraphs().size()-1).getRuns().get(0).setText(null); } } break; } } /** * insertRow 在word表格中指定位置插入一行,并将某一行的样式复制到新增行 * @param copyrowIndex 需要复制的行位置 * @param newrowIndex 需要新增一行的位置 * */ public static void insertRow(XWPFTable table, int copyrowIndex, int newrowIndex) { // 在表格中指定的位置新增一行 XWPFTableRow targetRow = table.insertNewTableRow(newrowIndex); // 获取需要复制行对象 XWPFTableRow copyRow = table.getRow(copyrowIndex); //复制行对象 targetRow.getCtRow().setTrPr(copyRow.getCtRow().getTrPr()); //或许需要复制的行的列 List copyCells = copyRow.getTableCells(); //复制列对象 XWPFTableCell targetCell = null; for (int i = 0; i < copyCells.size(); i++) { XWPFTableCell copyCell = copyCells.get(i); targetCell = targetRow.addNewTableCell(); targetCell.getCTTc().setTcPr(copyCell.getCTTc().getTcPr()); if (copyCell.getParagraphs() != null && copyCell.getParagraphs().size() > 0) { targetCell.getParagraphs().get(0).getCTP().setPPr(copyCell.getParagraphs().get(0).getCTP().getPPr()); if (copyCell.getParagraphs().get(0).getRuns() != null && copyCell.getParagraphs().get(0).getRuns().size() > 0) { XWPFRun cellR = targetCell.getParagraphs().get(0).createRun(); cellR.setBold(copyCell.getParagraphs().get(0).getRuns().get(0).isBold()); cellR.getCTR().setRPr(copyCell.getParagraphs().get(0).getRuns().get(0).getCTR().getRPr()); } } } } /** * 复制模板行的属性 * @param tmpCell * @param cell * @param text * @throws Exception */ private static void setCellText(XWPFTableCell tmpCell, XWPFTableCell cell,String text){ try { CTTc cttc2 = tmpCell.getCTTc(); CTTcPr ctPr2 = cttc2.getTcPr(); CTTc cttc = cell.getCTTc(); CTTcPr ctPr = cttc.addNewTcPr(); if (ctPr2.getTcW() != null) { ctPr.addNewTcW().setW(ctPr2.getTcW().getW()); } if (ctPr2.getVAlign() != null) { ctPr.addNewVAlign().setVal(ctPr2.getVAlign().getVal()); } if (cttc2.getPList().size() > 0) { CTP ctp = cttc2.getPList().get(0); if (ctp.getPPr() != null) { if (ctp.getPPr().getJc() != null) { cttc.getPList().get(0).addNewPPr().addNewJc() .setVal(ctp.getPPr().getJc().getVal()); } } } if (ctPr2.getTcBorders() != null) { ctPr.setTcBorders(ctPr2.getTcBorders()); } XWPFParagraph tmpP = tmpCell.getParagraphs().get(0); XWPFParagraph cellP = cell.getParagraphs().get(0); XWPFRun tmpR = null; if (tmpP.getRuns() != null && tmpP.getRuns().size() > 0) { tmpR = tmpP.getRuns().get(0); } XWPFRun cellR = cellP.createRun(); cellR.setText(text); // 复制字体信息 if (tmpR != null) { if(!cellR.isBold()){ cellR.setBold(tmpR.isBold()); } cellR.setItalic(tmpR.isItalic()); cellR.setUnderline(tmpR.getUnderline()); cellR.setColor(tmpR.getColor()); cellR.setTextPosition(tmpR.getTextPosition()); if (tmpR.getFontSize() != -1) { cellR.setFontSize(tmpR.getFontSize()); } if (tmpR.getFontFamily() != null) { cellR.setFontFamily(tmpR.getFontFamily()); } if (tmpR.getCTR() != null) { if (tmpR.getCTR().isSetRPr()) { CTRPr tmpRPr = tmpR.getCTR().getRPr(); if (tmpRPr.isSetRFonts()) { CTFonts tmpFonts = tmpRPr.getRFonts(); CTRPr cellRPr = cellR.getCTR().isSetRPr() ? cellR .getCTR().getRPr() : cellR.getCTR().addNewRPr(); CTFonts cellFonts = cellRPr.isSetRFonts() ? cellRPr .getRFonts() : cellRPr.addNewRFonts(); cellFonts.setAscii(tmpFonts.getAscii()); cellFonts.setAsciiTheme(tmpFonts.getAsciiTheme()); cellFonts.setCs(tmpFonts.getCs()); cellFonts.setCstheme(tmpFonts.getCstheme()); cellFonts.setEastAsia(tmpFonts.getEastAsia()); cellFonts.setEastAsiaTheme(tmpFonts.getEastAsiaTheme()); cellFonts.setHAnsi(tmpFonts.getHAnsi()); cellFonts.setHAnsiTheme(tmpFonts.getHAnsiTheme()); } } } } // 复制段落信息 cellP.setAlignment(tmpP.getAlignment()); cellP.setVerticalAlignment(tmpP.getVerticalAlignment()); cellP.setBorderBetween(tmpP.getBorderBetween()); cellP.setBorderBottom(tmpP.getBorderBottom()); cellP.setBorderLeft(tmpP.getBorderLeft()); cellP.setBorderRight(tmpP.getBorderRight()); cellP.setBorderTop(tmpP.getBorderTop()); cellP.setPageBreak(tmpP.isPageBreak()); if (tmpP.getCTP() != null) { if (tmpP.getCTP().getPPr() != null) { CTPPr tmpPPr = tmpP.getCTP().getPPr(); CTPPr cellPPr = cellP.getCTP().getPPr() != null ? cellP .getCTP().getPPr() : cellP.getCTP().addNewPPr(); // 复制段落间距信息 CTSpacing tmpSpacing = tmpPPr.getSpacing(); if (tmpSpacing != null) { CTSpacing cellSpacing = cellPPr.getSpacing() != null ? cellPPr .getSpacing() : cellPPr.addNewSpacing(); if (tmpSpacing.getAfter() != null) { cellSpacing.setAfter(tmpSpacing.getAfter()); } if (tmpSpacing.getAfterAutospacing() != null) { cellSpacing.setAfterAutospacing(tmpSpacing .getAfterAutospacing()); } if (tmpSpacing.getAfterLines() != null) { cellSpacing.setAfterLines(tmpSpacing.getAfterLines()); } if (tmpSpacing.getBefore() != null) { cellSpacing.setBefore(tmpSpacing.getBefore()); } if (tmpSpacing.getBeforeAutospacing() != null) { cellSpacing.setBeforeAutospacing(tmpSpacing .getBeforeAutospacing()); } if (tmpSpacing.getBeforeLines() != null) { cellSpacing.setBeforeLines(tmpSpacing.getBeforeLines()); } if (tmpSpacing.getLine() != null) { cellSpacing.setLine(tmpSpacing.getLine()); } if (tmpSpacing.getLineRule() != null) { cellSpacing.setLineRule(tmpSpacing.getLineRule()); } } // 复制段落缩进信息 CTInd tmpInd = tmpPPr.getInd(); if (tmpInd != null) { CTInd cellInd = cellPPr.getInd() != null ? cellPPr.getInd() : cellPPr.addNewInd(); if (tmpInd.getFirstLine() != null) { cellInd.setFirstLine(tmpInd.getFirstLine()); } if (tmpInd.getFirstLineChars() != null) { cellInd.setFirstLineChars(tmpInd.getFirstLineChars()); } if (tmpInd.getHanging() != null) { cellInd.setHanging(tmpInd.getHanging()); } if (tmpInd.getHangingChars() != null) { cellInd.setHangingChars(tmpInd.getHangingChars()); } if (tmpInd.getLeft() != null) { cellInd.setLeft(tmpInd.getLeft()); } if (tmpInd.getLeftChars() != null) { cellInd.setLeftChars(tmpInd.getLeftChars()); } if (tmpInd.getRight() != null) { cellInd.setRight(tmpInd.getRight()); } if (tmpInd.getRightChars() != null) { cellInd.setRightChars(tmpInd.getRightChars()); } } } } }catch (Exception e){ e.printStackTrace(); } } private static void addTableValue(XWPFDocument document, Map>> autoTableMap) { if (Objects.isNull(autoTableMap)) { return; } List tables = document.getTables(); for (int i = 0; i < tables.size(); i++) { log.info("第" + (i + 1) + "个表:"); try { XWPFTable table = tables.get(i); if (table.getRows().size() > 0) { log.info("添加行表格数据:" + table.getText()); Map> mapRowsMap = autoTableMap.get(i); log.info("插入" + table.getText()); insertTable(table, mapRowsMap.get(i), 1); } } catch (Exception e) { log.info("表格发生了多行!"); } } } /* private static void setTableMap(Map tableMap, Map> mapRowsMap) { if (Objects.isNull(tableMap) || tableMap.isEmpty()) { return; } List table1 = (List) tableMap.get("table1"); List table1List = new ArrayList<>(); for (Table1 t : table1) { table1List.add(t.toRow()); } mapRowsMap.put(0, table1List); List table2 = (List) tableMap.get("table2"); List table2List = new ArrayList<>(); for (Table2 t : table2) { table2List.add(t.toRow()); } mapRowsMap.put(1, table2List); List table3 = (List) tableMap.get("table3"); List table3List = new ArrayList<>(); for (Table3 t : table3) { table3List.add(t.toRow()); } mapRowsMap.put(2, table3List); List table4 = (List) tableMap.get("table4"); List table4List = new ArrayList<>(); for (Table4 t : table4) { table4List.add(t.toRow()); } mapRowsMap.put(3, table4List); }*/ public static void eachTable(List rows, Map textMap, XWPFDocument document) throws IOException, org.apache.poi.openxml4j.exceptions.InvalidFormatException { for (XWPFTableRow row : rows) { List cells = row.getTableCells(); for (XWPFTableCell cell : cells) { //如果当前表格包含%就代表需要替换 if (checkText(cell.getText())) { List paragraphs = cell.getParagraphs(); for (XWPFParagraph paragraph : paragraphs) { //获取所有行 List iRunElements = paragraph.getIRuns(); List runs = new ArrayList<>(); //遍历所有行 for (IRunElement iRunElement : iRunElements) { runs.add((XWPFRun) iRunElement); } int runPosition = 0; //替换所有表格的文字 for (XWPFRun run : runs) { setTextValue(textMap, document, paragraph, runPosition, run); } } } } } } private static void setTextValue(Map textMap, XWPFDocument document, XWPFParagraph paragraph, int runPosition, XWPFRun run) { log.info("表格的:{}", run.toString()); try { run.setText(changeValue(run.toString(), textMap, run, paragraph, document, runPosition), 0); } catch (Exception e) { e.printStackTrace(); } } public static void insertTable(XWPFTable table, List tableList, int inserRowNum) { for (int i = 0; i < tableList.size(); i++) { XWPFTableRow row = table.createRow(); } XWPFTableRow headXwpfTableRow = table.getRows().get(0); for (int i = inserRowNum; i <= tableList.size(); i++) { XWPFTableRow newRow = table.getRow(i); List cells = newRow.getTableCells(); for (int j = 0; j < cells.size(); j++) { try { XWPFTableCell cell = cells.get(j); cell.setText(tableList.get(i - 1)[j]); cell.getParagraphs().get(0).getCTP().setPPr(headXwpfTableRow.getCell(0).getParagraphs().get(0).getCTP().getPPr()); } catch (Exception e) { } } } } //校验文本是否需要替换 public static boolean checkText(String text) { //替换文本包含% if (text.indexOf("%") != -1 || StringUtils.equals(text, "N/A NONE")) { //只有%大于1 才通过 if(getCount(text) > 1){ return true; } return false; } return false; } //判断%出现的次数 public static int getCount(String text){ //旧长度 int oldLength = text.length(); text = text.replace("%", ""); //新长度 int newLength = text.length(); //出现次数 = 旧长度 - 新长度 int count = oldLength - newLength; return count; } public static String changeValue(String runValue, Map textMap, XWPFRun run, XWPFParagraph paragraph, XWPFDocument document, int runPosition) throws IOException, org.apache.poi.openxml4j.exceptions.InvalidFormatException { log.debug("changeText:{}",runValue); Set> textSets = textMap.entrySet(); for (Map.Entry textSet : textSets) { String key = "%" + textSet.getKey() + "%"; if (runValue.indexOf("%page-change%") != -1) { runValue = ""; paragraph.getCTP().getPPr().addNewSectPr(); break; } else if (runValue.indexOf("%line-feed%") != -1) { runValue = ""; run.addBreak(); break; } else if (runValue.indexOf(key) != -1) { runValue = changeWordAndPicValue(runValue, run, textSet, key, paragraph, document); if (runValue.indexOf("") != -1) { return setOtherStyle(runValue, paragraph, runPosition, run); } //有些表格可能存在多个字典 需替换多次不能轻易break //没有可替换内容直接break if(getTextSize(runValue) == 0){ break; } } } if (checkText(runValue)) { runValue = runValue.replaceAll("%.*%", ""); runValue = runValue.replaceAll("N/A NONE", ""); } return runValue; } private static String setOtherStyle(String runValue, XWPFParagraph paragraph, int runPosition, XWPFRun oldRun) { int position = 0; int pointer = 0; int end = runValue.length(); List stringList = new ArrayList<>(); while (pointer < end) { position = runValue.indexOf("", pointer); if (position != -1) { String originalRunStr = runValue.substring(pointer, position); if (StringUtils.isNotEmpty(originalRunStr)) { stringList.add(originalRunStr); XWPFRun insertRun = paragraph.insertNewRun(runPosition++); insertRun.setText(originalRunStr); insertRun.setBold(oldRun.isBold()); insertRun.setColor(oldRun.getColor()); insertRun.setFontFamily(oldRun.getFontFamily()); int fontSize = oldRun.getFontSize(); insertRun.setFontSize((fontSize == -1) ? DEFAULT_FONT_SIZE : fontSize); } pointer = position; position = runValue.indexOf("", pointer); position += 11; String newRunStr = runValue.substring(pointer, position); if (StringUtils.isNotEmpty(newRunStr)) { newRunStr = newRunStr.replaceAll("", ""); newRunStr = newRunStr.replaceAll("", ""); String rgbStr = getRGBStr(newRunStr, oldRun); if (rgbStr == null) { rgbStr = oldRun.getColor(); } int fontSize = getFontSize(newRunStr, oldRun); if (fontSize == -1) { fontSize = oldRun.getFontSize(); } newRunStr = getfinalStr(newRunStr); stringList.add(newRunStr); XWPFRun insertRun = paragraph.insertNewRun(runPosition++); insertRun.setText(newRunStr); insertRun.setBold(true); insertRun.setColor(rgbStr); String fontFamily = oldRun.getFontFamily(); insertRun.setFontFamily(fontFamily); insertRun.setFontSize((fontSize == -1) ? DEFAULT_FONT_SIZE : fontSize); } pointer = position; } else { stringList.add(runValue.substring(pointer, end)); XWPFRun insertRun = paragraph.insertNewRun(runPosition++); insertRun.setText(runValue.substring(pointer, end)); insertRun.setBold(oldRun.isBold()); insertRun.setColor(oldRun.getColor()); insertRun.setFontFamily(oldRun.getFontFamily()); int fontSize = oldRun.getFontSize(); insertRun.setFontSize((fontSize == -1) ? DEFAULT_FONT_SIZE : fontSize); pointer = end; } } paragraph.removeRun(runPosition); return "NoChangValue"; } private static int getFontSize(String newRunStr, XWPFRun oldRun) { int font = -1; for (String lab : fontSize.keySet()) { if (newRunStr.contains(lab)) { int fontSize = getFontSize(lab); if (fontSize != -1) { font = fontSize; break; } } } return font; } private static int getFontSize(String lab) { int font = -1; int index = lab.indexOf("_"); String size = lab.substring(index + 1, lab.length() - 1); try{ font = Integer.parseInt(size); }catch (Exception e){} return font; } private static String getfinalStr(String newRunStr) { String result = newRunStr; for (String lab : colorLabel.keySet()) { if (newRunStr.contains(lab)) { newRunStr = newRunStr.replaceAll(lab, ""); newRunStr = newRunStr.replaceAll(colorLabel.get(lab), ""); result = newRunStr; } } for (String lab : fontSize.keySet()) { if (newRunStr.contains(lab)) { newRunStr = newRunStr.replaceAll(lab, ""); newRunStr = newRunStr.replaceAll(fontSize.get(lab), ""); result = newRunStr; } } return result; } private static String getRGBStr(String newRunStr, XWPFRun oldRun) { String rgbStr = null; for (String lab : colorLabel.keySet()) { if (newRunStr.contains(lab)) { String colorByLab = getColorByLab(lab); if (colorByLab != null) { rgbStr = colorByLab; break; } } } return rgbStr; } private static String getColorByLab(String lab) { String rgbStr = null; switch (lab) { case "": rgbStr = "ff9900"; break; default: rgbStr = "000000"; break; } return rgbStr; } private static void changOtherPicture(XWPFParagraph paragraph) { String paragraphText = paragraph.getText(); if (paragraphText.indexOf("{start.png}") == -1) { return; } List iRunElements = paragraph.getIRuns(); XWPFRun oldRun = (XWPFRun) iRunElements.get(0); int position = 0; int poiter = 0; int end = paragraphText.length(); int starLength = "{start.png}".length(); int runPosition = 0; while (position < end) { position = paragraphText.indexOf("{start.png}", position); String value = ""; if (position == -1) { runPosition = insertPicRun(paragraph, oldRun, runPosition, paragraphText.substring(poiter, end)); break; } if (poiter == position) { position = position + starLength; runPosition = insertSmallRunPic(paragraph, runPosition); poiter = position; continue; } else { runPosition = insertPicRun(paragraph, oldRun, runPosition, paragraphText.substring(poiter, position)); poiter = position; position = poiter + starLength; runPosition = insertSmallRunPic(paragraph, runPosition); poiter = position; } } for (int i = runPosition; i < iRunElements.size(); i++) { paragraph.removeRun(i); } } private static int insertSmallRunPic(XWPFParagraph paragraph, int runPosition) { XWPFRun insertRun = paragraph.insertNewRun(runPosition++); WordParam wordParam = new WordParam(); wordParam.setPicHeight(1); wordParam.setPicWidth(1); wordParam.setMove(false); wordParam.setContent(EssConfig.getReportTemplates() + "start.png"); try { setPicture(insertRun, wordParam); } catch (InvalidFormatException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return runPosition; } private static int insertPicRun(XWPFParagraph paragraph, XWPFRun oldRun, int runPosition, String value) { XWPFRun insertRun = paragraph.insertNewRun(runPosition++); insertRun.setText(value); insertRun.setBold(oldRun.isBold()); insertRun.setColor(oldRun.getColor()); int fontSize = oldRun.getFontSize(); insertRun.setFontSize((fontSize == -1) ? DEFAULT_FONT_SIZE : fontSize); return runPosition; } private static String changeWordAndPicValue(String runValue, XWPFRun run, Map.Entry textSet, String key, XWPFParagraph paragraph, XWPFDocument document) throws org.apache.poi.openxml4j.exceptions.InvalidFormatException, IOException { if (textSet.getValue() instanceof WordParam) { setPicture(run, (WordParam) textSet.getValue()); } else { String keyTemp = textSet.getKey(); String keyValue = Objects.isNull(textSet.getValue()) ? "" : textSet.getValue().toString(); //表格里的换行 特殊处理 因为没有段落 if(StringUtils.contains(keyValue, "%table-line-feed%")){ String[] keyValues = keyValue.split("%table-line-feed%"); runValue = delDynList(keyTemp, Arrays.asList(keyValues), paragraph, document,1); }else{ String[] keyValues = keyValue.split("%line-feed%"); runValue = delDynList(keyTemp, Arrays.asList(keyValues), paragraph, document,0); } log.info("ChangeValue的key值:" + key + " ChangeValue的value值:" + keyValue); runValue = runValue.replaceAll(key, keyValue); } return runValue; } public AjaxResult exportBaseOrDetailReport(String fileName, List deleteFileStrList, List fileNameList) { try { zipWord(fileName, fileNameList); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } deleteFileByStr(deleteFileStrList); return AjaxResult.success(fileName + ".zip"); } public AjaxResult exportZipKeepFiles(String fileName, List deleteFileStrList, List fileNameList) throws FileNotFoundException { zipKeepWord(fileName, fileNameList); deleteFileByStr(deleteFileStrList); return AjaxResult.success(fileName + ".zip"); } public static String makeReportFile(String fileName, TReportTemplate tReportTemplate, Map textMap, Map>> autoTableMap, List deleteFileStrList) { String returnMessage = "导出模板转移错误:"; InputStream in = null; FileOutputStream out = null; String zipFilePath = ""; String reportName = ""; try { String reportType = tReportTemplate.getReportType(); reportType = getTypeIfIsSAQ(tReportTemplate, reportType); reportType = getPositionIfJAQ(textMap, reportType); reportName = textMap.get("sendEmailFileName") + "_" + reportType + "_" + ReportTypeNameEnum.valueOf(tReportTemplate.getTemplateType()).getCode() + "_" + ReportTypeNameEnum.valueOf(tReportTemplate.getLangType()).getCode() + ".docx"; reportName = reportName.replaceAll(" ", "_"); //模板文件需要加锁 synchronized (reportName.intern()){ out = getDownLoadFileOutputStream(reportName); log.info("reportTemplate:" + fileName); //String templateType = tReportTemplate.getTemplateType(); setChageWord(fileName, out, textMap, tReportTemplate.getReportType(),tReportTemplate.getDataPath(), autoTableMap); out.flush(); changColorIfJAQ(textMap, out, reportName, tReportTemplate.getReportType()); } //PAQ、MAQTR采用新的doc转pdf if(ReportTypeEnum.PAQ.getCode().equals(reportType) || ReportTypeEnum.MAQTR.getCode().equals(reportType)){ PdfUtil.convertPDF(EssConfig.getProfile() + "/" + reportName); }else{ //ShellTool.execLibreofficeCommand("pdf", EssConfig.getProfile() + "/" + reportName, EssConfig.getProfile() + "/"); ShellTool shellTool = ShellTool.builder(); shellTool.execNewLibreofficeCommand("pdf", EssConfig.getProfile() + "/" + reportName, EssConfig.getProfile() + "/" + reportName.replace("docx","pdf")); } zipFilePath = getPdfPath(reportName); deleteFileStrList.add(EssConfig.getProfile() + "/" + reportName); } catch (Exception ex) { returnMessage = returnMessage + ex.getMessage(); deleteFileStrList.add(EssConfig.getProfile() + "/" + reportName); log.error("导出模板转移错误:{}\n检查文件:" + fileName, returnMessage, ex); } finally { closeChannel(out); closeChannel(in); } return zipFilePath; } @Nullable private static String getPositionIfJAQ(Map textMap, String reportType) { if (Objects.equals(reportType, "JAQ")) { reportType = Optional.ofNullable(textMap.get("position")).map(p -> p.toString()).orElse("JAQ"); } return reportType; } private static void changColorIfJAQ(Map textMap, FileOutputStream out, String reportName, String reportType) throws IOException { if (Objects.equals(reportType, "JAQ")) { changTableColor(reportName, out, (List) textMap.get("JAQTableStyle")); } } private static String getTypeIfIsSAQ(TReportTemplate tReportTemplate, String reportType) { if (Objects.equals(tReportTemplate.getTemplateType(), TemplateTypeEnum.SAQ.getCode())) { reportType = TemplateTypeEnum.SAQ.getCode(); } return reportType; } private static String getPdfPath(String reportName) { return reportName.substring(0, reportName.lastIndexOf(".")) + ".pdf"; } public static void deleteFileByStr(List deleteFileStrList) { for (String deleteStr : deleteFileStrList) { File file = new File(deleteStr); file.delete(); } } private void zipWord(String fileName, List zipFileNameList) throws FileNotFoundException { List fileList = new ArrayList<>(); File fileZip = getAbsoluteFileZipByName(fileName + ".zip"); try { FileOutputStream zipOut = new FileOutputStream(fileZip); for (String zipFileName : zipFileNameList) { File file = new File(EssConfig.getProfile() + "/" + zipFileName); fileList.add(file); } ZipUtil.toZip(fileList, zipOut); } catch (Exception e) { e.printStackTrace(); } } private void zipKeepWord(String fileName, List zipFileNameList) throws FileNotFoundException { List fileList = new ArrayList<>(); File fileZip = getAbsoluteFileZipByName(fileName + ".zip"); FileOutputStream zipOut = new FileOutputStream(fileZip); for (String zipFileName : zipFileNameList) { File file = new File(EssConfig.getProfile() + "/" + zipFileName); fileList.add(file); } ZipUtil.toZip(fileList, zipOut); } private static FileOutputStream getDownLoadFileOutputStream(String fileName) throws FileNotFoundException { File outFile = new File(EssConfig.getProfile() + "/" + fileName); if (!outFile.getParentFile().exists()) { outFile.getParentFile().mkdirs(); } return new FileOutputStream(outFile); } /** * 内容变更 * @param fileName * @param out * @param textMap * @param reportType * @param autoTableMap * @throws IOException * @throws InvalidFormatException * @throws DocumentException */ private static void setChageWord(String fileName, OutputStream out, Map textMap, String reportType,String dataPath, Map>> autoTableMap) throws IOException, InvalidFormatException, DocumentException { //String filePath = getTemplateDownLoadPathByUpLoad(fileName); XWPFDocument document = new XWPFDocument(POIXMLDocument.openPackage(getTemplateDownLoadPathByUpLoad(fileName))); //设置文本 changeText(document, textMap); //设置文本框 changeTextBox(document, textMap); //插入表格 addTableValue(document, autoTableMap); //更改表格的值 changeTable(document, textMap); //设置图表控件 changChart(textMap, document, reportType,dataPath); document.write(out); } private static void changeTextBox(XWPFDocument document, Map textMap) throws DocumentException { List paragraphs = document.getParagraphs(); for (XWPFParagraph paragraph : paragraphs) { CTR[] rArray = paragraph.getCTP().getRArray(); for (XmlObject ctr : rArray) { Node domNode = ctr.getDomNode(); setTextVal(domNode, textMap); } } } private static void setTextVal(Node node, Map textMap) { if ("w:t".equalsIgnoreCase(node.getNodeName())) { Node wtItem = node.getChildNodes().item(0); if (wtItem != null) { wtItem.setNodeValue(getValByKey(wtItem.getNodeValue(), textMap)); } return; } NodeList childNodes = node.getChildNodes(); for (int i = 0; i < childNodes.getLength(); i++) { setTextVal(childNodes.item(i), textMap); } } private static String getValByKey(String text, Map textMap) { log.debug("changeTextBox:{}",text); if (!checkText(text)) { return text; } String repText = ""; Set> textSets = textMap.entrySet(); for (Map.Entry textSet : textSets) { String key = "%" + textSet.getKey() + "%"; if (text.indexOf(key) != -1) { text = text.replaceAll(key, (String) textMap.get(textSet.getKey())); repText = text; if (checkText(text)) { continue; } else { break; } } } if (repText.indexOf("") != -1) { repText = repText.replaceAll("", ""); repText = repText.replaceAll("", ""); } if (repText.indexOf("N/A NONE") != -1) { repText = repText.replaceAll("N/A NONE", ""); } return repText; } public static void changTableColor(String fileName, OutputStream out, List jaqTableStyleList) throws IOException { if (StringUtils.isEmpty(fileName) || CollUtil.isEmpty(jaqTableStyleList)) { return; } XWPFDocument document = new XWPFDocument(POIXMLDocument.openPackage(EssConfig.getProfile() + "/" + fileName)); if (Objects.isNull(document)) { return; } for (JAQTableStyle jaqTableStyle : jaqTableStyleList) { XWPFTable xwpfTable = document.getTables().get(jaqTableStyle.getTableNum()); for (Map.Entry jaqTableSet : jaqTableStyle.getRowColorMap().entrySet()) { XWPFTableRow row = xwpfTable.getRow(jaqTableSet.getKey()); List cells = row.getTableCells(); for (XWPFTableCell cell : cells) { List paragraphs = cell.getParagraphs(); for (XWPFParagraph paragraph : paragraphs) { List runs = paragraph.getRuns(); for (XWPFRun run : runs) { run.setColor(jaqTableSet.getValue()); } } } } } document.write(out); out.flush(); } /** * 设置图标控件 * @param textMap 替换text * @param document 报告文件 * @param reportType 报告类型 * @param dataPath MAQTR数据路径 */ private static void changChart(Map textMap, XWPFDocument document, String reportType,String dataPath) { if (StringUtils.isEmpty(reportType)) { return; } List charts = document.getCharts(); if (ExamUtil.isListEmpty(charts)) { return; } if (StringUtils.equals(reportType, ReportTypeEnum.MAQ.getCode())) { setMAQCompleteChars(textMap, charts); } else if (StringUtils.equals(reportType, ReportTypeEnum.MAQV2.getCode()) || StringUtils.equals(reportType, ReportTypeEnum.MAQIAR.getCode())) { setMAQ_V2CompleteChars(textMap, charts); } else if (StringUtils.equals(reportType, ReportTypeEnum.RuiLin.getCode())) { setRuiLinChar(textMap, charts); } else if (StringUtils.equals(reportType, ReportTypeEnum.PAQ.getCode())) { PAQChart.changeChart(document, textMap); } else if (StringUtils.equals(reportType, ReportTypeEnum.MAQTR.getCode())) { MAQTRChart.changeMAQTRChart(document, dataPath); } else { return; } } private static void setMAQ_V2CompleteChars(Map textMap, List charts) { String p_Task31 = textMap.get("P_Task31").toString(); String p_People32 = textMap.get("P_People32").toString(); String P_INCON25 = textMap.get("P_INCON25").toString(); String P_IM24 = textMap.get("P_IM24").toString(); String P_SDE23 = textMap.get("P_SDE23").toString(); for (XWPFChart xwpfChart : charts) { try { CTChart ctChart = xwpfChart.getCTChart(); CTPlotArea ctPlotArea = ctChart.getPlotArea(); List scatterChartList = ctPlotArea.getScatterChartList(); List barChartList = ctPlotArea.getBarChartList(); if (scatterChartList.size() != 0 && barChartList.size() != 0) { CTScatterChart ctScatterChart = scatterChartList.get(0); CTScatterSer ctScatterSer = ctScatterChart.getSerList().get(0); CTAxDataSource xVal = ctScatterSer.getXVal(); List ptList = xVal.getNumRef().getNumCache().getPtList(); ptList.get(0).setV(P_INCON25); ptList.get(1).setV(P_IM24); ptList.get(2).setV(P_SDE23); } else if (scatterChartList.size() != 0 && barChartList.size() == 0) { CTScatterChart ctScatterChart = scatterChartList.get(0); CTScatterSer ctScatterSer = ctScatterChart.getSerList().get(0); CTAxDataSource xVal = ctScatterSer.getXVal(); CTNumDataSource yVal = ctScatterSer.getYVal(); xVal.getNumRef().getNumCache().getPtList().get(0).setV(p_Task31); yVal.getNumRef().getNumCache().getPtList().get(0).setV(p_People32); } else if (barChartList.size() != 0) { CTBarChart ctBarChart = barChartList.get(0); List serList = ctBarChart.getSerList(); CTBarSer ctBarSer = serList.get(0); CTNumDataSource val = ctBarSer.getVal(); val.getNumRef().getNumCache().getPtList().get(0).setV(p_People32); val.getNumRef().getNumCache().getPtList().get(1).setV(p_Task31); } } catch (Exception e) { e.printStackTrace(); } } } private static void setRuiLinChar(Map textMap, List charts) { try { int char0Size = charts.get(0).getCTChart().getPlotArea().getBarChartList().get(0).getSerList().get(0).getVal().getNumRef().getNumCache().getPtList().size(); System.out.println("睿邻第0个chart表个数:" + char0Size); int char1Size = charts.get(1).getCTChart().getPlotArea().getBarChartList().get(0).getSerList().get(0).getVal().getNumRef().getNumCache().getPtList().size(); System.out.println("睿邻第1个chart表个数:" + char1Size); Map setCharMap = new HashedMap(); setCharMap.put(12, WordUtil::set12RuilinChartList); setCharMap.put(38, WordUtil::set38RuilinChartList); setCharMap.put(4, WordUtil::set4RuilinChartList); XWPFChart xwpfChart0 = charts.get(0); List ptList = xwpfChart0.getCTChart().getPlotArea().getBarChartList().get(0).getSerList().get(0).getVal().getNumRef().getNumCache().getPtList(); setCharMap.get(char0Size).setsetRuilinChartList(textMap, ptList); XWPFChart xwpfChart1 = charts.get(1); ptList = xwpfChart1.getCTChart().getPlotArea().getBarChartList().get(0).getSerList().get(0).getVal().getNumRef().getNumCache().getPtList(); setCharMap.get(char1Size).setsetRuilinChartList(textMap, ptList); } catch (Exception e) { e.printStackTrace(); } } private static void set38RuilinChartList(Map textMap, List ptList) { ptList.get(37).setV(textMap.get(("P_Com1")).toString()); ptList.get(36).setV(textMap.get(("P_Com3")).toString()); ptList.get(35).setV(textMap.get(("P_Com4")).toString()); ptList.get(34).setV(textMap.get(("P_Com5")).toString()); ptList.get(33).setV(textMap.get(("P_Com7")).toString()); ptList.get(32).setV(textMap.get(("P_Com8")).toString()); ptList.get(31).setV(textMap.get(("P_Com9")).toString()); ptList.get(30).setV(textMap.get(("P_Com10")).toString()); ptList.get(29).setV(textMap.get(("P_Com11")).toString()); ptList.get(28).setV(textMap.get(("P_Com12")).toString()); ptList.get(27).setV(textMap.get(("P_Com13")).toString()); ptList.get(26).setV(textMap.get(("P_Com14")).toString()); ptList.get(25).setV(textMap.get(("P_Com15")).toString()); ptList.get(24).setV(textMap.get(("P_Com16")).toString()); ptList.get(23).setV(textMap.get(("P_Com17")).toString()); ptList.get(22).setV(textMap.get(("P_Com6")).toString()); ptList.get(21).setV(textMap.get(("P_Com19")).toString()); ptList.get(20).setV(textMap.get(("P_Com20")).toString()); ptList.get(19).setV(textMap.get(("P_Com21")).toString()); ptList.get(18).setV(textMap.get(("P_Com22")).toString()); ptList.get(17).setV(textMap.get(("P_Com23")).toString()); ptList.get(16).setV(textMap.get(("P_Com24")).toString()); ptList.get(15).setV(textMap.get(("P_Com25")).toString()); ptList.get(14).setV(textMap.get(("P_Com26")).toString()); ptList.get(13).setV(textMap.get(("P_Com27")).toString()); ptList.get(12).setV(textMap.get(("P_Com28")).toString()); ptList.get(11).setV(textMap.get(("P_Com29")).toString()); ptList.get(10).setV(textMap.get(("P_Com30")).toString()); ptList.get(9).setV(textMap.get(("P_Com31")).toString()); ptList.get(8).setV(textMap.get(("P_Com32")).toString()); ptList.get(7).setV(textMap.get(("P_Com33")).toString()); ptList.get(6).setV(textMap.get(("P_Com34")).toString()); ptList.get(5).setV(textMap.get(("P_Com35")).toString()); ptList.get(4).setV(textMap.get(("P_Com36")).toString()); ptList.get(3).setV(textMap.get(("P_Com37")).toString()); ptList.get(2).setV(textMap.get(("P_Com38")).toString()); ptList.get(1).setV(textMap.get(("P_Com39")).toString()); ptList.get(0).setV(textMap.get(("P_Com40")).toString()); } private static void set4RuilinChartList(Map textMap, List ptList) { ptList.get(0).setV(textMap.get(("P_Com301")).toString()); ptList.get(1).setV(textMap.get(("P_Com302")).toString()); ptList.get(2).setV(textMap.get(("P_Com303")).toString()); ptList.get(3).setV(textMap.get(("P_Com304")).toString()); } private static void set12RuilinChartList(Map textMap, List ptList) { ptList.get(0).setV(textMap.get("P_Com201").toString()); ptList.get(1).setV(textMap.get("P_Com202").toString()); ptList.get(2).setV(textMap.get("P_Com203").toString()); ptList.get(3).setV(textMap.get("P_Com204").toString()); ptList.get(4).setV(textMap.get("P_Com205").toString()); ptList.get(5).setV(textMap.get("P_Com206").toString()); ptList.get(6).setV(textMap.get("P_Com207").toString()); ptList.get(7).setV(textMap.get("P_Com208").toString()); ptList.get(8).setV(textMap.get("P_Com209").toString()); ptList.get(9).setV(textMap.get("P_Com210").toString()); ptList.get(10).setV(textMap.get("P_Com211").toString()); ptList.get(11).setV(textMap.get("P_Com212").toString()); } private static void setMAQCompleteChars(Map textMap, List charts) { String p_Task31 = textMap.get("P_Task31").toString(); String p_People32 = textMap.get("P_People32").toString(); XWPFChart xwpfChart = charts.get(0); if (!setMAQbarGraph(p_Task31, p_People32, xwpfChart)) { log.info("第二个是条形"); setMAQcanvasChart(p_Task31, p_People32, xwpfChart); } XWPFChart xwpfChartLeadershipFourSided = charts.get(1); if (!setMAQcanvasChart(p_Task31, p_People32, xwpfChartLeadershipFourSided)) { log.info("第一个是画布"); setMAQbarGraph(p_Task31, p_People32, xwpfChartLeadershipFourSided); } } private static boolean setMAQcanvasChart(String p_Task31, String p_People32, XWPFChart xwpfChartLeadershipFourSided) { try { CTChart ctChartFourSided = xwpfChartLeadershipFourSided.getCTChart(); CTPlotArea ctPlotAreaFourSided = ctChartFourSided.getPlotArea(); List scatterChartList = ctPlotAreaFourSided.getScatterChartList(); CTScatterChart ctScatterChart = scatterChartList.get(0); CTScatterSer ctScatterSer = ctScatterChart.getSerList().get(0); CTAxDataSource xVal = ctScatterSer.getXVal(); CTNumDataSource yVal = ctScatterSer.getYVal(); xVal.getNumRef().getNumCache().getPtList().get(0).setV(p_Task31); yVal.getNumRef().getNumCache().getPtList().get(0).setV(p_People32); } catch (Exception e) { e.printStackTrace(); return false; } return true; } private static boolean setMAQbarGraph(String p_Task31, String p_People32, XWPFChart xwpfChart) { try { CTChart ctChart = xwpfChart.getCTChart(); CTPlotArea ctPlotArea = ctChart.getPlotArea(); List barChartList = ctPlotArea.getBarChartList(); CTBarChart ctBarChart = barChartList.get(0); List serList = ctBarChart.getSerList(); CTBarSer ctBarSer = serList.get(0); CTNumDataSource val = ctBarSer.getVal(); val.getNumRef().getNumCache().getPtList().get(0).setV(p_Task31); val.getNumRef().getNumCache().getPtList().get(1).setV(p_People32); } catch (Exception e) { e.printStackTrace(); return false; } return true; } private String getTemplateDownLoadPath(String fileName) { return EssConfig.getReportTemplates() + fileName; } private static String getTemplateDownLoadPathByUpLoad(String fileName) { return EssConfig.getUploadPath() + fileName; } public static String getTemplatePicture(String pictureName) { return EssConfig.getReportTemplates() + pictureName; } private static void closeChannel(InputStream inputStream) { try { if (Objects.nonNull(inputStream)) { inputStream.close(); } } catch (IOException ioe) { log.error("关闭通道失败:{}", ioe.getMessage(), ioe); } } private static void closeChannel(OutputStream outputStream) { try { if (Objects.nonNull(outputStream)) { outputStream.close(); } } catch (IOException ioe) { log.error("关闭通道失败:{}", ioe.getMessage(), ioe); } } public File getAbsoluteFileZipByName(String filename) { String downloadPath = EssConfig.getDownloadPath() + "/" + filename; File desc = new File(downloadPath); if (!desc.getParentFile().exists()) { desc.getParentFile().mkdirs(); } return desc; } public static void insertNextPageChar(XWPFDocument document) { XWPFParagraph paragraph = document.createParagraph(); CTPPr ctpPr = paragraph.getCTP().addNewPPr(); ctpPr.addNewSectPr(); } private static String delDynList(String placeholder, List obj, XWPFParagraph oldParagraph, XWPFDocument templateDoc,Integer flag) { String placeholderValue = placeholder; List dataList = obj; //普通换行降序处理 表格换行无需降序 if(flag == 0){ Collections.reverse(dataList); } XWPFRun oldRun = oldParagraph.getRuns().size() > 0 ? oldParagraph.getRuns().get(0) : null; Boolean isBold = Objects.nonNull(oldRun) ? oldRun.isBold() : false; for (int i = 0, size = dataList.size(); i < size; i++) { Object text = dataList.get(i); if (i == 0) { placeholderValue = String.valueOf(text); } else { XWPFParagraph paragraph = null; if(flag == 0){ paragraph = createParagraph(oldParagraph, templateDoc, oldRun, isBold, String.valueOf(text)); }else if(flag == 1){ paragraph = createTableRun(oldParagraph, oldRun, isBold, String.valueOf(text)); } if (paragraph != null) { oldParagraph = paragraph; } } } return placeholderValue; } public static XWPFParagraph createParagraph(XWPFParagraph oldParagraph, XWPFDocument templateDoc, XWPFRun oldRun, boolean isBold, String... texts) { XmlCursor cursor = oldParagraph.getCTP().newCursor(); XWPFParagraph newPar = templateDoc.insertNewParagraph(cursor); newPar.getCTP().setPPr(oldParagraph.getCTP().getPPr()); copyParagraph(oldParagraph, newPar, oldRun, isBold, texts); return newPar; } /** * 创建table表格换行 段落run * @param oldParagraph * @param oldRun * @param isBold * @param texts * @return */ public static XWPFParagraph createTableRun(XWPFParagraph oldParagraph,XWPFRun oldRun, boolean isBold, String... texts) { XWPFRun run = oldParagraph.createRun(); run.addBreak(); run.setText(texts[0]); run.setFontFamily(oldRun.getFontFamily()); int fontSize = oldRun.getFontSize(); run.setFontSize((fontSize == -1) ? DEFAULT_FONT_SIZE : fontSize); run.setBold(isBold); run.setItalic(oldRun.isItalic()); run.setColor(oldRun.getColor()); return null; } private static void copyParagraph(XWPFParagraph sourcePar, XWPFParagraph targetPar, XWPFRun oldRun, boolean isBold, String... texts) { targetPar.setAlignment(sourcePar.getAlignment()); targetPar.setVerticalAlignment(sourcePar.getVerticalAlignment()); targetPar.setAlignment(sourcePar.getAlignment()); targetPar.setVerticalAlignment(sourcePar.getVerticalAlignment()); if (texts != null && texts.length > 0) { String[] arr = texts; for (int i = 0, len = texts.length; i < len; i++) { String text = arr[i]; XWPFRun run = targetPar.createRun(); run.setText(text); run.setFontFamily(oldRun.getFontFamily()); int fontSize = oldRun.getFontSize(); run.setFontSize((fontSize == -1) ? DEFAULT_FONT_SIZE : fontSize); run.setBold(isBold); run.setItalic(oldRun.isItalic()); run.setColor(oldRun.getColor()); } } String parText = targetPar.getText(); if (parText.indexOf("") != -1) { oldRun.setBold(isBold); setOtherStyle(parText, targetPar, 0, oldRun); } } public static void changeJAQStyle(Map textMap, int tableNum, int inum, String line) { JAQTableStyle jaqTableStyle = new JAQTableStyle(); jaqTableStyle.setTableNum(tableNum); Map rowColorMap = new HashMap<>(); jaqTableStyle.setRowColorMap(rowColorMap); for (Integer i = 1; i <= inum; i++) { if (Objects.equals(textMap.get(line + i.toString() + "C"), "1")) { rowColorMap.put(i, "C00000"); } } if (CollUtil.isNotEmpty(rowColorMap)) { List jaqTableStyleList = null; if (CollUtil.isNotEmpty((List) textMap.get("JAQTableStyle"))) { jaqTableStyleList = (List) textMap.get("JAQTableStyle"); } else { jaqTableStyleList = new ArrayList<>(); } jaqTableStyleList.add(jaqTableStyle); textMap.put("JAQTableStyle", jaqTableStyleList); } } public static int getTextSize(String runValue){ Pattern pattern = Pattern.compile("%\\w+%"); Matcher matcher = pattern.matcher(runValue); List result = new ArrayList<>(); while(matcher.find()){ result.add(matcher.group()); } return result.size(); } public static void main(String[] args) { /* if (!checkText("人才选拔的目的就是找到能够胜任工作、愿意承担工作,且与组织的需求、文化、价值观相匹配的人。PAQ报告是根据候选人对PAQ问卷中题目的作答信息而生成的,测量的是候选人在工作中偏好的行为风格。PAQ也包括了对作答真实性的测量,同时也装入了TAI专有的作假防范程序,可以有效降低候选人的伪装好倾向(全球30%的自评问卷中都出现了伪装好现象)。")) { System.out.println("11"); }*/ try { InputStream is = new FileInputStream("C:\\Users\\大头\\Desktop\\JAQ中文版.docx"); XWPFDocument document = new XWPFDocument(is); String result = "{\"T3Line21C\":\"0\",\"T4com8item1\":\"JAQ0027\",\"T1com8IF_H\":\"15.20\",\"T4com8item3\":\"JAQ0070\",\"T4com8item2\":\"JAQ0014\",\"T1com8IF_L\":\"15.20\",\"T1com8IF_M\":\"15.20\",\"T3item2\":\"JAQ0092\",\"T2com1I_L\":\"4.40\",\"T3item3\":\"JAQ0019\",\"T3item4\":\"JAQ0027\",\"T3item5\":\"JAQ0048\",\"T3item6\":\"JAQ0044\",\"T3item7\":\"JAQ0045\",\"T3item8\":\"JAQ0057\",\"T3item9\":\"JAQ0053\",\"T2com1I_H\":\"4.40\",\"T3item3IF_M\":\"20.00\",\"T3Line10C\":\"0\",\"T3Line22C\":\"0\",\"T3Line9C\":\"0\",\"T1com1IF_M\":\"17.60\",\"T1com1IF_L\":\"17.60\",\"T2com6I_L\":\"4.00\",\"T1com1IF_H\":\"17.60\",\"T1com4IF_M\":\"16.72\",\"T1com4IF_L\":\"16.72\",\"T3Line11C\":\"0\",\"T2com6I_H\":\"4.00\",\"T1com4IF_H\":\"16.72\",\"T3item16IF_M\":\"20.00\",\"T3com18\":\"1. 适应性和变革管理\",\"T4com6item1\":\"JAQ0114\",\"T3com17\":\"20. 授权\",\"T4com6item3\":\"JAQ0050\",\"T3com19\":\"1. 适应性和变革管理\",\"T4com6item2\":\"JAQ0016\",\"T3Line8C\":\"0\",\"T3com10\":\"4. 沟通\",\"T3item13IF_M\":\"20.00\",\"T3com12\":\"6. 压力忍受-情绪韧性\",\"T3com11\":\"20. 授权\",\"T3com14\":\"15. 计划和组织\",\"T3Line23C\":\"0\",\"T3com13\":\"20. 授权\",\"T3com16\":\"8. 团队协作\",\"T3com15\":\"4. 沟通\",\"T1com11IF_L\":\"14.44\",\"T1com11IF_M\":\"14.44\",\"T1com11IF_H\":\"14.44\",\"T2com1\":\"8. 团队协作\",\"T2com2\":\"20. 授权\",\"T3Line6C\":\"0\",\"T2com9\":\"24. 组织敏锐度\",\"T2com7\":\"9. 同理心\",\"T2com8\":\"16. 创造性\",\"T2com5\":\"4. 沟通\",\"T3item7IF_M\":\"20.00\",\"T3Line7C\":\"0\",\"T2com6\":\"6. 压力忍受-情绪韧性\",\"T3item24IF_M\":\"16.00\",\"T2com3\":\"11. 客户导向(内部和外部)\",\"T2Com5I_M\":\"4.00\",\"T2com4\":\"23. 激励他人\",\"T3Line12C\":\"0\",\"T3Line24C\":\"0\",\"T1com4\":\"20. 授权\",\"T4com2item2\":\"JAQ0057\",\"T1com5\":\"4. 沟通\",\"T4com2item3\":\"JAQ0020\",\"T1com6\":\"6. 压力忍受-情绪韧性\",\"T1com7\":\"9. 同理心\",\"T4com2item1\":\"JAQ0045\",\"T1com8\":\"24. 组织敏锐度\",\"T1com9\":\"26. 正直、信任和公信力\",\"T2Com6I_M\":\"4.00\",\"T1com1\":\"8. 团队协作\",\"T1com2\":\"11. 客户导向(内部和外部)\",\"T1com3\":\"23. 激励他人\",\"T2Line9C\":\"0\",\"T1com7IF_H\":\"15.20\",\"T2com5I_H\":\"4.00\",\"T1com7IF_M\":\"15.20\",\"T3Line13C\":\"0\",\"T1com7IF_L\":\"15.20\",\"T3Line25C\":\"0\",\"T2com5I_L\":\"4.00\",\"T1com2IF_M\":\"16.80\",\"T1com2IF_L\":\"16.80\",\"T1com2IF_H\":\"16.80\",\"表4子集合\":\"3\",\"T2rank1\":\"1\",\"T3item4IF_M\":\"20.00\",\"T2rank3\":\"3\",\"T3com21\":\"26. 正直、信任和公信力\",\"T2rank2\":\"2\",\"T3com20\":\"20. 授权\",\"T2rank5\":\"5\",\"T3com23\":\"24. 组织敏锐度\",\"T2rank4\":\"4\",\"T3com22\":\"26. 正直、信任和公信力\",\"T2rank7\":\"7\",\"T3com25\":\"6. 压力忍受-情绪韧性\",\"T2rank6\":\"6\",\"T3com24\":\"23. 激励他人\",\"T2rank9\":\"9\",\"T3Line14C\":\"0\",\"T2rank8\":\"8\",\"T3item23IF_M\":\"16.00\",\"T3item25\":\"JAQ0016\",\"T3item24\":\"JAQ0015\",\"T3item23\":\"JAQ0014\",\"T1rank9\":\"9\",\"T3item22\":\"JAQ0090\",\"T3item21\":\"JAQ0095\",\"T3item20\":\"JAQ0129\",\"T1rank6\":\"6\",\"T1com3IF_M\":\"16.80\",\"T1rank5\":\"5\",\"T1com3IF_L\":\"16.80\",\"T1rank8\":\"8\",\"T1rank7\":\"7\",\"T1rank2\":\"2\",\"T1rank1\":\"1\",\"T1rank4\":\"4\",\"T1rank3\":\"3\",\"表1\":\"12\",\"表2\":\"12\",\"表3\":\"25\",\"表4\":\"8\",\"T1com3IF_H\":\"16.80\",\"T3Line15C\":\"0\",\"T4com1item3\":\"JAQ0042\",\"T3item8IF_M\":\"20.00\",\"T3item17IF_M\":\"20.00\",\"T4com7item3\":\"JAQ0100\",\"T3item19\":\"JAQ0128\",\"T3item18\":\"JAQ0006\",\"T4com7item1\":\"JAQ0044\",\"T3item12IF_M\":\"20.00\",\"T3item17\":\"JAQ0089\",\"T4com7item2\":\"JAQ0097\",\"T3item16\":\"JAQ0001\",\"T3item15\":\"JAQ0120\",\"T1com12IF_M\":\"14.40\",\"T3item14\":\"JAQ0002\",\"T3item13\":\"JAQ0076\",\"T3item12\":\"JAQ0114\",\"T3item11\":\"JAQ0105\",\"T3item10\":\"JAQ0102\",\"T3item1\":\"JAQ0008\",\"T1com12IF_H\":\"14.40\",\"T1com12IF_L\":\"14.40\",\"T2Com10I_M\":\"3.80\",\"T2com10I_H\":\"3.80\",\"T3Line16C\":\"0\",\"T2Com1I_M\":\"4.40\",\"T2com4I_H\":\"4.20\",\"T2com10I_L\":\"3.80\",\"T4com1item2\":\"JAQ0001\",\"T2com4I_L\":\"4.20\",\"T4com1item1\":\"JAQ0048\",\"T2Line4C\":\"0\",\"T3item5IF_M\":\"20.00\",\"T2com11I_H\":\"3.80\",\"T3Line1C\":\"1\",\"T3Line17C\":\"0\",\"T2Com2I_M\":\"4.40\",\"T2com11I_L\":\"3.80\",\"T2com9I_L\":\"4.00\",\"T2com9I_H\":\"4.00\",\"T2Line5C\":\"0\",\"T2Com7I_M\":\"4.00\",\"T2Line6C\":\"0\",\"T3Line18C\":\"0\",\"T2com12\":\"15. 计划和组织\",\"T2Line11C\":\"1\",\"T2com10\":\"1. 适应性和变革管理\",\"T2com11\":\"3. 主动性\",\"T4com5item3\":\"JAQ0034\",\"T4com5item1\":\"JAQ0102\",\"T4com5item2\":\"JAQ0120\",\"T4com3\":\"23. 激励他人\",\"T4com4\":\"20. 授权\",\"T4com1\":\"8. 团队协作\",\"T3item9IF_M\":\"20.00\",\"T3item22IF_M\":\"16.00\",\"T4com2\":\"11. 客户导向(内部和外部)\",\"T4com7\":\"9. 同理心\",\"T3item2IF_M\":\"20.00\",\"T4com8\":\"24. 组织敏锐度\",\"T4com5\":\"4. 沟通\",\"T2Com8I_M\":\"4.00\",\"T2Com11I_M\":\"3.80\",\"T4com6\":\"6. 压力忍受-情绪韧性\",\"T2com3I_H\":\"4.20\",\"T3rank22\":\"22\",\"T3rank21\":\"21\",\"T3rank20\":\"20\",\"T2Line7C\":\"0\",\"T3Line19C\":\"0\",\"T2com3I_L\":\"4.20\",\"T3rank25\":\"25\",\"T3rank24\":\"24\",\"T3rank23\":\"23\",\"T2Line10C\":\"0\",\"T1com6IF_M\":\"15.20\",\"T1com6IF_L\":\"15.20\",\"T3item18IF_M\":\"16.00\",\"T1com6IF_H\":\"15.20\",\"T3item11IF_M\":\"20.00\",\"T2Line8C\":\"0\",\"T2com8I_L\":\"4.00\",\"T1com9IF_M\":\"15.20\",\"T3rank1\":\"1\",\"T2com8I_H\":\"4.00\",\"T3rank2\":\"2\",\"T3item10IF_M\":\"20.00\",\"T3rank9\":\"9\",\"T3Line5C\":\"0\",\"T3rank7\":\"7\",\"T3rank8\":\"8\",\"T3rank5\":\"5\",\"T3rank6\":\"6\",\"T3rank3\":\"3\",\"T3rank4\":\"4\",\"T4rank7\":\"7\",\"T4rank6\":\"6\",\"T4rank5\":\"5\",\"T4rank4\":\"4\",\"T4com3item3\":\"JAQ0133\",\"T4com3item2\":\"JAQ0015\",\"T4com3item1\":\"JAQ0019\",\"T4rank8\":\"8\",\"T3item6IF_M\":\"20.00\",\"T4rank3\":\"3\",\"T4rank2\":\"2\",\"T4rank1\":\"1\",\"T3rank19\":\"19\",\"T2Line1C\":\"0\",\"T3rank18\":\"18\",\"T2Line12C\":\"1\",\"T3rank17\":\"17\",\"T3rank16\":\"16\",\"T2com12I_H\":\"3.80\",\"T3Line4C\":\"0\",\"T3item20IF_M\":\"16.00\",\"T2Com12I_M\":\"3.80\",\"T2Com3I_M\":\"4.20\",\"T3item14IF_M\":\"20.00\",\"T3rank11\":\"11\",\"T3rank10\":\"10\",\"T2com2I_H\":\"4.40\",\"T1com9IF_H\":\"15.20\",\"T2com12I_L\":\"3.80\",\"T3rank15\":\"15\",\"T3rank14\":\"14\",\"T2com2I_L\":\"4.40\",\"T3rank13\":\"13\",\"T1com9IF_L\":\"15.20\",\"T3rank12\":\"12\",\"T2rank10\":\"10\",\"T3item15IF_M\":\"20.00\",\"T2Line2C\":\"0\",\"T2rank12\":\"12\",\"T2rank11\":\"11\",\"T3Line3C\":\"0\",\"T1com10IF_M\":\"14.44\",\"T1com10IF_L\":\"14.44\",\"T2Com4I_M\":\"4.20\",\"T1com10IF_H\":\"14.44\",\"T3item25IF_M\":\"16.00\",\"T3item1IF_M\":\"20.00\",\"T3item21IF_M\":\"16.00\",\"T2com7I_L\":\"4.00\",\"T3com6\":\"9. 同理心\",\"T3com7\":\"11. 客户导向(内部和外部)\",\"T3Line20C\":\"0\",\"T2com7I_H\":\"4.00\",\"T3com8\":\"11. 客户导向(内部和外部)\",\"T3com9\":\"3. 主动性\",\"T3com2\":\"16. 创造性\",\"T3com3\":\"23. 激励他人\",\"T3com4\":\"24. 组织敏锐度\",\"T2Line3C\":\"0\",\"T3com5\":\"8. 团队协作\",\"T1rank12\":\"12\",\"T1rank11\":\"11\",\"T1rank10\":\"10\",\"T3Line2C\":\"0\",\"T1com5IF_H\":\"15.20\",\"T1com10\":\"1. 适应性和变革管理\",\"T1com11\":\"27. 行动果敢\",\"T2Com9I_M\":\"4.00\",\"T1com12\":\"16. 创造性\",\"T3item19IF_M\":\"16.00\",\"T1com5IF_M\":\"15.20\",\"T3com1\":\"13. 应用所习得的专业知识\",\"T4com4item1\":\"JAQ0105\",\"T1com5IF_L\":\"15.20\",\"T4com4item2\":\"JAQ0076\",\"T4com4item3\":\"JAQ0089\"}"; JSONObject jsonObject = JSONObject.parseObject(result); //json对象转Map Map textMap = jsonObject; //更改表格的值 changeTable(document, textMap); //建立文件对象 File file = new File("C:\\Users\\大头\\Desktop\\JAQ中文版1.docx"); FileOutputStream out = new FileOutputStream(file); document.write(out); out.flush(); }catch (Exception e){ e.printStackTrace(); } } }