main
黄海 8 months ago
parent d18ecaba83
commit 06f27ee01c

@ -4,14 +4,12 @@ import com.dsideal.base.DataEase.Model.ExcelReader;
import com.jfinal.kit.StrKit; import com.jfinal.kit.StrKit;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.openxml4j.util.ZipSecureFile;
import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFCellStyle; import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFFont; import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xwpf.usermodel.XWPFChart; import org.apache.poi.xwpf.usermodel.XWPFChart;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.dom4j.Document; import org.dom4j.Document;
import org.dom4j.DocumentException; import org.dom4j.DocumentException;
import org.dom4j.Element; import org.dom4j.Element;
@ -38,7 +36,6 @@ public class ExcelKit {
//删除旧的文件 //删除旧的文件
ExcelKit.delExcel(sourceExcel); ExcelKit.delExcel(sourceExcel);
sourceExcel = sourceExcel + "x"; sourceExcel = sourceExcel + "x";
//System.out.println("源文件" + sourceExcel + "文件转换成功");
} }
return sourceExcel; return sourceExcel;
} }
@ -483,8 +480,6 @@ public class ExcelKit {
dataList.remove(i); dataList.remove(i);
} }
} }
//printTable(dataList);
//System.out.println("===========================================");
return dataList; return dataList;
} }
@ -567,116 +562,111 @@ public class ExcelKit {
//将xml用IDEA打开搜索关键的数据值然后右键查看XPATH完整路径可以获取到下面的路径 //将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: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"};//折线,柱状 String[] CHART_TYPES = {"lineChart", "barChart"};//折线,柱状
// 创建一个一维列表,用于存储转换后的列 // 创建一个一维列表,用于存储转换后的列
List<List<String>> transposed = new ArrayList<>(); List<List<String>> transposed = new ArrayList<>();
List<Element> xList = new ArrayList<>();
List<Element> children = root.element("chart").element("plotArea").elements();
List<Object> listObject = new ArrayList<>(); List<Object> listObject = new ArrayList<>();
List<Element> xList = new ArrayList<>();//横坐标,一般是年份
List<Element> children = root.element("chart").element("plotArea").elements();//工作区
for (Element child : children) { for (Element child : children) {
//将CHART_TYPES数组转换为List //将CHART_TYPES数组转换为List
List<String> CHART_TYPES_LIST = Arrays.asList(CHART_TYPES); List<String> CHART_TYPES_LIST = Arrays.asList(CHART_TYPES);
if (CHART_TYPES_LIST.contains(child.getName())) { if (CHART_TYPES_LIST.contains(child.getName())) {//如果当前遍历到的子元素是折线图或者柱状图
transposed.clear(); System.out.println("找到图表类型:" + child.getName());
// 处理barChart或lineChart节点
//System.out.println("找到图表类型:" + child.getName());
String type = child.getName(); String type = child.getName();
Element q = root.element("chart"); Element ce = root.element("chart").element("plotArea").element(type);
q = q.element("plotArea");
q = q.element(type); System.out.println("Count=" + ce.elements("ser").size());
for (Element w : q.elements("ser")) { for (int m = 0; m < ce.elements("ser").size(); m++) {
q = w.element("cat"); Element ser = ce.elements("ser").get(m);
q = q.element("numRef"); Element cat = ser.element("cat");
Element p = q.element("f"); Element numRef = cat.element("numRef");
System.out.println(p.getText()); Element f = numRef.element("f");
System.out.println(f.getText());
q = q.element("numCache"); //Element numCache = numRef.element("numCache");
xList = q.elements("pt"); //xList = numCache.elements("pt");
//System.out.println(xList);
///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<Element> yList = ser.element("val").element("numRef").element("numCache").elements("pt");
//记录都有哪些有效数值和索引号
Map<Integer, Element> map = new HashMap<>();
for (Element e : yList) {
map.put(Integer.parseInt(e.attribute("idx").getValue()), e);
}
List<Object> 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<String> row = new ArrayList<>();
List<Element> lo = (List<Element>) 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); ///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<Element> yList = ser.element("val").element("numRef").element("numCache").elements("pt");
//上面生成的数据格式需要行转列,横坐标是年份,纵坐标是数据 //
int rowCount = matrix.size();// 计算行数和列数 // //记录都有哪些有效数值和索引号
int colCount = matrix.getFirst().size(); // Map<Integer, Element> map = new HashMap<>();
// for (Element e : yList) {
//System.out.println("行数:" + rowCount + " " + "列数:" + colCount); // map.put(Integer.parseInt(e.attribute("idx").getValue()), e);
// }
// 遍历每一列 // List<Object> list = new ArrayList<>();
for (int col = 0; col < colCount; col++) { // for (int i = 0; i < xList.size(); i++) {
// 创建一个新的内部列表,用于存储当前列的所有行 // list.add(map.getOrDefault(i, null));
List<String> column = new ArrayList<>(); // }
// 遍历每一行,将当前列的值添加到新的内部列表中 // listObject.add(list);
for (int row = 0; row < rowCount; row++) { // }
String x = matrix.get(row).get(col); //
//
column.add(x); // //数据是按行读取的
} // for (int i = 0; i < listObject.size(); i++) {
// 将当前列添加到结果列表中 // List<String> row = new ArrayList<>();
transposed.add(column); // List<Element> lo = (List<Element>) 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<String> 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<String> column = transposed.get(i);
for (int i = 0; i < transposed.size(); i++) { // column.addFirst(xList.get(i).element("v").getText()); // 在每行的开始插入序号
List<String> column = transposed.get(i); // }
column.addFirst(xList.get(i).element("v").getText()); // 在每行的开始插入序号
}
return transposed; return transposed;
} }
} }

Loading…
Cancel
Save