From 06f27ee01cf31d37858941d751c4b0970c8e8878 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B5=B7?= <10402852@qq.com> Date: Tue, 19 Nov 2024 16:38:22 +0800 Subject: [PATCH] 'commit' --- .../Tools/FillData/ExcelKit/ExcelKit.java | 190 +++++++++--------- 1 file changed, 90 insertions(+), 100 deletions(-) diff --git a/src/main/java/com/dsideal/base/Tools/FillData/ExcelKit/ExcelKit.java b/src/main/java/com/dsideal/base/Tools/FillData/ExcelKit/ExcelKit.java index 7de66442..60552f8e 100644 --- a/src/main/java/com/dsideal/base/Tools/FillData/ExcelKit/ExcelKit.java +++ b/src/main/java/com/dsideal/base/Tools/FillData/ExcelKit/ExcelKit.java @@ -4,14 +4,12 @@ import com.dsideal.base.DataEase.Model.ExcelReader; import com.jfinal.kit.StrKit; import org.apache.commons.io.FileUtils; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; -import org.apache.poi.openxml4j.util.ZipSecureFile; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFCellStyle; import org.apache.poi.xssf.usermodel.XSSFFont; 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.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; @@ -38,7 +36,6 @@ public class ExcelKit { //删除旧的文件 ExcelKit.delExcel(sourceExcel); sourceExcel = sourceExcel + "x"; - //System.out.println("源文件" + sourceExcel + "文件转换成功"); } return sourceExcel; } @@ -483,8 +480,6 @@ public class ExcelKit { dataList.remove(i); } } - //printTable(dataList); - //System.out.println("==========================================="); return dataList; } @@ -567,116 +562,111 @@ public class ExcelKit { //将xml用IDEA打开,搜索关键的数据值,然后右键查看XPATH完整路径可以获取到下面的路径 ///c:chartSpace/c:chart/c:plotArea/c:lineChart/c:ser/c:cat/c:numRef/c:numCache/c:pt/c:v - ///c:chartSpace/c:chart/c:plotArea/c:lineChart/c:ser/c:val/c:numRef/c:numCache/c:pt/c:v - //在每个已知的图表类型中查找,找到后跳出循环 //声明一个数组,图表的所有类型 String[] CHART_TYPES = {"lineChart", "barChart"};//折线,柱状 // 创建一个一维列表,用于存储转换后的列 List> transposed = new ArrayList<>(); - List xList = new ArrayList<>(); - List children = root.element("chart").element("plotArea").elements(); + List listObject = new ArrayList<>(); + List xList = new ArrayList<>();//横坐标,一般是年份 + List children = root.element("chart").element("plotArea").elements();//工作区 + for (Element child : children) { //将CHART_TYPES数组转换为List List CHART_TYPES_LIST = Arrays.asList(CHART_TYPES); - if (CHART_TYPES_LIST.contains(child.getName())) { - transposed.clear(); - // 处理barChart或lineChart节点 - //System.out.println("找到图表类型:" + child.getName()); + if (CHART_TYPES_LIST.contains(child.getName())) {//如果当前遍历到的子元素是折线图或者柱状图 + System.out.println("找到图表类型:" + child.getName()); String type = child.getName(); - Element q = root.element("chart"); - q = q.element("plotArea"); - q = q.element(type); - for (Element w : q.elements("ser")) { - q = w.element("cat"); - q = q.element("numRef"); - Element p = q.element("f"); - System.out.println(p.getText()); - - q = q.element("numCache"); - xList = q.elements("pt"); - - - ///c:chartSpace/c:chart/c:plotArea/c:lineChart/c:ser/c:val/c:numRef/c:numCache - for (Element ser : root.element("chart").element("plotArea").element(type).elements("ser")) { - List yList = ser.element("val").element("numRef").element("numCache").elements("pt"); - - //记录都有哪些有效数值和索引号 - Map map = new HashMap<>(); - for (Element e : yList) { - map.put(Integer.parseInt(e.attribute("idx").getValue()), e); - } - List list = new ArrayList<>(); - for (int i = 0; i < xList.size(); i++) { - list.add(map.getOrDefault(i, null)); - } - listObject.add(list); - } - } - - - //数据是按行读取的 - for (int i = 0; i < listObject.size(); i++) { - List row = new ArrayList<>(); - List lo = (List) listObject.get(i); - for (Element e : lo) { - if (e == null) { - row.add(null); - } else { - //如果x可以转为小数,那么需要保留两位小数,如果可以转换为整数,那么直接返回整数,如果是字符串,就不变 - String x = null; - try { - x = e.element("v").getText(); - double d = Double.parseDouble(x); - if (d == (int) d) { - x = String.valueOf((int) d); - } else { - x = String.format("%.2f", d); - } - } catch (Exception err) { - //do nothing - } - row.add(x); - } - } - matrix.add(row); + Element ce = root.element("chart").element("plotArea").element(type); + + System.out.println("Count=" + ce.elements("ser").size()); + for (int m = 0; m < ce.elements("ser").size(); m++) { + Element ser = ce.elements("ser").get(m); + Element cat = ser.element("cat"); + Element numRef = cat.element("numRef"); + Element f = numRef.element("f"); + System.out.println(f.getText()); + //Element numCache = numRef.element("numCache"); + //xList = numCache.elements("pt"); + //System.out.println(xList); } - printTable(matrix); - - - //上面生成的数据格式需要行转列,横坐标是年份,纵坐标是数据 - int rowCount = matrix.size();// 计算行数和列数 - int colCount = matrix.getFirst().size(); - - //System.out.println("行数:" + rowCount + " " + "列数:" + colCount); - - // 遍历每一列 - for (int col = 0; col < colCount; col++) { - // 创建一个新的内部列表,用于存储当前列的所有行 - List column = new ArrayList<>(); - // 遍历每一行,将当前列的值添加到新的内部列表中 - for (int row = 0; row < rowCount; row++) { - String x = matrix.get(row).get(col); - - column.add(x); - } - // 将当前列添加到结果列表中 - transposed.add(column); - } + ///c:chartSpace/c:chart/c:plotArea/c:lineChart/c:ser/c:val/c:numRef/c:numCache +// for (Element ser : root.element("chart").element("plotArea").element(type).elements("ser")) { +// List yList = ser.element("val").element("numRef").element("numCache").elements("pt"); +// +// //记录都有哪些有效数值和索引号 +// Map map = new HashMap<>(); +// for (Element e : yList) { +// map.put(Integer.parseInt(e.attribute("idx").getValue()), e); +// } +// List list = new ArrayList<>(); +// for (int i = 0; i < xList.size(); i++) { +// list.add(map.getOrDefault(i, null)); +// } +// listObject.add(list); +// } +// +// +// //数据是按行读取的 +// for (int i = 0; i < listObject.size(); i++) { +// List row = new ArrayList<>(); +// List lo = (List) listObject.get(i); +// for (Element e : lo) { +// if (e == null) { +// row.add(null); +// } else { +// //如果x可以转为小数,那么需要保留两位小数,如果可以转换为整数,那么直接返回整数,如果是字符串,就不变 +// String x = null; +// try { +// x = e.element("v").getText(); +// double d = Double.parseDouble(x); +// if (d == (int) d) { +// x = String.valueOf((int) d); +// } else { +// x = String.format("%.2f", d); +// } +// } catch (Exception err) { +// //do nothing +// } +// row.add(x); +// } +// } +// matrix.add(row); +// } +// +// printTable(matrix); +// +// +// //上面生成的数据格式需要行转列,横坐标是年份,纵坐标是数据 +// int rowCount = matrix.size();// 计算行数和列数 +// int colCount = matrix.getFirst().size(); +// +// //System.out.println("行数:" + rowCount + " " + "列数:" + colCount); +// +// // 遍历每一列 +// for (int col = 0; col < colCount; col++) { +// // 创建一个新的内部列表,用于存储当前列的所有行 +// List column = new ArrayList<>(); +// // 遍历每一行,将当前列的值添加到新的内部列表中 +// for (int row = 0; row < rowCount; row++) { +// String x = matrix.get(row).get(col); +// +// column.add(x); +// } +// // 将当前列添加到结果列表中 +// transposed.add(column); +// } } } - -// printTable(transposed); - - // 在每一行的第一列插入年份 - for (int i = 0; i < transposed.size(); i++) { - List column = transposed.get(i); - column.addFirst(xList.get(i).element("v").getText()); // 在每行的开始插入序号 - } +// // 在每一行的第一列插入年份 +// for ( +// int i = 0; i < transposed.size(); i++) { +// List column = transposed.get(i); +// column.addFirst(xList.get(i).element("v").getText()); // 在每行的开始插入序号 +// } return transposed; } - }