From 38c060a610e8c27dfc54e064f4fb4fd22b6b4d56 Mon Sep 17 00:00:00 2001 From: linzhijie <19970921lzj> Date: 星期一, 12 四月 2021 15:53:52 +0800 Subject: [PATCH] 最新代码 --- src/main/java/com/ots/common/utils/poi/WordUtil.java | 246 ++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 201 insertions(+), 45 deletions(-) diff --git a/src/main/java/com/ots/common/utils/poi/WordUtil.java b/src/main/java/com/ots/common/utils/poi/WordUtil.java index 34a17cc..6de620f 100644 --- a/src/main/java/com/ots/common/utils/poi/WordUtil.java +++ b/src/main/java/com/ots/common/utils/poi/WordUtil.java @@ -1,5 +1,6 @@ package com.ots.common.utils.poi; import cn.hutool.core.collection.CollUtil; +import com.ots.common.enums.ReportTypeEnum; import com.ots.common.enums.ReportTypeNameEnum; import com.ots.common.enums.TemplateTypeEnum; import com.ots.common.utils.StringUtils; @@ -20,57 +21,36 @@ 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.Document; -import org.apache.poi.xwpf.usermodel.IBodyElement; -import org.apache.poi.xwpf.usermodel.IRunElement; -import org.apache.poi.xwpf.usermodel.XWPFChart; -import org.apache.poi.xwpf.usermodel.XWPFDocument; -import org.apache.poi.xwpf.usermodel.XWPFHeader; -import org.apache.poi.xwpf.usermodel.XWPFParagraph; -import org.apache.poi.xwpf.usermodel.XWPFRun; -import org.apache.poi.xwpf.usermodel.XWPFTable; -import org.apache.poi.xwpf.usermodel.XWPFTableCell; -import org.apache.poi.xwpf.usermodel.XWPFTableRow; +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.CTAxDataSource; -import org.openxmlformats.schemas.drawingml.x2006.chart.CTBarChart; -import org.openxmlformats.schemas.drawingml.x2006.chart.CTBarSer; -import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart; -import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource; -import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumVal; -import org.openxmlformats.schemas.drawingml.x2006.chart.CTPlotArea; -import org.openxmlformats.schemas.drawingml.x2006.chart.CTScatterChart; -import org.openxmlformats.schemas.drawingml.x2006.chart.CTScatterSer; +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.CTDrawing; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPPr; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR; 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.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; +import java.io.*; +import java.util.*; 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, @@ -256,7 +236,7 @@ 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); + run.addPicture(in, Document.PICTURE_TYPE_PNG, "TEST", width * emuSelf, height * emuSelf); in.close(); if (wordParam.isMove()) { @@ -314,7 +294,7 @@ XWPFTable table = tables.get(i); if (table.getRows().size() > 0) { - log.info("琛ㄦ牸鏁版嵁锛�"+ table.getText()); + log.info("琛ㄦ牸鏁版嵁锛�" + table.getText()); if (checkText(table.getText())) { List<XWPFTableRow> rows = table.getRows(); @@ -497,6 +477,7 @@ 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); } @@ -507,12 +488,24 @@ 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(oldRun.getColor()); - int fontSize = oldRun.getFontSize(); + insertRun.setColor(rgbStr); + String fontFamily = oldRun.getFontFamily(); + insertRun.setFontFamily(fontFamily); insertRun.setFontSize((fontSize == -1) ? DEFAULT_FONT_SIZE : fontSize); } pointer = position; @@ -522,6 +515,7 @@ 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; @@ -530,6 +524,71 @@ 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; } @@ -697,7 +756,7 @@ ShellTool.execLibreofficeCommand("pdf", EssConfig.getProfile() + "/" + reportName, EssConfig.getProfile() + "/"); zipFilePath = getPdfPath(reportName); - deleteFileStrList.add(EssConfig.getProfile() + "/" + reportName); + deleteFileStrList.add(EssConfig.getProfile() + "/" + reportName); } catch (Exception ex) { returnMessage = returnMessage + ex.getMessage(); deleteFileStrList.add(EssConfig.getProfile() + "/" + reportName); @@ -717,7 +776,7 @@ } 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")); + changTableColor(reportName, out, (List<JAQTableStyle>) textMap.get("JAQTableStyle")); } } private static String getTypeIfIsSAQ(TReportTemplate tReportTemplate, String reportType) { @@ -727,7 +786,7 @@ return reportType; } private static String getPdfPath(String reportName) { - return reportName.substring(0,reportName.lastIndexOf(".")) + ".pdf"; + return reportName.substring(0, reportName.lastIndexOf(".")) + ".pdf"; } public static void deleteFileByStr(List<String> deleteFileStrList) { @@ -772,12 +831,14 @@ } 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 { + 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); addTableValue(document, autoTableMap); @@ -785,6 +846,58 @@ 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) { + 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)) { @@ -825,12 +938,55 @@ if (StringUtils.equals(reportType, "MAQ")) { setMAQCompleteChars(textMap, charts); - } else if (StringUtils.equals(reportType, "RuiLin")){ + } else if (StringUtils.equals(reportType, ReportTypeEnum.MAQV2.getCode())) { + setMAQ_V2CompleteChars(textMap, charts); + } else if (StringUtils.equals(reportType, "RuiLin")) { setRuiLinChar(textMap, charts); } else { return; } } + private static void setMAQ_V2CompleteChars(Map<String, Object> textMap, List<XWPFChart> charts) { + String p_People32 = textMap.get("P_Task31").toString(); + String p_Task31 = 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_Task31); + val.getNumRef().getNumCache().getPtList().get(1).setV(p_People32); + } + } 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(); -- Gitblit v1.9.1