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