From 10b6c791f1a137ac97cce6844482649fc859309b Mon Sep 17 00:00:00 2001
From: 吴祝攀 <2040239371@qq.com>
Date: 星期三, 26 六月 2024 16:25:33 +0800
Subject: [PATCH] 1.LAQ全景图 2.获取地址优化

---
 src/main/java/com/ots/project/tool/report/LAQ/LAQTemplate.java       |    6 
 src/main/java/com/ots/common/utils/AddressUtils.java                 |   47 +
 src/main/java/com/ots/project/tool/report/LAQ/chart/LAQAllChart.java |  515 ++++++++++++++++++++
 src/main/java/com/ots/project/tool/report/LAQ/chart/LAQTest.java     |  864 +++++++++++++++++++++++++++++-----
 src/main/java/com/ots/common/utils/poi/WordUtil.java                 |   13 
 src/main/java/com/ots/common/enums/ReportTypeNameEnum.java           |   13 
 src/main/java/com/ots/common/enums/TemplateTypeEnum.java             |   15 
 src/main/java/com/ots/project/tool/report/LAQ/chart/LAQChart.java    |    2 
 8 files changed, 1,326 insertions(+), 149 deletions(-)

diff --git a/src/main/java/com/ots/common/enums/ReportTypeNameEnum.java b/src/main/java/com/ots/common/enums/ReportTypeNameEnum.java
index 0ae1852..cc85abb 100644
--- a/src/main/java/com/ots/common/enums/ReportTypeNameEnum.java
+++ b/src/main/java/com/ots/common/enums/ReportTypeNameEnum.java
@@ -6,10 +6,15 @@
 */
 @Getter
 public enum ReportTypeNameEnum {
-    Brief("GS", "绠�鏄撶増"), Complete("IA", "璇︾粏鐗�"),
-    SAQ("IA", "SAQ鎶ュ憡"), RuiLin("GS", "鐫块偦鎶ュ憡"),
-    CAQ("GS", "CAQ鎶ュ憡"), Chinese("CN","涓枃鎶ュ憡"),
-    English("EN","鑻辨枃鎶ュ憡"), Thai("TH", "娉版枃鎶ュ憡"),
+    Brief("GS", "绠�鏄撶増"),
+    Complete("IA", "璇︾粏鐗�"),
+    SAQ("IA", "SAQ鎶ュ憡"),
+    RuiLin("GS", "鐫块偦鎶ュ憡"),
+    CAQ("GS", "CAQ鎶ュ憡"),
+    Chinese("CN","涓枃鎶ュ憡"),
+    English("EN","鑻辨枃鎶ュ憡"),
+    Thai("TH", "娉版枃鎶ュ憡"),
+    Panorama("Panorama","LAQ鍏ㄦ櫙鍥炬姤鍛�"),
     JAQ("GS","JAQ鎶ュ憡");
     private final String code;
     private final String message;
diff --git a/src/main/java/com/ots/common/enums/TemplateTypeEnum.java b/src/main/java/com/ots/common/enums/TemplateTypeEnum.java
index 0d2e852..afa7b7b 100644
--- a/src/main/java/com/ots/common/enums/TemplateTypeEnum.java
+++ b/src/main/java/com/ots/common/enums/TemplateTypeEnum.java
@@ -1,16 +1,27 @@
 package com.ots.common.enums;
+
 import lombok.Getter;
+
 import java.util.Objects;
+
 @Getter
 public enum TemplateTypeEnum {
-    Brief("Brief", "绠�鏄撶増"), Complete("Complete", "瀹屾暣鐗�"), SAQ("SAQ", "SAQ鎶ュ憡"), RuiLin("RuiLin", "鐫块偦鎶ュ憡"), CAQ("CAQ", "CAQ鎶ュ憡"),
-    JAQ("JAQ","JAQ鎶ュ憡"),MAQ("MAQ", "MAQ鎶ュ憡");
+    Brief("Brief", "绠�鏄撶増"),
+    Complete("Complete", "瀹屾暣鐗�"),
+    SAQ("SAQ", "SAQ鎶ュ憡"),
+    RuiLin("RuiLin", "鐫块偦鎶ュ憡"),
+    CAQ("CAQ", "CAQ鎶ュ憡"),
+    Panorama("Panorama","LAQ鍏ㄦ櫙鍥炬姤鍛�"),
+    JAQ("JAQ", "JAQ鎶ュ憡"),
+    MAQ("MAQ", "MAQ鎶ュ憡");
     private final String code;
     private final String message;
+
     TemplateTypeEnum(String code, String message) {
         this.code = code;
         this.message = message;
     }
+
     public static TemplateTypeEnum codeOf(String code) {
         for (TemplateTypeEnum xxxEnum : values()) {
             if (Objects.equals(xxxEnum.getCode(), code)) {
diff --git a/src/main/java/com/ots/common/utils/AddressUtils.java b/src/main/java/com/ots/common/utils/AddressUtils.java
index 9ab5339..9fd4829 100644
--- a/src/main/java/com/ots/common/utils/AddressUtils.java
+++ b/src/main/java/com/ots/common/utils/AddressUtils.java
@@ -7,25 +7,50 @@
 
 public class AddressUtils {
     private static final Logger log = LoggerFactory.getLogger(AddressUtils.class);
-    public static final String IP_URL = "http://ip.taobao.com/service/getIpInfo.php";
+    //https://ip.rss.ink/v1/qqwry?ip=211.147.242.161
+    public static final String IP_URL = "https://ip.rss.ink/v1/qqwry";
     public static String getRealAddressByIP(String ip) {
         String address = "XX XX";
         
         if (IpUtils.internalIp(ip)) {
             return "鍐呯綉IP";
         }
-        if (EssConfig.isAddressEnabled()) {
-            String rspStr = HttpUtils.sendPost(IP_URL, "ip=" + ip);
-            if (StringUtils.isEmpty(rspStr)) {
-                log.error("鑾峰彇鍦扮悊浣嶇疆寮傚父 {}", ip);
-                return address;
+//        if (EssConfig.isAddressEnabled()) {
+//            String rspStr = HttpUtils.sendPost(IP_URL, "ip=" + ip);
+//            if (StringUtils.isEmpty(rspStr)) {
+//                log.error("鑾峰彇鍦扮悊浣嶇疆寮傚父 {}", ip);
+//                return address;
+//            }
+//            JSONObject obj = JSONObject.parseObject(rspStr);
+//            JSONObject data = obj.getObject("data", JSONObject.class);
+//            String region = data.getString("region");
+//            String city = data.getString("city");
+//            address = region + " " + city;
+//        }
+
+        if(EssConfig.isAddressEnabled())
+        {
+            try {
+                String rspStr = HttpUtils.sendGet(IP_URL,"ip=" + ip);
+                if (StringUtils.isEmpty(rspStr)) {
+                    log.error("鑾峰彇鍦扮悊浣嶇疆寮傚父 {}", ip);
+                    return address;
+                }
+                JSONObject obj = JSONObject.parseObject(rspStr);
+                JSONObject data = obj.getObject("data", JSONObject.class);
+                String province = data.getString("province");
+                String city = data.getString("city");
+                String area = data.getString("area");
+                address = province + " " + city+"("+area+")";
+                log.info("ip锛�"+ip+",鍦扮悊浣嶇疆锛�"+address);
             }
-            JSONObject obj = JSONObject.parseObject(rspStr);
-            JSONObject data = obj.getObject("data", JSONObject.class);
-            String region = data.getString("region");
-            String city = data.getString("city");
-            address = region + " " + city;
+            catch (Exception ex)
+            {
+                log.error("鑾峰彇ip鍦板潃鍦扮悊浣嶇疆寮傚父锛�"+ex.getMessage());
+            }
         }
+
+
         return address;
     }
 }
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 785a6ea..e0c6e8c 100644
--- a/src/main/java/com/ots/common/utils/poi/WordUtil.java
+++ b/src/main/java/com/ots/common/utils/poi/WordUtil.java
@@ -22,6 +22,7 @@
 import com.ots.project.tool.report.APIFan.chart.APIFanChart;
 import com.ots.project.tool.report.CIAQ.chart.CIAQChart;
 import com.ots.project.tool.report.JAQ.condition.JAQTeam;
+import com.ots.project.tool.report.LAQ.chart.LAQAllChart;
 import com.ots.project.tool.report.LAQ.chart.LAQChart;
 import com.ots.project.tool.report.MAQTR.chart.MAQTRChart;
 import com.ots.project.tool.report.PAQ.chart.PAQChart;
@@ -1563,7 +1564,17 @@
             } else if (StringUtils.equals(reportType, ReportTypeEnum.CIAQ.getCode())) {
                 CIAQChart.changeChart(document, textMap);
             } else if (StringUtils.equals(reportType, ReportTypeEnum.LAQ.getCode())) {
-                LAQChart.changeChart(document, textMap);
+                if(!textMap.containsKey("allList"))
+                {
+                    System.out.println("涓汉鐢ㄦ埛鎶ュ憡");
+                    LAQChart.changeChart(document, textMap);
+                }
+                else
+                {
+                    System.out.println("鍏ㄦ櫙鍥炬姤鍛�");
+                    //濡傛灉鍖呭惈allList锛屽垯娓叉煋鍏ㄦ櫙鍥惧浘琛�
+                    LAQAllChart.changeChart(document,textMap);
+                }
             } else if(StringUtils.equals(reportType, ReportTypeEnum.API_Fan.getCode()))
             {
                 APIFanChart.changeChart(document,textMap);
diff --git a/src/main/java/com/ots/project/tool/report/LAQ/LAQTemplate.java b/src/main/java/com/ots/project/tool/report/LAQ/LAQTemplate.java
index 3f8544e..811237c 100644
--- a/src/main/java/com/ots/project/tool/report/LAQ/LAQTemplate.java
+++ b/src/main/java/com/ots/project/tool/report/LAQ/LAQTemplate.java
@@ -60,4 +60,10 @@
 
     @Excel(name = "Perfomance")
     private BigDecimal perfomance;
+
+    /**
+     * 鎵�鍦ㄤ節瀹牸鐨勭洅瀛愪綅缃��1~9
+     */
+    @Excel(name = "Box")
+    private Integer box;
 }
\ No newline at end of file
diff --git a/src/main/java/com/ots/project/tool/report/LAQ/chart/LAQAllChart.java b/src/main/java/com/ots/project/tool/report/LAQ/chart/LAQAllChart.java
new file mode 100644
index 0000000..fea779f
--- /dev/null
+++ b/src/main/java/com/ots/project/tool/report/LAQ/chart/LAQAllChart.java
@@ -0,0 +1,515 @@
+package com.ots.project.tool.report.LAQ.chart;
+
+import com.ots.common.utils.StringUtils;
+import com.ots.common.utils.poi.ExcelUtil;
+import com.ots.project.tool.report.LAQ.LAQTemplate;
+import com.ots.project.tool.report.MAQ.base.RowData;
+import com.ots.project.tool.report.MAQ.base.SeriesData;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.ooxml.POIXMLDocument;
+import org.apache.poi.ooxml.POIXMLDocumentPart;
+import org.apache.poi.openxml4j.util.ZipSecureFile;
+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.*;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * 鍏ㄦ櫙鍥惧浘琛ㄦ覆鏌�
+ */
+@Slf4j
+public class LAQAllChart {
+
+    /**
+     * 娴嬭瘯妯℃澘
+     * @param args
+     * @throws Exception
+     */
+    public static void main(String[] args) throws Exception {
+        System.out.println("鍚姩娴嬭瘯..");
+        String dataPath = "D:\\妗岄潰鏂囦欢\\LAQ鍏ㄦ櫙鍥炬姤鍛奬\LAQ瀵煎叆娴嬭瘯鏁版嵁.xlsx";
+        // 鑾峰彇瀵煎叆鏁版嵁
+        File file = new File(dataPath);
+        InputStream in = new FileInputStream(file);
+        ExcelUtil<LAQTemplate> util = new ExcelUtil<>(LAQTemplate.class);
+        List<LAQTemplate> laqTemplateList = util.importExcel(in);
+
+
+        ZipSecureFile.setMinInflateRatio(0.001);
+        try (OutputStream os = new FileOutputStream("D:\\妗岄潰鏂囦欢\\鍙垹闄\LAQ鑻辨枃鎶ュ憡"+UUID.randomUUID().toString()+".docx");
+             XWPFDocument document = new XWPFDocument(POIXMLDocument.openPackage("D:\\妗岄潰鏂囦欢\\LAQ鑻辨枃鎶ュ憡-鍙犲姞鐗堟湰.docx"))) {
+
+            Map<String, Object> textMap = new HashMap<>();
+            textMap.put("allList",laqTemplateList);
+            changeChart(document,textMap);
+            document.write(os);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+
+        System.out.println("澶勭悊瀹屾垚...");
+    }
+
+
+    /**
+     * 鏇挎崲LAQ鍥捐〃鏁版嵁
+     * @param document 鏂囨。瀵硅薄
+     * @param textMap 鏁版嵁婧�
+     */
+    public static void changeChart(XWPFDocument document, Map<String, Object> textMap) {
+//        Map<Integer, List<SeriesData>> seriesDatas = initData(textMap);
+//        changeChart(document,seriesDatas,textMap);
+        System.out.println("杩涘叆鍏ㄦ櫙鍥炬覆鏌撴ā寮�");
+        try{
+            List<LAQTemplate> laqTemplateList = (List<LAQTemplate>)textMap.get("allList");
+            changeChartNew(document,laqTemplateList);
+            System.out.println("鍏ㄦ櫙鍥炬覆鏌撳畬鎴�");
+        }
+        catch (Exception ex)
+        {
+            log.error("LAQ鍏ㄦ櫙鍥惧紓甯革細"+ex.getMessage());
+        }
+
+    }
+
+
+    public static void changeChartNew(XWPFDocument document,List<LAQTemplate> list) {
+        if(list.size()<=0){
+            return;
+        }
+        try {
+            //鑾峰彇鏁版嵁
+            Map<Integer,List<SeriesData>> seriesDataMapTop = getSeriesDataByType(list,1);
+            Map<Integer,List<SeriesData>> seriesDataMapMiddle = getSeriesDataByType(list,2);
+            Map<Integer,List<SeriesData>> seriesDataMapBottom = getSeriesDataByType(list,3);
+
+            //鑾峰彇鏍囩
+            Map<Integer,String> seriesDataLablesTop = getSeriesDataLablesByType(list,1);
+            Map<Integer,String> seriesDataLablesMiddle = getSeriesDataLablesByType(list,2);
+            Map<Integer,String> seriesDataLablesBottom = getSeriesDataLablesByType(list,3);
+
+            List<POIXMLDocumentPart> relations = document.getRelations();
+            int barIndex = 1;
+
+            //涓変釜鍥捐〃鐨勪釜鏁�
+            int topIndex =1;
+            int middleIndex =1;
+            int bottomIndex =1;
+
+            for (POIXMLDocumentPart part : relations) {
+                if (part instanceof XWPFChart) {
+                    // 鍥捐〃鍏冪礌
+                    XWPFChart chart = (XWPFChart) part;
+                    // 鏌ョ湅閲岄潰鐨勫浘琛ㄦ暟鎹紝鎵嶈兘鐭ラ亾鏄粈涔堝浘琛�
+                    CTPlotArea plot = chart.getCTChart().getPlotArea();
+                    getChartType(chart);
+                    // excel鍐呯疆琛ㄦ牸
+                    XSSFWorkbook workbook = chart.getWorkbook();
+                    XSSFSheet sheet = workbook.getSheetAt(0);
+
+                    //鏁g偣鍥�
+                    if (!plot.getScatterChartList().isEmpty()) {
+                        CTScatterChart scatterChart = plot.getScatterChartArray(0);
+                        //绗竴涓暎鐐瑰浘1-90锛岀浜屼釜91-180锛岀涓変釜181-270
+                        System.out.println("绗�"+barIndex+"涓暎鐐瑰浘");
+
+                        String lables = "";//鏁g偣鍥剧殑鏄剧ず鏍囩
+                        List<SeriesData> seriesDatas = new ArrayList<>();
+
+                        // 鑾峰彇鍥捐〃鐨勫�艰酱,骞舵妸鏈�灏忓�艰缃负-0锛�
+                        // chart.getAxes().get(1) 鑾峰彇鐨勭旱鍧愭爣锛宑hart.getAxes().get(0) 鑾峰彇鐨勬槸妯潗鏍�
+                        chart.getAxes().get(1).setMinimum(0);
+                        Double maximum = chart.getAxes().get(0).getMaximum();
+
+                        Double minimum = chart.getAxes().get(0).getMinimum();
+//                        System.out.println("X杞存渶灏忓�兼槸锛�"+minimum+",鏈�澶у�兼槸锛�"+maximum);
+
+                        //鍒ゆ柇鍥捐〃鎵�鍦ㄤ綅缃�
+                        if(minimum>=67)
+                        {
+                            seriesDatas = seriesDataMapTop.get(topIndex);
+                            lables = seriesDataLablesTop.get(topIndex);
+                            topIndex++;
+//                            System.out.println("绗竴椤靛浘琛ㄤ釜鏁帮細"+topIndex+"锛屾爣绛撅細"+lables+";"+"X杞存渶灏忓�兼槸锛�"+minimum+",鏈�澶у�兼槸锛�"+maximum);
+                        }
+                        else if(minimum>=33)
+                        {
+                            seriesDatas = seriesDataMapMiddle.get(middleIndex);
+                            lables = seriesDataLablesMiddle.get(middleIndex);
+//                            System.out.println("绗簩椤靛浘琛ㄤ釜鏁帮細"+middleIndex);
+
+                            middleIndex++;
+                        }
+                        else
+                        {
+                            seriesDatas = seriesDataMapBottom.get(bottomIndex);
+                            lables = seriesDataLablesBottom.get(bottomIndex);
+                            bottomIndex++;
+//                            System.out.println("绗笁椤靛浘琛ㄤ釜鏁帮細"+bottomIndex);
+                        }
+
+
+                        barIndex++;
+
+
+                        if(seriesDatas==null)
+                        {
+                            for (CTScatterSer ser : scatterChart.getSerList()) {
+                                ser.getTx().getStrRef().getStrCache().getPtArray(0).setV("");
+                            }
+                            continue;
+                        }
+
+                        //鍒锋柊鍐呯疆excel鏁版嵁
+                        refreshExcel(seriesDatas, sheet);
+                        workbook.write(chart.getPackagePart().getOutputStream());
+                        int i = 0;
+                        for (CTScatterSer ser : scatterChart.getSerList()) {
+                            //鏇存柊鏁g偣鍥剧紦瀛�
+                            updateScatterChart(seriesDatas, ser.getXVal(), ser.getYVal());
+                            ser.getTx().getStrRef().getStrCache().getPtArray(0).setV(lables);
+                            ++i;
+                        }
+
+                    }
+
+
+
+                }
+            }
+
+
+            System.out.println("绗竴椤靛浘琛ㄤ釜鏁帮細"+(topIndex-1));
+            System.out.println("绗簩椤靛浘琛ㄤ釜鏁帮細"+(middleIndex-1));
+            System.out.println("绗笁椤靛浘琛ㄤ釜鏁帮細"+(bottomIndex-1));
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("LAQ.鏇挎崲word鍥捐〃 鏁g偣鍥惧浘褰㈠け璐ワ細{}",e);
+        }
+    }
+
+    /**
+     * 鏇存柊 鏁g偣鍥� 缂撳瓨鏁版嵁
+     *
+     * @param seriesDatas 鏁版嵁
+     * @param xDataSource X鍧愭爣鏁版嵁缂撳瓨
+     * @param yDataSource Y鍧愭爣鏁版嵁缂撳瓨
+     */
+    protected static void updateScatterChart(List<SeriesData> seriesDatas, CTAxDataSource xDataSource,
+                                             CTNumDataSource yDataSource) {
+
+        //鑾峰彇xy鍧愭爣鏁版嵁鏉℃暟
+        long xNumCnt = xDataSource.getNumRef().getNumCache().getPtCount().getVal();
+        long yNumCnt = yDataSource.getNumRef().getNumCache().getPtCount().getVal();
+
+
+        System.out.println("[鏈夋暟鎹甝鏉℃暟  x:"+xNumCnt+" y:"+yNumCnt);
+
+        //鑾峰彇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);
+            CTNumVal val = xNumCnt > i ? xDataSource.getNumRef().getNumCache().getPtArray(i)
+                    : xDataSource.getNumRef().getNumCache().addNewPt();
+            val.setIdx(i);
+            if(cellValu.value == -1){
+                val.setV(null);
+            }else {
+                val.setV(String.format("%.0f", cellValu.value));
+            }
+        }
+
+        //鏇存柊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);
+            if(cellValu.value == -1){
+                val.setV(null);
+            }else {
+                val.setV(String.format("%.0f", cellValu.value));
+            }
+
+        }
+
+        // 鏇存柊瀵瑰簲excel鐨勮寖鍥�
+        xDataSource.getNumRef().setF(
+                replaceRowEnd(xDataSource.getNumRef().getF(),
+                        xNumCnt,
+                        xRowDataSize));
+        yDataSource.getNumRef().setF(
+                replaceRowEnd(yDataSource.getNumRef().getF(),
+                        yNumCnt,
+                        yRowDataSize));
+
+        // 鍒犻櫎澶氱殑
+        if (xNumCnt > xRowDataSize) {
+            for (int idx = xRowDataSize; idx < xNumCnt; idx++) {
+                xDataSource.getNumRef().getNumCache().removePt(xRowDataSize);
+            }
+        }
+        if (yNumCnt > yRowDataSize) {
+            for (int idx = yRowDataSize; idx < yNumCnt; idx++) {
+                yDataSource.getNumRef().getNumCache().removePt(yRowDataSize);
+            }
+        }
+        // 鏇存柊涓暟
+        xDataSource.getNumRef().getNumCache().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;
+    }
+
+    /**
+     * 鏇存柊鍥捐〃閲� Excel鐨勬暟鍊�
+     * @param seriesDatas
+     * @param sheet
+     */
+    protected static void refreshExcel(List<SeriesData> seriesDatas, 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);
+                }
+                //浼樺厛浣跨敤瀛楃涓插��
+                if(StringUtils.isNotEmpty(cellValu.valueStr)){
+                    cell.setCellValue(cellValu.valueStr);
+                }else{
+                    if(cellValu.value != -1){
+                        cell.setCellValue(cellValu.value);
+                    }else{
+                        cell.setCellValue((String) null);
+                    }
+                }
+
+            }
+            //鍒犻櫎澶氫綑琛屾暟
+            int lastRowNum = sheet.getLastRowNum();
+            //log.error("lastRowNum:{},size:{}",lastRowNum,size);
+            if (lastRowNum > size) {
+                for (int idx = lastRowNum; idx > size; idx--) {
+                    if(sheet.getRow(idx) == null){
+                        continue;
+                    }
+                    sheet.removeRow(sheet.getRow(idx));
+                }
+            }
+        }
+    }
+
+    /**
+     * 鑾峰彇鎸囧畾绫诲瀷鐨凷eriesData銆�
+     * @param list
+     * @param type
+     * @return
+     */
+    public static Map<Integer,List<SeriesData>> getSeriesDataByType(List<LAQTemplate> list,Integer type)
+    {
+        Map<Integer,List<SeriesData>> seriesDataMap = new HashMap<>();
+        int dataIndex =1;
+        for (int i = 0; i < list.size(); i++)
+        {
+            LAQTemplate laqTemplate = list.get(i);
+            Double olas = Double.valueOf(laqTemplate.getOlas().toString());
+            Double perfomance;
+            if(laqTemplate.getPerfomance()!= null)
+            {
+                perfomance = Double.valueOf(laqTemplate.getPerfomance().toString());
+            }
+            else {
+                perfomance = 0.0;
+            }
+
+            List<SeriesData> seriesDatas = new ArrayList<>();
+            seriesDatas = Arrays.asList(
+                    new SeriesData("X 鍊�", Arrays.asList(
+                            new RowData("X 鍊�", olas)
+                    )),
+                    new SeriesData("Y 鍊�", Arrays.asList(
+                            new RowData("Y 鍊�", perfomance)
+                    ))
+            );
+
+
+            if(type==1)
+            {
+                if(olas>67)
+                {
+                    seriesDataMap.put(dataIndex,seriesDatas);
+                    dataIndex++;
+                }
+            }
+
+            if(type==2)
+            {
+                if(olas<=67 && olas>33)
+                {
+                    seriesDataMap.put(dataIndex,seriesDatas);
+                    dataIndex++;
+                }
+            }
+
+            if(type==3)
+            {
+                if(olas<=33)
+                {
+                    seriesDataMap.put(dataIndex,seriesDatas);
+                    dataIndex++;
+                }
+            }
+        }
+
+        return  seriesDataMap;
+    }
+
+    /**
+     * 鑾峰彇鏁g偣鍥剧殑鎵�鏈夋爣绛�
+     * @param list
+     * @param type
+     * @return
+     */
+    public static Map<Integer,String> getSeriesDataLablesByType(List<LAQTemplate> list,Integer type)
+    {
+        Map<Integer,String> seriesDataMapLables = new HashMap<>();
+        int dataIndex =1;
+        for (int i = 0; i < list.size(); i++)
+        {
+            LAQTemplate laqTemplate = list.get(i);
+            Double olas = Double.valueOf(laqTemplate.getOlas().toString());
+            Double perfomance;
+            if(laqTemplate.getPerfomance()!= null)
+            {
+                perfomance = Double.valueOf(laqTemplate.getPerfomance().toString());
+            }
+            else {
+                perfomance = 0.0;
+            }
+
+
+            String olasStr = olas.toString();
+            String perfomanceStr = perfomance.toString();
+
+            // 鍒ゆ柇灏忔暟閮ㄥ垎鏄惁涓�0
+            if (Math.abs(olas - Math.floor(olas)) < 1e-9) {
+                // 濡傛灉灏忔暟閮ㄥ垎鎺ヨ繎浜�0锛屽垯鍙栨暣鏁伴儴鍒�
+                olasStr = String.valueOf(olas.intValue());
+            }
+
+            if (Math.abs(perfomance - Math.floor(perfomance)) < 1e-9) {
+                // 濡傛灉灏忔暟閮ㄥ垎鎺ヨ繎浜�0锛屽垯鍙栨暣鏁伴儴鍒�
+                perfomanceStr = String.valueOf(perfomance.intValue());
+            }
+
+            if(type==1)
+            {
+                if(olas>67)
+                {
+                    seriesDataMapLables.put(dataIndex,laqTemplate.getName()+"("+olasStr+"-"+perfomanceStr+")");
+                    dataIndex++;
+                }
+            }
+
+            if(type==2)
+            {
+                if(olas<=67 && olas>33)
+                {
+                    seriesDataMapLables.put(dataIndex,laqTemplate.getName()+"("+olasStr+"-"+perfomanceStr+")");
+                    dataIndex++;
+                }
+            }
+
+            if(type==3)
+            {
+                if(olas<=33)
+                {
+                    seriesDataMapLables.put(dataIndex,laqTemplate.getName()+"("+olasStr+"-"+perfomanceStr+")");
+
+                    dataIndex++;
+                }
+            }
+        }
+
+        return  seriesDataMapLables;
+    }
+
+
+    /**
+     * 鑾峰彇鍥捐〃鏈夊摢浜涚被鍨�
+     * @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()+"}");
+        }
+    }
+}
diff --git a/src/main/java/com/ots/project/tool/report/LAQ/chart/LAQChart.java b/src/main/java/com/ots/project/tool/report/LAQ/chart/LAQChart.java
index f5c1cb2..404d971 100644
--- a/src/main/java/com/ots/project/tool/report/LAQ/chart/LAQChart.java
+++ b/src/main/java/com/ots/project/tool/report/LAQ/chart/LAQChart.java
@@ -372,7 +372,7 @@
 
         } catch (Exception e) {
             e.printStackTrace();
-            log.error("MAQTR鏇挎崲word鍥捐〃 鏁g偣鍥惧浘褰㈠け璐ワ細{}",e);
+            log.error("LAQ.鏇挎崲word鍥捐〃 鏁g偣鍥惧浘褰㈠け璐ワ細{}",e);
         }
     }
 
diff --git a/src/main/java/com/ots/project/tool/report/LAQ/chart/LAQTest.java b/src/main/java/com/ots/project/tool/report/LAQ/chart/LAQTest.java
index 2ec6ea3..053dd0a 100644
--- a/src/main/java/com/ots/project/tool/report/LAQ/chart/LAQTest.java
+++ b/src/main/java/com/ots/project/tool/report/LAQ/chart/LAQTest.java
@@ -1,16 +1,44 @@
 package com.ots.project.tool.report.LAQ.chart;
 
 import com.alibaba.fastjson.JSON;
+import com.aspose.words.Chart;
+import com.aspose.words.Document;
+import com.aspose.words.DocumentBuilder;
+import com.aspose.words.Paragraph;
 import com.microsoft.schemas.vml.CTTextbox;
+import com.ots.common.utils.StringUtils;
 import com.ots.common.utils.poi.ExcelUtil;
 import com.ots.common.utils.poi.WordUtil;
 import com.ots.project.tool.report.LAQ.LAQReport;
 import com.ots.project.tool.report.LAQ.LAQTemplate;
+import com.ots.project.tool.report.MAQ.base.RowData;
 import com.ots.project.tool.report.MAQ.base.SeriesData;
+import javafx.scene.chart.ScatterChart;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.ooxml.POIXMLDocument;
+import org.apache.poi.ooxml.POIXMLDocumentPart;
+import org.apache.poi.openxml4j.util.ZipSecureFile;
+import org.apache.poi.sl.usermodel.PictureData;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.util.Units;
+import org.apache.poi.xddf.usermodel.chart.AxisPosition;
+import org.apache.poi.xddf.usermodel.chart.XDDFCategoryAxis;
+import org.apache.poi.xddf.usermodel.chart.XDDFChartData;
+import org.apache.poi.xddf.usermodel.chart.XDDFValueAxis;
+import org.apache.poi.xssf.usermodel.*;
+import org.apache.poi.xwpf.usermodel.XWPFChart;
 import org.apache.poi.xwpf.usermodel.XWPFDocument;
 import org.apache.poi.xwpf.usermodel.XWPFParagraph;
 import org.apache.poi.xwpf.usermodel.XWPFRun;
+import org.apache.xmlbeans.XmlObject;
+import org.openxmlformats.schemas.drawingml.x2006.chart.*;
+import org.openxmlformats.schemas.officeDocument.x2006.math.CTText;
+import org.openxmlformats.schemas.officeDocument.x2006.math.CTUnSignedInteger;
+import org.openxmlformats.schemas.officeDocument.x2006.math.impl.CTUnSignedIntegerImpl;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTxbxContent;
 
 import java.awt.*;
 import java.io.*;
@@ -21,151 +49,727 @@
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 @Slf4j
 public class LAQTest {
+
+    //杩欓噷鏄敤鏉ユ祴璇曠殑
     public static void main(String[] args) throws Exception {
         System.out.println("鍚姩娴嬭瘯..");
+//        Map<String, Object> textMap = new HashMap<String, Object>();
+//        textMap.put("%boxgrid1%","鏄撶传杞┿�侀偟璇楁偊");
+//        textMap.put("%boxgrid2%","鍙惰瘲鎮�");
+//        textMap.put("%boxgrid3%","鍒樻櫒娑�");
+//        textMap.put("%boxgrid4%","娈靛浗璐�");
+//        textMap.put("%boxgrid5%","璐虹憺杈�");
+//        textMap.put("%boxgrid6%","璧电繑");
+//        textMap.put("%boxgrid7%","閽变匠姣�");
+//        textMap.put("%boxgrid8%","鍗㈡枃杞�");
+//        textMap.put("%boxgrid9%","鍞愬繝鏋�");
 
 
+        String dataPath = "D:\\妗岄潰鏂囦欢\\LAQ鍏ㄦ櫙鍥炬姤鍛奬\LAQ瀵煎叆娴嬭瘯鏁版嵁.xlsx";
+        // 鑾峰彇瀵煎叆鏁版嵁
+        File file = new File(dataPath);
+        InputStream in = new FileInputStream(file);
+        ExcelUtil<LAQTemplate> util = new ExcelUtil<>(LAQTemplate.class);
+        List<LAQTemplate> laqTemplateList = util.importExcel(in);
+        // 鐢熸垚鏂囦欢闆嗗悎
+        List<String> fileNameList = new ArrayList<>();
+        List<String> deleteStrList = new ArrayList<>();
+
+//        for (int i = 0; i < laqTemplateList.size(); i++) {
+//            LAQTemplate laqTemplate = laqTemplateList.get(i);
+//            //缁勮鎶ュ憡鎵�鐢ㄦ暟鎹�
+//            Map<String, Object> textMap = new HashMap<>();
+//            textMap.put("olas", "85");
+//            textMap.put("ca", "32");
+//            textMap.put("bla", "34");
+//            textMap.put("nr", "3");
+//            textMap.put("ar", "45");
+//            textMap.put("open", "67");
+//            textMap.put("cons", "12");
+//            textMap.put("extra", "48");
+//            textMap.put("agree", "90");
+//            textMap.put("emosta", "23");
+//            textMap.put("perfomance", "60");
 //
-//        try {
-//            FileInputStream fis = new FileInputStream("D:\\妗岄潰鏂囦欢\\TaiTest.docx");
-//            XWPFDocument document = new XWPFDocument(fis);
 //
-//            List<XWPFParagraph> paragraphs = document.getParagraphs();
-//            for (XWPFParagraph paragraph : paragraphs) {
-//                for (XWPFRun run : paragraph.getRuns()) {
-//                    for (XWPFPicture picture : run.getEmbeddedPictures()) {
-//                        if (picture.getCTPicture() != null
-//                                && picture.getCTPicture().getSpPr() != null
-//                                && picture.getCTPicture().getSpPr().getXfrm() != null
-//                                && picture.getCTPicture().getSpPr().getXfrm().getExt() != null) {
+//            LAQReport report = new LAQReport();
 //
-//                            CTPositiveSize2D ext = picture.getCTPicture().getSpPr().getXfrm().getExt();
-//                            if (ext != null) {
-//                                long widthEmus = ext.getCx();
-//                                long heightEmus = ext.getCy();
-//
-//                                int width = (int) (widthEmus / 9525); // Convert EMUs to points (assuming 1 inch = 9525 EMUs)
-//                                int height = (int) (heightEmus / 9525); // Convert EMUs to points (assuming 1 inch = 9525 EMUs)
-//
-//                                System.out.println("Image Width: " + width + " points");
-//                                System.out.println("Image Height: " + height + " points");
-//                            }
-//                        } else {
-//                            System.err.println("Error: Unable to retrieve image width and height.");
-//                        }
-//                    }
-//                }
+//            ZipSecureFile.setMinInflateRatio(0.001);
+//            try (OutputStream os = new FileOutputStream("D:\\妗岄潰鏂囦欢\\LAQ鑻辨枃鎶ュ憡"+UUID.randomUUID().toString()+".docx");
+//                 XWPFDocument document = new XWPFDocument(POIXMLDocument.openPackage("D:\\妗岄潰鏂囦欢\\LAQ鑻辨枃鎶ュ憡-鍙犲姞鐗堟湰.docx"))) {
+//                Map<Integer, List<SeriesData>> seriesDatas = initData(textMap);
+//                Map<Integer,String> lableDatas = initLables();
+//                changeChart(document, seriesDatas, textMap,lableDatas);
+//                document.write(os);
+//            } catch (Exception e) {
+//                e.printStackTrace();
 //            }
-//
-//
-//            // 鍒涘缓涓�涓柊鐨勬钀�
-////            XWPFParagraph paragraph = document.createParagraph();
-////
-////            // 璁剧疆娈佃惤鐨勫乏杈硅窛鍜屼笂杈硅窛
-//////            paragraph.setIndentationLeft(0); // 0鏈�灏忋��7500
-//////            paragraph.setSpacingBefore(0); // 璁剧疆涓婅竟璺濅负0
-////            paragraph.setIndentationLeft(7200);//鏈�澶�8000
-////            paragraph.setSpacingBefore(7000);//鏈�澶�7200
-////
-////            // 娣诲姞鏂囨湰鍒版钀�
-////            XWPFRun run = paragraph.createRun();
-////            run.setText("鍚寸鏀�");
-////
-////
-////            XWPFParagraph paragraph1 = document.createParagraph();
-////            paragraph1.setIndentationLeft(5000);//鏈�澶�8000
-////            paragraph1.setSpacingBefore(5000);//鏈�澶�7200
-////            XWPFRun run1= paragraph1.createRun();
-////            run1.setText("鍚磋鏅�");
-//
-//
-//            // 鍒涘缓涓�涓舰鐘朵綔涓烘枃鏈
-//            Shape textBox = new Shape(document, ShapeType.TEXT_BOX);
-//
-//            // 璁剧疆鏂囨湰妗嗙殑鍐呭
-//            textBox.getTextPath().setText("鏂囨湰妗嗕腑鐨勬枃鏈�");
-//
-//            // 璁剧疆鏂囨湰妗嗙殑浣嶇疆鍜屽ぇ灏�
-//            textBox.setWidth(200); // 璁剧疆瀹藉害
-//            textBox.setHeight(100); // 璁剧疆楂樺害
-//
-//            // 璁剧疆鏂囨湰妗嗙殑鑳屾櫙閫忔槑
-//            textBox.setFilled(false); // 璁剧疆濉厖鑹蹭负閫忔槑
-//            textBox.setStrokeColor(Color.WHITE); // 璁剧疆杈规棰滆壊涓洪�忔槑
-//
-//            // 灏嗘枃鏈娣诲姞鍒版枃妗d腑
-//            doc.getFirstSection().getBody().getFirstParagraph().appendChild(textBox);
-//
-//
-//            // 灏嗘枃妗e啓鍏ュ埌鏂囦欢
-//            FileOutputStream fos = new FileOutputStream("D:\\妗岄潰鏂囦欢\\TaiTest_out_"+ UUID.randomUUID().toString() +".docx");
-//            document.write(fos);
-//
-//            // 鍏抽棴鏂囦欢娴�
-//            fis.close();
-//            fos.close();
-//
-//        } catch (IOException e) {
-//            e.printStackTrace();
 //        }
-//
 
-//        FileInputStream fis = new FileInputStream("D:\\妗岄潰鏂囦欢\\TaiTest.docx");
-//        Document doc = new Document(fis);
-//
-//        // 鍒涘缓鏂囨湰妗�
-//        Shape textBox = new Shape(doc, ShapeType.TEXT_BOX);
-//        textBox.setWidth(200); // 璁剧疆鏂囨湰妗嗗搴�
-//        textBox.setHeight(50); // 璁剧疆鏂囨湰妗嗛珮搴�
-//        textBox.setWrapType(WrapType.NONE); // 璁剧疆鏂囨湰妗嗕笉鑷姩鎹㈣
-//
-//        // 鍒涘缓鏂囨湰妗嗙殑娈佃惤鍜孯un瀵硅薄锛屽苟娣诲姞鍐呭
-//        Paragraph para = new Paragraph(doc);
-//        Run run = new Run(doc, "杩欐槸鏂囨湰妗嗕腑鐨勫唴瀹�");
-//        para.appendChild(run);
-//        textBox.appendChild(para);
-//
-//        // 娣诲姞鏂囨湰妗嗗埌Word鏂囨。
-//        doc.getFirstSection().getBody().getFirstParagraph().appendChild(textBox);
-//
-//        // 淇濆瓨淇敼鍚庣殑Word鏂囨。
-//        doc.save("D:\\妗岄潰鏂囦欢\\TaiTest_out_"+ UUID.randomUUID().toString() +".docx");
-//
 
-        // 鍒涘缓涓�涓┖鐨刉ord鏂囨。
-//        XWPFDocument document = new XWPFDocument();
-//
-//        // 鍒涘缓涓�涓钀�
-//        XWPFParagraph paragraph = document.createParagraph();
-//
-//        // 鍒涘缓涓�涓枃鏈
-//        XWPFRun run = paragraph.createRun();
-//        CTTextbox textbox = run.getCTR().addNewTextbox();
-//        CTTextboxContent textboxContent = textbox.addNewTextboxContent();
-//
-//        // 璁剧疆鏂囨湰妗嗙殑浣嶇疆鍜屽ぇ灏�
-//        textbox.setInset(new BigInteger("0"));
-//        textboxContent.setWMode(STTextbox.WMode.WINDOW);
-//        textboxContent.setNoBorder(true);
-//        textboxContent.setAnchor(STTextAnchoringType.MIDDLE);
-//        textboxContent.setAnchorCenter(true);
-//
-//        // 璁剧疆鏂囨湰妗嗙殑鍐呭
-//        textboxContent.setT("This is a text box.");
-//
-//        // 淇濆瓨鏂囨。
-//        try {
-//            FileOutputStream out = new FileOutputStream("example.docx");
-//            document.write(out);
-//            out.close();
-//            System.out.println("Word鏂囨。鍒涘缓鎴愬姛锛�");
-//        } catch (Exception e) {
-//            e.printStackTrace();
-//        }
+        ZipSecureFile.setMinInflateRatio(0.001);
+        try (OutputStream os = new FileOutputStream("D:\\妗岄潰鏂囦欢\\鍙垹闄\LAQ鑻辨枃鎶ュ憡"+UUID.randomUUID().toString()+".docx");
+             XWPFDocument document = new XWPFDocument(POIXMLDocument.openPackage("D:\\妗岄潰鏂囦欢\\LAQ鑻辨枃鎶ュ憡-鍙犲姞鐗堟湰.docx"))) {
+            changeChartNew(document,laqTemplateList);
+            document.write(os);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+
+        System.out.println("澶勭悊瀹屾垚...");
 
     }
 
+
+    /**
+     * 鍒濆鍖栨暟鎹�
+     * @param list
+     * @return
+     */
+    public static Map<Integer,List<SeriesData>> initNewData(List<LAQTemplate> list)
+    {
+        Map<Integer,List<SeriesData>> seriesDataMap = new HashMap<>();
+        for (int i = 0; i < list.size(); i++)
+        {
+            LAQTemplate laqTemplate = list.get(i);
+            Double olas = Double.valueOf(laqTemplate.getOlas().toString());
+            Double perfomance;
+            if(laqTemplate.getPerfomance()!= null)
+            {
+                perfomance = Double.valueOf(laqTemplate.getPerfomance().toString());
+            }
+            else {
+                perfomance = 0.0;
+            }
+
+            List<SeriesData> seriesDatas = new ArrayList<>();
+            seriesDatas = Arrays.asList(
+                    new SeriesData("X 鍊�", Arrays.asList(
+                            new RowData("X 鍊�", olas)
+                    )),
+                    new SeriesData("Y 鍊�", Arrays.asList(
+                            new RowData("Y 鍊�", perfomance)
+                    ))
+            );
+
+
+            Integer box = laqTemplate.getBox();
+            if(olas>=66)
+            {
+                seriesDataMap.put(100+i+1,seriesDatas);
+            }
+            else if(olas>33&&olas<66)
+            {
+                seriesDataMap.put(200+i+1,seriesDatas);
+            }
+            else
+            {
+                seriesDataMap.put(300+i+1,seriesDatas);
+            }
+        }
+
+        return  seriesDataMap;
+    }
+
+    public static Map<Integer,List<SeriesData>> initData(Map<String, Object> textMap){
+        Map<Integer,List<SeriesData>> seriesDataMap = new HashMap<>();
+        //鑾峰彇鍛戒腑鏁板��
+        Double olas = Double.valueOf((String)textMap.get("olas"));
+        Double ca = Double.valueOf((String)textMap.get("ca"));
+        Double bla = Double.valueOf((String)textMap.get("bla"));
+        Double nr = Double.valueOf((String)textMap.get("nr"));
+        Double ar = Double.valueOf((String)textMap.get("ar"));
+        Double open = Double.valueOf((String)textMap.get("open"));
+        Double cons = Double.valueOf((String)textMap.get("cons"));
+        Double extra = Double.valueOf((String)textMap.get("extra"));
+        Double agree = Double.valueOf((String)textMap.get("agree"));
+        Double emosta = Double.valueOf((String)textMap.get("emosta"));
+        Double perfomance;
+        if(textMap.get("perfomance") != null){
+            perfomance = Double.valueOf((String)textMap.get("perfomance"));
+        }else{
+            perfomance = -1D;
+        }
+
+
+        // 鍥捐〃1
+        List<SeriesData> seriesDatas = new ArrayList<>();
+        // 鍥捐〃1
+        seriesDatas = Arrays.asList(
+                new SeriesData("X 鍊�", Arrays.asList(
+                        new RowData("X 鍊�", perfomance.doubleValue() == -1 ? perfomance.doubleValue() : olas.doubleValue())
+                )),
+                new SeriesData("Y 鍊�", Arrays.asList(
+                        new RowData("Y 鍊�", perfomance.doubleValue())
+                ))
+        );
+        seriesDataMap.put(1,seriesDatas);
+
+
+        seriesDatas = Arrays.asList(
+                new SeriesData("X 鍊�", Arrays.asList(
+                        new RowData("X 鍊�", 95)
+                )),
+                new SeriesData("Y 鍊�", Arrays.asList(
+                        new RowData("Y 鍊�", 87)
+                ))
+        );
+        seriesDataMap.put(2,seriesDatas);
+
+
+        seriesDatas = Arrays.asList(
+                new SeriesData("X 鍊�", Arrays.asList(
+                        new RowData("X 鍊�", 96)
+                )),
+                new SeriesData("Y 鍊�", Arrays.asList(
+                        new RowData("Y 鍊�", 90)
+                ))
+        );
+        seriesDataMap.put(3,seriesDatas);
+
+
+
+        return seriesDataMap;
+    }
+
+
+    /**
+     * 鑾峰彇鎸囧畾绫诲瀷鐨凷eriesData銆�
+     * @param list
+     * @param type
+     * @return
+     */
+    public static Map<Integer,List<SeriesData>> getSeriesDataByType(List<LAQTemplate> list,Integer type)
+    {
+        Map<Integer,List<SeriesData>> seriesDataMap = new HashMap<>();
+        int dataIndex =1;
+        for (int i = 0; i < list.size(); i++)
+        {
+            LAQTemplate laqTemplate = list.get(i);
+            Double olas = Double.valueOf(laqTemplate.getOlas().toString());
+            Double perfomance;
+            if(laqTemplate.getPerfomance()!= null)
+            {
+                perfomance = Double.valueOf(laqTemplate.getPerfomance().toString());
+            }
+            else {
+                perfomance = 0.0;
+            }
+
+            List<SeriesData> seriesDatas = new ArrayList<>();
+            seriesDatas = Arrays.asList(
+                    new SeriesData("X 鍊�", Arrays.asList(
+                            new RowData("X 鍊�", olas)
+                    )),
+                    new SeriesData("Y 鍊�", Arrays.asList(
+                            new RowData("Y 鍊�", perfomance)
+                    ))
+            );
+
+
+            if(type==1)
+            {
+                if(olas>67)
+                {
+                    seriesDataMap.put(dataIndex,seriesDatas);
+                    dataIndex++;
+                }
+            }
+
+            if(type==2)
+            {
+                if(olas<=67 && olas>33)
+                {
+                    seriesDataMap.put(dataIndex,seriesDatas);
+                    dataIndex++;
+                }
+            }
+
+            if(type==3)
+            {
+                if(olas<=33)
+                {
+                    seriesDataMap.put(dataIndex,seriesDatas);
+                    dataIndex++;
+                }
+            }
+        }
+
+        return  seriesDataMap;
+    }
+
+
+    public static Map<Integer,String> getSeriesDataLablesByType(List<LAQTemplate> list,Integer type)
+    {
+        Map<Integer,String> seriesDataMapLables = new HashMap<>();
+        int dataIndex =1;
+        for (int i = 0; i < list.size(); i++)
+        {
+            LAQTemplate laqTemplate = list.get(i);
+            Double olas = Double.valueOf(laqTemplate.getOlas().toString());
+            Double perfomance;
+            if(laqTemplate.getPerfomance()!= null)
+            {
+                perfomance = Double.valueOf(laqTemplate.getPerfomance().toString());
+            }
+            else {
+                perfomance = 0.0;
+            }
+
+
+            String olasStr = olas.toString();
+            String perfomanceStr = perfomance.toString();
+
+            // 鍒ゆ柇灏忔暟閮ㄥ垎鏄惁涓�0
+            if (Math.abs(olas - Math.floor(olas)) < 1e-9) {
+                // 濡傛灉灏忔暟閮ㄥ垎鎺ヨ繎浜�0锛屽垯鍙栨暣鏁伴儴鍒�
+                olasStr = String.valueOf(olas.intValue());
+            }
+
+            if (Math.abs(perfomance - Math.floor(perfomance)) < 1e-9) {
+                // 濡傛灉灏忔暟閮ㄥ垎鎺ヨ繎浜�0锛屽垯鍙栨暣鏁伴儴鍒�
+                perfomanceStr = String.valueOf(perfomance.intValue());
+            }
+
+            if(type==1)
+            {
+                if(olas>67)
+                {
+                    seriesDataMapLables.put(dataIndex,laqTemplate.getName()+"("+olasStr+"-"+perfomanceStr+")");
+                    dataIndex++;
+                }
+            }
+
+            if(type==2)
+            {
+                if(olas<=67 && olas>33)
+                {
+                    seriesDataMapLables.put(dataIndex,laqTemplate.getName()+"("+olasStr+"-"+perfomanceStr+")");
+                    dataIndex++;
+                }
+            }
+
+            if(type==3)
+            {
+                if(olas<=33)
+                {
+                    seriesDataMapLables.put(dataIndex,laqTemplate.getName()+"("+olasStr+"-"+perfomanceStr+")");
+
+                    dataIndex++;
+                }
+            }
+        }
+
+        return  seriesDataMapLables;
+    }
+
+
+    public static void changeChartNew(XWPFDocument document,List<LAQTemplate> list) {
+        if(list.size()<=0){
+            return;
+        }
+        try {
+            //鑾峰彇鏁版嵁
+            Map<Integer,List<SeriesData>> seriesDataMapTop = getSeriesDataByType(list,1);
+            Map<Integer,List<SeriesData>> seriesDataMapMiddle = getSeriesDataByType(list,2);
+            Map<Integer,List<SeriesData>> seriesDataMapBottom = getSeriesDataByType(list,3);
+
+            //鑾峰彇鏍囩
+            Map<Integer,String> seriesDataLablesTop = getSeriesDataLablesByType(list,1);
+            Map<Integer,String> seriesDataLablesMiddle = getSeriesDataLablesByType(list,2);
+            Map<Integer,String> seriesDataLablesBottom = getSeriesDataLablesByType(list,3);
+
+            List<POIXMLDocumentPart> relations = document.getRelations();
+            int barIndex = 1;
+
+            //涓変釜鍥捐〃鐨勪釜鏁�
+            int topIndex =1;
+            int middleIndex =1;
+            int bottomIndex =1;
+
+            for (POIXMLDocumentPart part : relations) {
+                if (part instanceof XWPFChart) {
+                    // 鍥捐〃鍏冪礌
+                    XWPFChart chart = (XWPFChart) part;
+                    // 鏌ョ湅閲岄潰鐨勫浘琛ㄦ暟鎹紝鎵嶈兘鐭ラ亾鏄粈涔堝浘琛�
+                    CTPlotArea plot = chart.getCTChart().getPlotArea();
+                    getChartType(chart);
+                    // excel鍐呯疆琛ㄦ牸
+                    XSSFWorkbook workbook = chart.getWorkbook();
+                    XSSFSheet sheet = workbook.getSheetAt(0);
+
+                    //鏁g偣鍥�
+                    if (!plot.getScatterChartList().isEmpty()) {
+                        CTScatterChart scatterChart = plot.getScatterChartArray(0);
+                        //绗竴涓暎鐐瑰浘1-90锛岀浜屼釜91-180锛岀涓変釜181-270
+                        System.out.println("绗�"+barIndex+"涓暎鐐瑰浘");
+                        String lables = "";
+                        List<SeriesData> seriesDatas = new ArrayList<>();
+
+                        // 鑾峰彇鍥捐〃鐨勫�艰酱,骞舵妸鏈�灏忓�艰缃负-0锛�
+                        // chart.getAxes().get(1) 鑾峰彇鐨勭旱鍧愭爣锛宑hart.getAxes().get(0) 鑾峰彇鐨勬槸妯潗鏍�
+                        chart.getAxes().get(1).setMinimum(0);
+                        Double maximum = chart.getAxes().get(0).getMaximum();
+
+                        Double minimum = chart.getAxes().get(0).getMinimum();
+//                        System.out.println("X杞存渶灏忓�兼槸锛�"+minimum+",鏈�澶у�兼槸锛�"+maximum);
+
+                        //鍒ゆ柇鍥捐〃鎵�鍦ㄤ綅缃�
+                        if(minimum>=67)
+                        {
+                            seriesDatas = seriesDataMapTop.get(topIndex);
+                            lables = seriesDataLablesTop.get(topIndex);
+                            topIndex++;
+//                            System.out.println("绗竴椤靛浘琛ㄤ釜鏁帮細"+topIndex+"锛屾爣绛撅細"+lables+";"+"X杞存渶灏忓�兼槸锛�"+minimum+",鏈�澶у�兼槸锛�"+maximum);
+                        }
+                        else if(minimum>=33)
+                        {
+                            seriesDatas = seriesDataMapMiddle.get(middleIndex);
+                            lables = seriesDataLablesMiddle.get(middleIndex);
+//                            System.out.println("绗簩椤靛浘琛ㄤ釜鏁帮細"+middleIndex);
+
+                            middleIndex++;
+                        }
+                        else
+                        {
+                            seriesDatas = seriesDataMapBottom.get(bottomIndex);
+                            lables = seriesDataLablesBottom.get(bottomIndex);
+                            bottomIndex++;
+//                            System.out.println("绗笁椤靛浘琛ㄤ釜鏁帮細"+bottomIndex);
+                        }
+
+
+                        barIndex++;
+
+
+                        if(seriesDatas==null)
+                        {
+                            for (CTScatterSer ser : scatterChart.getSerList()) {
+                                ser.getTx().getStrRef().getStrCache().getPtArray(0).setV("");
+                            }
+                            continue;
+                        }
+
+                        //鍒锋柊鍐呯疆excel鏁版嵁
+                        refreshExcel(seriesDatas, sheet);
+                        workbook.write(chart.getPackagePart().getOutputStream());
+                        int i = 0;
+                        for (CTScatterSer ser : scatterChart.getSerList()) {
+                            //鏇存柊鏁g偣鍥剧紦瀛�
+                            updateScatterChart(seriesDatas, ser.getXVal(), ser.getYVal());
+                            ser.getTx().getStrRef().getStrCache().getPtArray(0).setV(lables);
+                            ++i;
+                        }
+
+                    }
+
+
+
+                }
+            }
+
+
+            System.out.println("绗竴椤靛浘琛ㄤ釜鏁帮細"+(topIndex-1));
+            System.out.println("绗簩椤靛浘琛ㄤ釜鏁帮細"+(middleIndex-1));
+            System.out.println("绗笁椤靛浘琛ㄤ釜鏁帮細"+(bottomIndex-1));
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("LAQ.鏇挎崲word鍥捐〃 鏁g偣鍥惧浘褰㈠け璐ワ細{}",e);
+        }
+    }
+
+
+    public static void changeChart(XWPFDocument document, Map<Integer,List<SeriesData>> seriesDataMap, Map<String, Object> textMap,Map<Integer,String> lableDatas) {
+        if(StringUtils.isEmpty(textMap)){
+            return;
+        }
+        try {
+
+
+            List<POIXMLDocumentPart> relations = document.getRelations();
+            int barIndex = 1;
+            int chartIndex =1;//鏁g偣鍥捐〃鐨勬暟閲�
+            for (POIXMLDocumentPart part : relations) {
+                if (part instanceof XWPFChart) {
+                    // 鍥捐〃鍏冪礌
+                    XWPFChart chart = (XWPFChart) part;
+                    // 鏌ョ湅閲岄潰鐨勫浘琛ㄦ暟鎹紝鎵嶈兘鐭ラ亾鏄粈涔堝浘琛�
+                    CTPlotArea plot = chart.getCTChart().getPlotArea();
+                    getChartType(chart);
+                    // excel鍐呯疆琛ㄦ牸
+                    XSSFWorkbook workbook = chart.getWorkbook();
+                    XSSFSheet sheet = workbook.getSheetAt(0);
+
+
+                    //鏁g偣鍥�
+                    if (!plot.getScatterChartList().isEmpty()) {
+
+                        if(chartIndex>=1&&chartIndex<=90)
+                        {
+
+                        }
+
+
+                        List<SeriesData> seriesDatas = seriesDataMap.get(barIndex);
+
+                        CTScatterChart scatterChart = plot.getScatterChartArray(0);
+                        System.out.println("鏁g偣鍥緖"+plot.getScatterChartList().size()+"}");
+
+
+                        if(seriesDatas==null)
+                        {
+                            for (CTScatterSer ser : scatterChart.getSerList()) {
+                                ser.getTx().getStrRef().getStrCache().getPtArray(0).setV("");
+                            }
+                            continue;
+                        }
+
+                        // 鑾峰彇鍥捐〃鐨勫�艰酱,骞舵妸鏈�灏忓�艰缃负-0锛�
+                        // chart.getAxes().get(1) 鑾峰彇鐨勭旱鍧愭爣锛宑hart.getAxes().get(0) 鑾峰彇鐨勬槸妯潗鏍�
+                        chart.getAxes().get(1).setMinimum(0);
+                        Double maximum = chart.getAxes().get(1).getMaximum();
+                        Double minimum = chart.getAxes().get(1).getMinimum();
+
+
+                        System.out.println("銆愬紑濮嬨�戞渶澶э細"+maximum+",鏈�灏忥細"+minimum);
+
+
+                        //鍒锋柊鍐呯疆excel鏁版嵁
+                        refreshExcel(seriesDatas, sheet);
+                        workbook.write(chart.getPackagePart().getOutputStream());
+                        int i = 0;
+                        for (CTScatterSer ser : scatterChart.getSerList()) {
+
+                            //鏇存柊鏁g偣鍥剧紦瀛�
+                            updateScatterChart(seriesDatas, ser.getXVal(), ser.getYVal());
+
+                            String lables = lableDatas.get(barIndex);
+                            ser.getTx().getStrRef().getStrCache().getPtArray(0).setV(lables);
+
+//                            updateDLbls(ser);
+                            ++i;
+                        }
+
+                        barIndex++;
+                        chartIndex++;
+                    }
+
+
+
+                }
+            }
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("LAQ.鏇挎崲word鍥捐〃 鏁g偣鍥惧浘褰㈠け璐ワ細{}",e);
+        }
+    }
+
+    /**
+     * 鏇存柊鏍囩
+     * @param ser
+     */
+    private static void updateDLbls(CTScatterSer ser) {
+
+        // 璁剧疆鏁g偣鐨勫ぇ灏�
+//        CTMarkerSize ctMarkerSize = CTMarkerSize.Factory.newInstance();
+//        ctMarkerSize.setVal((short)0);
+//        ser.getMarker().setSize(ctMarkerSize);
+
+        ser.getTx().getStrRef().getStrCache().getPtArray(0).setV(UUID.randomUUID().toString());
+
+    }
+
+
+
+
+    /**
+     * 鏇存柊鍥捐〃鐨勫叧鑱� excel
+     *
+     * @param seriesDatas
+     * @param sheet
+     */
+    protected static void refreshExcel(List<SeriesData> seriesDatas, 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);
+                }
+                //浼樺厛浣跨敤瀛楃涓插��
+                if(StringUtils.isNotEmpty(cellValu.valueStr)){
+                    cell.setCellValue(cellValu.valueStr);
+                }else{
+                    if(cellValu.value != -1){
+                        cell.setCellValue(cellValu.value);
+                    }else{
+                        cell.setCellValue((String) null);
+                    }
+                }
+
+            }
+            //鍒犻櫎澶氫綑琛屾暟
+            int lastRowNum = sheet.getLastRowNum();
+            //log.error("lastRowNum:{},size:{}",lastRowNum,size);
+            if (lastRowNum > size) {
+                for (int idx = lastRowNum; idx > size; idx--) {
+                    if(sheet.getRow(idx) == null){
+                        continue;
+                    }
+                    sheet.removeRow(sheet.getRow(idx));
+                }
+            }
+        }
+    }
+
+
+    /**
+     * 鏇存柊 鏁g偣鍥� 缂撳瓨鏁版嵁
+     *
+     * @param seriesDatas 鏁版嵁
+     * @param xDataSource X鍧愭爣鏁版嵁缂撳瓨
+     * @param yDataSource Y鍧愭爣鏁版嵁缂撳瓨
+     */
+    protected static void updateScatterChart(List<SeriesData> seriesDatas, CTAxDataSource xDataSource,
+                                             CTNumDataSource yDataSource) {
+
+        //鑾峰彇xy鍧愭爣鏁版嵁鏉℃暟
+        long xNumCnt = xDataSource.getNumRef().getNumCache().getPtCount().getVal();
+        long yNumCnt = yDataSource.getNumRef().getNumCache().getPtCount().getVal();
+
+
+        System.out.println("[鏈夋暟鎹甝鏉℃暟  x:"+xNumCnt+" y:"+yNumCnt);
+
+        //鑾峰彇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);
+            CTNumVal val = xNumCnt > i ? xDataSource.getNumRef().getNumCache().getPtArray(i)
+                    : xDataSource.getNumRef().getNumCache().addNewPt();
+            val.setIdx(i);
+            if(cellValu.value == -1){
+                val.setV(null);
+            }else {
+                val.setV(String.format("%.0f", cellValu.value));
+            }
+        }
+
+        //鏇存柊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);
+            if(cellValu.value == -1){
+                val.setV(null);
+            }else {
+                val.setV(String.format("%.0f", cellValu.value));
+            }
+
+        }
+
+        // 鏇存柊瀵瑰簲excel鐨勮寖鍥�
+        xDataSource.getNumRef().setF(
+                replaceRowEnd(xDataSource.getNumRef().getF(),
+                        xNumCnt,
+                        xRowDataSize));
+        yDataSource.getNumRef().setF(
+                replaceRowEnd(yDataSource.getNumRef().getF(),
+                        yNumCnt,
+                        yRowDataSize));
+
+        // 鍒犻櫎澶氱殑
+        if (xNumCnt > xRowDataSize) {
+            for (int idx = xRowDataSize; idx < xNumCnt; idx++) {
+                xDataSource.getNumRef().getNumCache().removePt(xRowDataSize);
+            }
+        }
+        if (yNumCnt > yRowDataSize) {
+            for (int idx = yRowDataSize; idx < yNumCnt; idx++) {
+                yDataSource.getNumRef().getNumCache().removePt(yRowDataSize);
+            }
+        }
+        // 鏇存柊涓暟
+        xDataSource.getNumRef().getNumCache().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()+"}");
+        }
+    }
 }

--
Gitblit v1.9.1