From 94c73409b82edbfeef2b2dc678526f09f9d28169 Mon Sep 17 00:00:00 2001
From: linzhijie <1003392067@qq.com>
Date: 星期日, 23 四月 2023 16:43:40 +0800
Subject: [PATCH] CIAQ图表替换

---
 src/main/java/com/ots/project/tool/report/CIAQ/chart/CIAQChart.java |  367 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 367 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/ots/project/tool/report/CIAQ/chart/CIAQChart.java b/src/main/java/com/ots/project/tool/report/CIAQ/chart/CIAQChart.java
new file mode 100644
index 0000000..0625a8e
--- /dev/null
+++ b/src/main/java/com/ots/project/tool/report/CIAQ/chart/CIAQChart.java
@@ -0,0 +1,367 @@
+package com.ots.project.tool.report.CIAQ.chart;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.ots.common.utils.StringUtils;
+import com.ots.project.tool.report.CIAQ.CIAQReport;
+import com.ots.project.tool.report.MAQ.base.RowData;
+import com.ots.project.tool.report.MAQ.base.SeriesData;
+import com.ots.project.tool.report.reportCalculation.response.ReportCIAQAPIResult;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.ooxml.POIXMLDocument;
+import org.apache.poi.ooxml.POIXMLDocumentPart;
+import org.apache.poi.ss.usermodel.CellType;
+import org.apache.poi.xssf.usermodel.XSSFCell;
+import org.apache.poi.xssf.usermodel.XSSFRow;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.apache.poi.xwpf.usermodel.XWPFChart;
+import org.apache.poi.xwpf.usermodel.XWPFDocument;
+import org.openxmlformats.schemas.drawingml.x2006.chart.*;
+
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @description: CIAQ鍥捐〃 鏁g偣鍥捐窡鏌卞舰鍥炬暟鎹彉鏇�
+ * @author: zhijie
+ * @create: 2023-04-23 16:31
+ **/
+@Slf4j
+public class CIAQChart {
+
+    private static Double PR_Dim01, PR_Dim02, PR_Dim03, PR_Dim04, PR_Dim05, PR_Dim06, PR_Dim07, PR_Dim08;
+
+    public static void main(String[] args) throws IOException {
+        String str = "{\"occ1L\":\"鍦拌川鍕樻帰宸ョ▼鎶�鏈汉鍛橈紙姣斿鍦拌川鐭夸骇璋冩煡宸ョ▼鎶�鏈汉鍛橈級\",\"occ3L\":\"鐭垮北宸ョ▼鎶�鏈汉鍛橈紙姣斿閫夌熆涓庣熆鐗╁姞宸ュ伐绋嬫妧鏈汉鍛橈級\",\"PR_Dim01\":\"56\",\"PR_Dim02\":\"78\",\"PR_Dim03\":\"40\",\"PR_Dim04\":\"67\",\"occ5H\":\"闊充箰鎸囨尌涓庢紨鍛橈紙姣斿鐢靛奖鐢佃婕斿憳銆佷箰鍣ㄦ紨濂忓憳锛塡",\"occ9L\":\"淇℃伅閫氫俊缃戠粶杩愯绠$悊浜哄憳锛堟瘮濡備俊鎭�氫俊缃戠粶杩愯绠$悊鍛橈級\",\"occ7H\":\"宸ヨ壓缇庢湳涓庡垱鎰忚璁′笓涓氫汉鍛橈紙姣斿鏈嶈璁捐浜哄憳銆佺幆澧冭璁′汉鍛橈級\",\"occ1H\":\"缁垮寲涓庡洯鑹烘湇鍔′汉鍛橈紙姣斿鐩嗘櫙甯堛�佹彃鑺辫姳鑹哄笀锛塡",\"occ5L\":\"鏈烘宸ョ▼鎶�鏈汉鍛橈紙姣斿鏈烘璁捐宸ョ▼鎶�鏈汉鍛樸�佽嚜鍔ㄦ帶鍒跺伐绋嬫妧鏈汉鍛橈級\",\"occ3H\":\"鏂囧銆佽壓鏈鐮旂┒浜哄憳\",\"occ7L\":\"宸ヤ笟鏈哄櫒浜烘搷浣滆繍缁翠汉鍛橈紙姣斿宸ヤ笟鏈哄櫒浜虹郴缁熻繍缁村憳銆侊級\",\"occ10H\":\"閰掔被楗搧璋冨埗甯堬紙姣斿閰块厭甯堛�侀厭浣撹璁″笀锛塡",\"occ10L\":\"鍦拌川鍕樻煡浜哄憳锛堟瘮濡傜墿鎺㈠伐銆佸湴璐ㄨ皟鏌ュ憳锛塡",\"occ8H\":\" 闄剁摲鍒跺搧鍒堕�犱汉鍛橈紙姣斿闄剁摲瑁呴グ宸ャ�佸彜寤虹悏鐠冨伐锛塡",\"PR_Dim05\":\"89\",\"PR_Dim06\":\"12\",\"PR_Dim07\":\"57\",\"PR_Dim08\":\"33\",\"occ2L\":\"娴嬬粯鍜屽湴鐞嗕俊鎭伐绋嬫妧鏈汉鍛橈紙姣斿宸ョ▼娴嬮噺宸ョ▼鎶�鏈汉鍛橈級\",\"occ4H\":\"鏂囪壓鍒涗綔涓庣紪瀵间汉鍛橈紙姣斿鏂囧浣滃銆佽垶韫堢紪瀵硷級\",\"occ8L\":\"鐢靛瓙宸ョ▼鎶�鏈汉鍛橈紙姣斿鐢靛瓙鏉愭枡/鐢靛瓙鍏冨櫒浠跺伐绋嬫妧鏈汉鍛橈級\",\"occ6H\":\"缇庢湳涓撲笟浜哄憳锛堟瘮濡傜敾瀹躲�侀洉濉戝锛塡",\"occ4L\":\"鍐堕噾宸ョ▼鎶�鏈汉鍛橈紙姣斿鍐堕噾鐑兘宸ョ▼鎶�鏈汉鍛樸�佺█鍦熷伐绋嬫妧鏈汉鍛橈級\",\"occ2H\":\"鑸炲彴涓撲笟浜哄憳锛堟瘮濡傜伅鍏夊笀銆佸寲濡嗗笀锛塡",\"occ6L\":\"鑸┖宸ョ▼鎶�鏈汉鍛橈紙姣斿椋炶鍣ㄥ埗閫犲伐绋嬫妧鏈汉鍛橈級\",\"condition\":\"1\",\"occ9H\":\"鎽勫奖鎵╁嵃鏈嶅姟浜哄憳锛堟瘮濡傚晢涓氭憚褰卞笀锛塡"}";
+        Map<String ,Object> textMap = JSON.parseObject(str, HashMap.class);
+        try (OutputStream os = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\CIAQ1.docx");XWPFDocument document = new XWPFDocument(POIXMLDocument.openPackage("C:\\Users\\Administrator\\Desktop\\CIAQ.docx"))){
+            changeChart(document,textMap);
+            document.write(os);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 鏇挎崲CIAQ鍥捐〃鏁版嵁
+     * @param document 鏂囨。瀵硅薄
+     * @param textMap 鎶ュ憡瀛楀吀閿�煎
+     * @return
+     */
+    public static boolean changeChart(XWPFDocument document, Map<String, Object> textMap){
+        List<SeriesData> seriesDatas = initData(textMap);
+        if(seriesDatas == null){
+            log.error("鏇挎崲CIAQ鍥捐〃鏁版嵁,鍒濆鍖栨暟鎹け璐�!");
+            return false;
+        }
+        //CIAQ鍥捐〃鏁版嵁
+        changeCIAQChart(document,seriesDatas);
+        return true;
+    }
+
+    /**
+     * 鍒ゆ柇鏄惁涓虹┖
+     * @param value
+     * @return
+     */
+    public static boolean checkParamsIsNull(Double... value) {
+        for (int i = 0; i < value.length; i++) {
+            if (Objects.isNull(value[i])) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 鍒濆鍖栨姤鍛婃暟鎹�
+     * @param textMap
+     * @return
+     */
+    public static List<SeriesData> initData(Map<String, Object> textMap){
+        //鑾峰彇鍛戒腑鏁板��
+        PR_Dim01 = Double.valueOf((String) textMap.get("PR_Dim01"));
+        PR_Dim02 = Double.valueOf((String) textMap.get("PR_Dim02"));
+        PR_Dim03 = Double.valueOf((String) textMap.get("PR_Dim03"));
+        PR_Dim04 = Double.valueOf((String) textMap.get("PR_Dim04"));
+        PR_Dim05 = Double.valueOf((String) textMap.get("PR_Dim05"));
+        PR_Dim06 = Double.valueOf((String) textMap.get("PR_Dim06"));
+        PR_Dim07 = Double.valueOf((String) textMap.get("PR_Dim07"));
+        PR_Dim08 = Double.valueOf((String) textMap.get("PR_Dim08"));
+
+        //鍒ゆ柇鏄惁涓虹┖
+        if (checkParamsIsNull(PR_Dim01, PR_Dim02, PR_Dim03, PR_Dim04, PR_Dim05, PR_Dim06, PR_Dim07, PR_Dim08)) {
+            return null;
+        }
+
+        // 娴嬭瘯鏁版嵁
+        List<SeriesData> seriesDatas = Arrays.asList(
+                new SeriesData(" ", Arrays.asList(
+                        new RowData(" ", 0,"鍋ュ悍绉戝"),
+                        new RowData(" ", 0,"鍒涢�犳�ц〃杈�"),
+                        new RowData(" ", 0,"绉戞妧"),
+                        new RowData(" ", 0,"浜�"),
+                        new RowData(" ", 0,"缁勭粐"),
+                        new RowData(" ", 0,"褰卞搷"),
+                        new RowData(" ", 0,"鑷劧"),
+                        new RowData(" ", 0,"浜嬬墿")
+                )),
+                new SeriesData("浠峰�艰鍒嗘暟", Arrays.asList(
+                        new RowData("浠峰�艰鍒嗘暟", PR_Dim01),
+                        new RowData("浠峰�艰鍒嗘暟", PR_Dim02),
+                        new RowData("浠峰�艰鍒嗘暟", PR_Dim03),
+                        new RowData("浠峰�艰鍒嗘暟", PR_Dim04),
+                        new RowData("浠峰�艰鍒嗘暟", PR_Dim05),
+                        new RowData("浠峰�艰鍒嗘暟", PR_Dim06),
+                        new RowData("浠峰�艰鍒嗘暟", PR_Dim07),
+                        new RowData("浠峰�艰鍒嗘暟", PR_Dim08)
+                ))
+        );
+        return seriesDatas;
+    }
+
+    /**
+     * 鏇挎崲word鍥捐〃 闆疯揪鍥惧甫鏍囪鍥捐〃
+     * @param doc
+     * @param seriesDatas
+     */
+    public static void changeCIAQChart(XWPFDocument doc,List<SeriesData> seriesDatas) {
+        try {
+            //鍔ㄦ�佸埛鏂板浘琛�
+            List<POIXMLDocumentPart> relations = doc.getRelations();
+            for (POIXMLDocumentPart part : relations) {
+                if (part instanceof XWPFChart) {
+                    // 鍥捐〃鍏冪礌
+                    XWPFChart chart = (XWPFChart) part;
+
+                    // 鏌ョ湅閲岄潰鐨勫浘琛ㄦ暟鎹紝鎵嶈兘鐭ラ亾鏄粈涔堝浘琛�
+                    CTPlotArea plot = chart.getCTChart().getPlotArea();
+                    // excel鍐呯疆琛ㄦ牸
+                    XSSFWorkbook workbook = chart.getWorkbook();
+                    XSSFSheet sheet = workbook.getSheetAt(0);
+
+                    // 鏌ョ湅鍥捐〃绫诲瀷
+                    // getChartType(part);
+                    // 閬嶅巻鏁版嵁
+                    //printData(sheet);
+
+                    // 闆疯揪鍥�
+                    if (!plot.getRadarChartList().isEmpty()) {
+                        CTRadarChart radarChart = plot.getRadarChartArray(0);
+                        //鍒锋柊鍐呯疆excel鏁版嵁
+                        refreshExcel(seriesDatas, workbook, sheet);
+                        workbook.write(chart.getPackagePart().getOutputStream());
+
+                        //闆疯揪鍥炬暟鎹簮 鏁g偣鍧愭爣
+                        for (CTRadarSer ser : radarChart.getSerList()) {
+                            //鏇存柊闆疯揪鍥剧紦瀛�
+                            updateRadarChart(seriesDatas, ser.getCat(),ser.getVal());
+                        }
+                    }
+                }
+            }
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("CIAQGS鏇挎崲word鍥捐〃 鏁g偣鍥捐窡鏌卞舰鍥剧粍鍚堝浘褰㈠け璐ワ細{}",e);
+        }
+    }
+
+    private static void printData(XSSFSheet sheet){
+        //鍏堣閬嶅巻琛�
+        for(int rowNum=0;rowNum<=sheet.getLastRowNum();rowNum++) {
+            XSSFRow hssRow = sheet.getRow(rowNum);
+            if (hssRow == null) {
+                continue;
+            }
+            for (int cellNum = 0; cellNum <= hssRow.getLastCellNum(); cellNum++) {
+                XSSFCell hssfCell = hssRow.getCell(cellNum);
+                if (hssfCell == null) {
+                    continue;
+                }
+                System.out.print("--" + getValue(hssfCell));
+            }
+            System.out.println();
+        }
+    }
+
+    private static String getValue(XSSFCell hssfCell){
+        if(hssfCell.getCellType()== CellType.BOOLEAN){
+            return String.valueOf(hssfCell.getBooleanCellValue());
+        }else if(hssfCell.getCellType()==CellType.NUMERIC){
+            return String.valueOf(hssfCell.getNumericCellValue());
+        }else{
+            return String.valueOf(hssfCell.getStringCellValue());
+        }
+    }
+
+    /**
+     * 鏇存柊鍥捐〃鐨勫叧鑱� excel
+     *
+     * @param seriesDatas
+     * @param workbook
+     * @param sheet
+     */
+    protected static void refreshExcel(List<SeriesData> seriesDatas, XSSFWorkbook workbook, XSSFSheet sheet) {
+        XSSFRow title = sheet.getRow(0);
+        //閬嶅巻鏁版嵁鏁扮粍杩涜excel璧嬪��
+        for (int i = 0; i < seriesDatas.size(); i++) {
+            SeriesData data = seriesDatas.get(i);
+            if (data.name != null && !data.name.isEmpty()) {
+                // 绗竴琛屾爣棰�
+                XSSFCell cell = title.getCell(i);
+                if (cell == null) {
+                    cell = title.createCell(i + 1);
+                }
+                cell.setCellValue(data.name);
+            }
+            int size = data.value.size();
+            //閬嶅巻鏁版嵁杩涜璧嬪��
+            for (int j = 0; j < size; j++) {
+                //浠庣浜岃寮�濮嬭祴鍊�
+                XSSFRow row = sheet.getRow(j + 1);
+                if (row == null) {
+                    row = sheet.createRow(j + 1);
+                }
+                RowData cellValu = data.value.get(j);
+
+                //绗竴鍒楀紑濮嬭祴鍊�
+                XSSFCell cell = row.getCell(i);
+                if (cell == null) {
+                    cell = row.createCell(i);
+                }
+                //浼樺厛浣跨敤瀛楃涓插�� CIAQ绗竴鍒楁槸涓枃
+                if(StringUtils.isNotEmpty(cellValu.valueStr)){
+                    cell.setCellValue(cellValu.valueStr);
+                }else{
+                    cell.setCellValue(cellValu.value);
+                }
+            }
+            //鍒犻櫎澶氫綑琛屾暟
+            int lastRowNum = sheet.getLastRowNum();
+            if (lastRowNum > size) {
+                for (int idx = lastRowNum; idx > size; idx--) {
+                    sheet.removeRow(sheet.getRow(idx));
+                }
+            }
+        }
+    }
+
+
+    /**
+     * 鏇存柊 闆疯揪鍥� 缂撳瓨鏁版嵁
+     *
+     * @param seriesDatas 鏁版嵁
+     * @param xDataSource X鍧愭爣鏁版嵁缂撳瓨
+     * @param yDataSource Y鍧愭爣鏁版嵁缂撳瓨
+     */
+    protected static void updateRadarChart(List<SeriesData> seriesDatas, CTAxDataSource xDataSource,
+                                             CTNumDataSource yDataSource) {
+
+        //鑾峰彇xy鍧愭爣鏁版嵁鏉℃暟
+        long xStrCnt = xDataSource.getStrRef().getStrCache().getPtCount().getVal();
+        long yNumCnt = yDataSource.getNumRef().getNumCache().getPtCount().getVal();
+
+        //鑾峰彇XY鏈�鏂版暟鎹�
+        List<RowData> xRowDatas = seriesDatas.get(0).getValue();
+        int xRowDataSize = xRowDatas.size();
+        List<RowData> yRowDatas = seriesDatas.get(1).getValue();
+        int yRowDataSize = yRowDatas.size();
+
+        //鏇存柊X鍧愭爣缂撳瓨
+        for (int i = 0; i < xRowDatas.size(); i++) {
+            RowData cellValu = xRowDatas.get(i);
+            CTStrVal val = xStrCnt > i ? xDataSource.getStrRef().getStrCache().getPtArray(i)
+                    : xDataSource.getStrRef().getStrCache().addNewPt();
+            val.setIdx(i);
+            val.setV(cellValu.valueStr);
+        }
+
+        //鏇存柊Y鍧愭爣缂撳瓨
+        for (int i = 0; i < yRowDatas.size(); i++) {
+            RowData cellValu = yRowDatas.get(i);
+            CTNumVal val = yNumCnt > i ? yDataSource.getNumRef().getNumCache().getPtArray(i)
+                    : yDataSource.getNumRef().getNumCache().addNewPt();
+            val.setIdx(i);
+            val.setV(String.format("%.0f", cellValu.value));
+        }
+
+        // 鏇存柊瀵瑰簲excel鐨勮寖鍥�
+        xDataSource.getStrRef().setF(
+                replaceRowEnd(xDataSource.getStrRef().getF(),
+                        xStrCnt,
+                        xRowDataSize));
+        yDataSource.getNumRef().setF(
+                replaceRowEnd(yDataSource.getNumRef().getF(),
+                        yNumCnt,
+                        yRowDataSize));
+
+        // 鍒犻櫎澶氱殑
+        if (xStrCnt > xRowDataSize) {
+            for (int idx = xRowDataSize; idx < xStrCnt; idx++) {
+                xDataSource.getStrRef().getStrCache().removePt(xRowDataSize);
+            }
+        }
+        if (yNumCnt > yRowDataSize) {
+            for (int idx = yRowDataSize; idx < yNumCnt; idx++) {
+                yDataSource.getNumRef().getNumCache().removePt(yRowDataSize);
+            }
+        }
+        // 鏇存柊涓暟
+        xDataSource.getStrRef().getStrCache().getPtCount().setVal(xRowDataSize);
+        // 鏇存柊涓暟
+        yDataSource.getNumRef().getNumCache().getPtCount().setVal(yRowDataSize);
+    }
+
+    /**
+     * 鏇挎崲 褰㈠锛� Sheet1!$A$2:$A$4 鐨勫瓧绗�
+     *
+     * @param range
+     * @return
+     */
+    public static String replaceRowEnd(String range, long oldSize, long newSize) {
+        Pattern pattern = Pattern.compile("(:\\$[A-Z]+\\$)(\\d+)");
+        Matcher matcher = pattern.matcher(range);
+        if (matcher.find()) {
+            long old = Long.parseLong(matcher.group(2));
+            return range.replaceAll("(:\\$[A-Z]+\\$)(\\d+)", "$1" + Long.toString(old - oldSize + newSize));
+        }
+        return range;
+    }
+
+    /**
+     * 鑾峰彇鍥捐〃鏈夊摢浜涚被鍨�
+     * @param part
+     */
+    public static void getChartType(POIXMLDocumentPart part){
+        XWPFChart chart = (XWPFChart) part;
+        //鏍规嵁灞炴�х涓�鍒楀悕绉板垏鎹㈡暟鎹被鍨�
+        CTChart ctChart = chart.getCTChart();
+        CTPlotArea plotArea = ctChart.getPlotArea();
+
+        if (!plotArea.getBarChartList().isEmpty()) {
+            System.out.println("鏌辩姸鍥緖"+plotArea.getBarChartList().size()+"}");
+        }
+        if (!plotArea.getPieChartList().isEmpty()) {
+            System.out.println("楗煎浘{"+plotArea.getPieChartList().size()+"}");
+        }
+        if (!plotArea.getLineChartList().isEmpty()) {
+            System.out.println("绾垮舰鍥緖"+plotArea.getLineChartList().size()+"}");
+        }
+        if (!plotArea.getBar3DChartList().isEmpty()) {
+            System.out.println("鏌辩姸鍥�3D{"+plotArea.getBar3DChartList().size()+"}");
+        }
+        if (!plotArea.getScatterChartList().isEmpty()) {
+            System.out.println("鏁g偣鍥緖"+plotArea.getScatterChartList().size()+"}");
+        }
+        if (!plotArea.getRadarChartList().isEmpty()) {
+            System.out.println("闆疯揪鍥緖"+plotArea.getRadarChartList().size()+"}");
+        }
+    }
+
+}

--
Gitblit v1.9.1