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.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<String, String> colorLabel = new HashMap<String, String>() {{
|
put("<YellowText>", "</YellowText>");
|
}};
|
private static Map<String, String> fontSize = new HashMap<String, String>() {{
|
put("<FontSize_11>", "</FontSize_11>");
|
}};
|
public static final int DEFAULT_FONT_SIZE = 10;
|
|
public static boolean changWord(String inputUrl, String outputUrl,
|
Map<String, Object> textMap, Map<String, Object> 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<String, Object> textMap, Map<String, Object> 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<String, Object> 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<String, Object> textMap) throws IOException, InvalidFormatException {
|
|
setHeader(document, textMap);
|
|
|
List<IBodyElement> elements = document.getBodyElements();
|
List<XWPFParagraph> 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<IRunElement> iRunElements = paragraph.getIRuns();
|
List<XWPFRun> 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<String, Object> textMap) {
|
try {
|
List<XWPFHeader> headerList = document.getHeaderList();
|
for (XWPFHeader header : headerList) {
|
List<XWPFParagraph> paragraphs = header.getParagraphs();
|
setHeadTable(document, textMap, header);
|
setHeadParagraph(textMap, paragraphs);
|
}
|
} catch (Exception e) {
|
log.info("正常的异常,没有表头数据{}", e.getMessage(), e);
|
}
|
}
|
private static void setHeadParagraph(Map<String, Object> textMap, List<XWPFParagraph> paragraphs) {
|
for (XWPFParagraph xwpfParagraph : paragraphs) {
|
List<XWPFRun> 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<String, Object> 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<XWPFTable> 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<XWPFParagraph> paragraphs = document.getParagraphs();
|
for (XWPFParagraph paragraph : paragraphs) {
|
|
String text = paragraph.getText();
|
if (text.indexOf("%page-change%") != -1) {
|
List<XWPFRun> 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<XWPFParagraph> paragraphs = document.getParagraphs();
|
for (XWPFParagraph paragraph : paragraphs) {
|
|
String text = paragraph.getText();
|
if (text.indexOf("%line-feed%") != -1) {
|
List<XWPFRun> 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 =
|
"<wp:anchor xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" "
|
+ "simplePos=\"0\" relativeHeight=\"" + relativeHeight + "\" behindDoc=\"" + ((behind) ? 1 : 0) + "\" locked=\"0\" layoutInCell=\"1\" allowOverlap=\"1\">"
|
+ "<wp:simplePos x=\"0\" y=\"0\"/>"
|
+ "<wp:positionH relativeFrom=\"column\">"
|
+ "<wp:posOffset>" + leftOffset + "</wp:posOffset>"
|
+ "</wp:positionH>"
|
+ "<wp:positionV relativeFrom=\"paragraph\">"
|
+ "<wp:posOffset>" + topOffset + "</wp:posOffset>" +
|
"</wp:positionV>"
|
+ "<wp:extent cx=\"" + width + "\" cy=\"" + height + "\"/>"
|
+ "<wp:effectExtent l=\"0\" t=\"0\" r=\"0\" b=\"0\"/>"
|
+ "<wp:wrapNone/>"
|
+ "<wp:docPr id=\"1\" name=\"Drawing 0\" descr=\"" + deskFileName + "\"/><wp:cNvGraphicFramePr/>"
|
+ "</wp:anchor>";
|
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<String, Object> textMap) {
|
|
List<XWPFTable> tables = document.getTables();
|
setTableValue(document, textMap, tables);
|
}
|
|
/**
|
* 设置表格值
|
* @param document
|
* @param textMap
|
* @param tables
|
*/
|
private static void setTableValue(XWPFDocument document, Map<String, Object> textMap, List<XWPFTable> 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<XWPFTableRow> 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<String, Object> 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<XWPFTableCell> 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<XWPFTableCell> 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<XWPFTableCell> 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<XWPFRun> 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<XWPFRun> 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<String, Object> textMap){
|
|
// 在表格中指定的位置新增一行
|
insertRow(table,1,index);
|
|
XWPFTableRow row = table.getRows().get(index);
|
List<XWPFTableCell> 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<String> 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<XWPFTableCell> 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<Integer, Map<Integer, List<String[]>>> autoTableMap) {
|
if (Objects.isNull(autoTableMap)) {
|
return;
|
}
|
List<XWPFTable> 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<Integer, List<String[]>> mapRowsMap = autoTableMap.get(i);
|
log.info("插入" + table.getText());
|
insertTable(table, mapRowsMap.get(i), 1);
|
}
|
} catch (Exception e) {
|
log.info("表格发生了多行!");
|
}
|
}
|
}
|
/* private static void setTableMap(Map<String, Object> tableMap, Map<Integer, List<String[]>> mapRowsMap) {
|
if (Objects.isNull(tableMap) || tableMap.isEmpty()) {
|
return;
|
}
|
|
List<Table1> table1 = (List<Table1>) tableMap.get("table1");
|
List<String[]> table1List = new ArrayList<>();
|
for (Table1 t : table1) {
|
table1List.add(t.toRow());
|
}
|
mapRowsMap.put(0, table1List);
|
|
List<Table2> table2 = (List<Table2>) tableMap.get("table2");
|
List<String[]> table2List = new ArrayList<>();
|
for (Table2 t : table2) {
|
table2List.add(t.toRow());
|
}
|
mapRowsMap.put(1, table2List);
|
|
List<Table3> table3 = (List<Table3>) tableMap.get("table3");
|
List<String[]> table3List = new ArrayList<>();
|
for (Table3 t : table3) {
|
table3List.add(t.toRow());
|
}
|
mapRowsMap.put(2, table3List);
|
|
List<Table4> table4 = (List<Table4>) tableMap.get("table4");
|
List<String[]> table4List = new ArrayList<>();
|
for (Table4 t : table4) {
|
table4List.add(t.toRow());
|
}
|
mapRowsMap.put(3, table4List);
|
}*/
|
|
public static void eachTable(List<XWPFTableRow> rows, Map<String, Object> textMap, XWPFDocument document) throws IOException, org.apache.poi.openxml4j.exceptions.InvalidFormatException {
|
for (XWPFTableRow row : rows) {
|
List<XWPFTableCell> cells = row.getTableCells();
|
for (XWPFTableCell cell : cells) {
|
|
//如果当前表格包含%就代表需要替换
|
if (checkText(cell.getText())) {
|
List<XWPFParagraph> paragraphs = cell.getParagraphs();
|
for (XWPFParagraph paragraph : paragraphs) {
|
//获取所有行
|
List<IRunElement> iRunElements = paragraph.getIRuns();
|
List<XWPFRun> 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<String, Object> 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<String[]> 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<XWPFTableCell> 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<String, Object> textMap, XWPFRun run, XWPFParagraph paragraph, XWPFDocument document, int runPosition) throws IOException, org.apache.poi.openxml4j.exceptions.InvalidFormatException {
|
log.debug("changeText:{}",runValue);
|
Set<Map.Entry<String, Object>> textSets = textMap.entrySet();
|
for (Map.Entry<String, Object> 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("<BoldText>") != -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<String> stringList = new ArrayList<>();
|
while (pointer < end) {
|
position = runValue.indexOf("<BoldText>", 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("</BoldText>", pointer);
|
position += 11;
|
String newRunStr = runValue.substring(pointer, position);
|
if (StringUtils.isNotEmpty(newRunStr)) {
|
newRunStr = newRunStr.replaceAll("<BoldText>", "");
|
newRunStr = newRunStr.replaceAll("</BoldText>", "");
|
|
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 "<YellowText>":
|
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<IRunElement> 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<String, Object> 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<String> deleteFileStrList, List<String> 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<String> deleteFileStrList, List<String> fileNameList) throws FileNotFoundException {
|
|
zipKeepWord(fileName, fileNameList);
|
|
deleteFileByStr(deleteFileStrList);
|
return AjaxResult.success(fileName + ".zip");
|
}
|
|
|
public static String makeReportFile(String fileName, TReportTemplate tReportTemplate, Map<String, Object> textMap, Map<Integer, Map<Integer, List<String[]>>> autoTableMap, List<String> 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(" ", "_");
|
out = getDownLoadFileOutputStream(reportName);
|
|
log.info("reportTemplate:" + fileName);
|
String templateType = tReportTemplate.getTemplateType();
|
setChageWord(fileName, out, textMap, tReportTemplate.getReportType(), templateType, autoTableMap);
|
out.flush();
|
changColorIfJAQ(textMap, out, reportName, tReportTemplate.getReportType());
|
//PAQ采用新的doc转pdf
|
if(!ReportTypeEnum.PAQ.getCode().equals(reportType)){
|
ShellTool.execLibreofficeCommand("pdf", EssConfig.getProfile() + "/" + reportName, EssConfig.getProfile() + "/");
|
}else{
|
PdfUtil.convertPDF(EssConfig.getProfile() + "/" + reportName);
|
}
|
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<String, Object> 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<String, Object> textMap, FileOutputStream out, String reportName, String reportType) throws IOException {
|
if (Objects.equals(reportType, "JAQ")) {
|
changTableColor(reportName, out, (List<JAQTableStyle>) 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<String> deleteFileStrList) {
|
|
for (String deleteStr : deleteFileStrList) {
|
File file = new File(deleteStr);
|
file.delete();
|
}
|
}
|
private void zipWord(String fileName, List<String> zipFileNameList) throws FileNotFoundException {
|
List<File> 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<String> zipFileNameList) throws FileNotFoundException {
|
List<File> 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);
|
}
|
private static void setChageWord(String fileName, OutputStream out, Map<String, Object> textMap, String reportType, String templateType, Map<Integer, Map<Integer, List<String[]>>> autoTableMap) throws IOException, org.apache.poi.openxml4j.exceptions.InvalidFormatException, DocumentException {
|
String filePath = getTemplateDownLoadPathByUpLoad(fileName);
|
|
XWPFDocument document = new XWPFDocument(POIXMLDocument.openPackage(getTemplateDownLoadPathByUpLoad(fileName)));
|
|
//设置文本
|
changeText(document, textMap);
|
|
//设置文本框
|
changeTextBox(document, textMap);
|
|
//设置图表
|
if (Objects.equals(reportType, ReportTypeEnum.PAQ.getCode())) {
|
PAQChart.changeChart(document, textMap);
|
}
|
|
//插入表格
|
addTableValue(document, autoTableMap);
|
|
//更改表格的值
|
changeTable(document, textMap);
|
|
//设置图表控件
|
changChar(textMap, document, reportType, templateType);
|
document.write(out);
|
}
|
private static void changeTextBox(XWPFDocument document, Map<String, Object> textMap) throws DocumentException {
|
List<XWPFParagraph> 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<String, Object> 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<String, Object> textMap) {
|
log.debug("changeTextBox:{}",text);
|
if (!checkText(text)) {
|
return text;
|
}
|
String repText = "";
|
Set<Map.Entry<String, Object>> textSets = textMap.entrySet();
|
for (Map.Entry<String, Object> 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("<BoldText>") != -1) {
|
repText = repText.replaceAll("<BoldText>", "");
|
repText = repText.replaceAll("</BoldText>", "");
|
}
|
if (repText.indexOf("N/A NONE") != -1) {
|
repText = repText.replaceAll("N/A NONE", "");
|
}
|
return repText;
|
}
|
public static void changTableColor(String fileName, OutputStream out, List<JAQTableStyle> 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<Integer, String> jaqTableSet : jaqTableStyle.getRowColorMap().entrySet()) {
|
XWPFTableRow row = xwpfTable.getRow(jaqTableSet.getKey());
|
List<XWPFTableCell> cells = row.getTableCells();
|
for (XWPFTableCell cell : cells) {
|
List<XWPFParagraph> paragraphs = cell.getParagraphs();
|
for (XWPFParagraph paragraph : paragraphs) {
|
List<XWPFRun> runs = paragraph.getRuns();
|
for (XWPFRun run : runs) {
|
run.setColor(jaqTableSet.getValue());
|
}
|
}
|
}
|
}
|
}
|
document.write(out);
|
out.flush();
|
}
|
|
/**
|
* 设置图标控件
|
* @param textMap
|
* @param document
|
* @param reportType
|
* @param templateType
|
*/
|
private static void changChar(Map<String, Object> textMap, XWPFDocument document, String reportType, String templateType) {
|
if (StringUtils.isEmpty(reportType) || StringUtils.isEmpty(templateType)) {
|
return;
|
}
|
List<XWPFChart> 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 {
|
return;
|
}
|
}
|
private static void setMAQ_V2CompleteChars(Map<String, Object> textMap, List<XWPFChart> 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<CTScatterChart> scatterChartList = ctPlotArea.getScatterChartList();
|
List<CTBarChart> 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<CTNumVal> 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<CTBarSer> 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<String, Object> textMap, List<XWPFChart> 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<Integer, RuiLinChar> setCharMap = new HashedMap();
|
setCharMap.put(12, WordUtil::set12RuilinChartList);
|
setCharMap.put(38, WordUtil::set38RuilinChartList);
|
setCharMap.put(4, WordUtil::set4RuilinChartList);
|
|
XWPFChart xwpfChart0 = charts.get(0);
|
List<CTNumVal> 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<String, Object> textMap, List<CTNumVal> 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<String, Object> textMap, List<CTNumVal> 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<String, Object> textMap, List<CTNumVal> 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<String, Object> textMap, List<XWPFChart> 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<CTScatterChart> 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<CTBarChart> barChartList = ctPlotArea.getBarChartList();
|
CTBarChart ctBarChart = barChartList.get(0);
|
List<CTBarSer> 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("<BoldText>") != -1) {
|
oldRun.setBold(isBold);
|
setOtherStyle(parText, targetPar, 0, oldRun);
|
}
|
}
|
public static void changeJAQStyle(Map<String, Object> textMap, int tableNum, int inum, String line) {
|
JAQTableStyle jaqTableStyle = new JAQTableStyle();
|
jaqTableStyle.setTableNum(tableNum);
|
Map<Integer, String> 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<JAQTableStyle> 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<String> 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<String,Object> 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();
|
}
|
}
|
}
|