|
|
|
@ -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<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<Element> xList = new ArrayList<>();//横坐标,一般是年份
|
|
|
|
|
List<Element> children = root.element("chart").element("plotArea").elements();//工作区
|
|
|
|
|
|
|
|
|
|
for (Element child : children) {
|
|
|
|
|
//将CHART_TYPES数组转换为List
|
|
|
|
|
List<String> 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<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);
|
|
|
|
|
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<String> 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<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);
|
|
|
|
|
//
|
|
|
|
|
//
|
|
|
|
|
// //上面生成的数据格式需要行转列,横坐标是年份,纵坐标是数据
|
|
|
|
|
// 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);
|
|
|
|
|
column.addFirst(xList.get(i).element("v").getText()); // 在每行的开始插入序号
|
|
|
|
|
}
|
|
|
|
|
// // 在每一行的第一列插入年份
|
|
|
|
|
// for (
|
|
|
|
|
// int i = 0; i < transposed.size(); i++) {
|
|
|
|
|
// List<String> column = transposed.get(i);
|
|
|
|
|
// column.addFirst(xList.get(i).element("v").getText()); // 在每行的开始插入序号
|
|
|
|
|
// }
|
|
|
|
|
return transposed;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|