|
|
|
|
package com.dsideal.base.Tools;
|
|
|
|
|
|
|
|
|
|
import cn.hutool.poi.excel.ExcelReader;
|
|
|
|
|
import cn.hutool.poi.excel.ExcelUtil;
|
|
|
|
|
import cn.hutool.poi.excel.ExcelWriter;
|
|
|
|
|
|
|
|
|
|
import java.io.File;
|
|
|
|
|
import java.io.IOException;
|
|
|
|
|
import java.util.*;
|
|
|
|
|
|
|
|
|
|
import com.jfinal.plugin.activerecord.Record;
|
|
|
|
|
|
|
|
|
|
public class ConvertExcel {
|
|
|
|
|
// 获取系统的临时文件目录
|
|
|
|
|
private static final String tempDir = System.getProperty("java.io.tmpdir");
|
|
|
|
|
|
|
|
|
|
public static void main(String[] args) throws IOException {
|
|
|
|
|
String source = "D:\\dsWork\\dsProject\\dsBase\\src\\main\\java\\com\\dsideal\\base\\Tools\\Sample.xlsx";
|
|
|
|
|
File file = new File(source);
|
|
|
|
|
//哪些列是固定不动的,比如此处是第0列与第1列是不动的,就是年份+学段
|
|
|
|
|
List<Integer> fixedColumns = new ArrayList<>();
|
|
|
|
|
fixedColumns.add(0);
|
|
|
|
|
fixedColumns.add(1);
|
|
|
|
|
|
|
|
|
|
//每列的列号与列名对应关系
|
|
|
|
|
String[] colNames = new String[1024];
|
|
|
|
|
int cl = 0;
|
|
|
|
|
|
|
|
|
|
// 读取Excel数据
|
|
|
|
|
ExcelReader reader = ExcelUtil.getReader(file);
|
|
|
|
|
// 创建临时文件,文件名具有随机UUID,扩展名为.xlsx
|
|
|
|
|
|
|
|
|
|
//利用uuid生成一个临时文件名
|
|
|
|
|
String uuidFileName = UUID.randomUUID().toString().toUpperCase() + ".xlsx";
|
|
|
|
|
String output = tempDir + uuidFileName;
|
|
|
|
|
// 创建一个ExcelWriter对象,初始化时会创建一个空的Excel文件
|
|
|
|
|
ExcelWriter writer = ExcelUtil.getWriter(output);
|
|
|
|
|
//表头
|
|
|
|
|
List<List<Object>> read = reader.read(0, 0);//第0行是表头
|
|
|
|
|
for (int i = 0; i < reader.getColumnCount(); i++) {
|
|
|
|
|
colNames[cl++] = read.getFirst().get(i).toString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//数据
|
|
|
|
|
List<List<Object>> data = reader.read(1, reader.getRowCount());//从第1行读取到最后一行
|
|
|
|
|
for (List<Object> row : data) {
|
|
|
|
|
//拆分每一行的数据
|
|
|
|
|
for (int i = 0; i < reader.getColumnCount(); i++) {
|
|
|
|
|
if (!fixedColumns.contains(i)) {//非fixedColumns列进行枚举
|
|
|
|
|
|
|
|
|
|
List<String> rowData = new ArrayList<>();
|
|
|
|
|
//输出固定列的名称和值
|
|
|
|
|
for (int cNum : fixedColumns) {
|
|
|
|
|
String value = row.get(cNum).toString();//列值
|
|
|
|
|
rowData.add(value);
|
|
|
|
|
}
|
|
|
|
|
String cName = colNames[i];//列名
|
|
|
|
|
String value = row.get(i).toString();
|
|
|
|
|
rowData.add(cName);
|
|
|
|
|
rowData.add(value);
|
|
|
|
|
writer.writeRow(rowData);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
writer.flush();
|
|
|
|
|
writer.close();
|
|
|
|
|
reader.close();
|
|
|
|
|
|
|
|
|
|
/***************************************************************************************/
|
|
|
|
|
//上面的代码没动过,下面是新写的
|
|
|
|
|
reader = ExcelUtil.getReader(output);
|
|
|
|
|
//前面固定的
|
|
|
|
|
List<String> header = new ArrayList<>();
|
|
|
|
|
header.add("年份");
|
|
|
|
|
header.add("学段");
|
|
|
|
|
header.add("区域分类");
|
|
|
|
|
header.add("总量分类");
|
|
|
|
|
header.add("区域数值");
|
|
|
|
|
header.add("总量数值");
|
|
|
|
|
|
|
|
|
|
// 写入表头
|
|
|
|
|
uuidFileName = UUID.randomUUID().toString().toUpperCase() + ".xlsx";
|
|
|
|
|
output = tempDir + uuidFileName;
|
|
|
|
|
writer = ExcelUtil.getWriter(output);
|
|
|
|
|
writer.writeHeadRow(header);
|
|
|
|
|
|
|
|
|
|
//还需要继续扩展EXCEL模板,实现数据转换
|
|
|
|
|
Set<String> setArea = new HashSet<>();
|
|
|
|
|
setArea.add("城区");
|
|
|
|
|
setArea.add("镇区");
|
|
|
|
|
setArea.add("乡村");
|
|
|
|
|
|
|
|
|
|
List<List<String>> res = new ArrayList<>();
|
|
|
|
|
data = reader.read(1, reader.getRowCount());//从第1行读取到最后一行
|
|
|
|
|
for (List<Object> row : data) {
|
|
|
|
|
List<String> rowData = new ArrayList<>();
|
|
|
|
|
//输出固定列的名称和值
|
|
|
|
|
rowData.add(row.get(0).toString());//年度
|
|
|
|
|
rowData.add(row.get(1).toString());//学段
|
|
|
|
|
|
|
|
|
|
if (setArea.contains(row.get(2).toString())) {//如果是城区、镇区、乡村
|
|
|
|
|
rowData.add(row.get(2).toString());
|
|
|
|
|
rowData.add("");
|
|
|
|
|
rowData.add(row.get(3).toString());
|
|
|
|
|
rowData.add("");
|
|
|
|
|
} else {
|
|
|
|
|
rowData.add("");
|
|
|
|
|
rowData.add(row.get(2).toString());
|
|
|
|
|
rowData.add("");
|
|
|
|
|
rowData.add(row.get(3).toString());
|
|
|
|
|
}
|
|
|
|
|
res.add(rowData);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 排序
|
|
|
|
|
Collections.sort(res, new Comparator<List<String>>() {
|
|
|
|
|
@Override
|
|
|
|
|
public int compare(List<String> o1, List<String> o2) {
|
|
|
|
|
// 先比较年份
|
|
|
|
|
// int yearCompare = o1.get(0).compareTo(o2.get(0));
|
|
|
|
|
// if (yearCompare != 0) {
|
|
|
|
|
// return yearCompare;
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// 年份相同,比较学段
|
|
|
|
|
int stageCompare = o1.get(1).compareTo(o2.get(1));
|
|
|
|
|
if (stageCompare != 0) {
|
|
|
|
|
return stageCompare;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 学段相同,比较区域分类
|
|
|
|
|
int areaCompare = o1.get(2).compareTo(o2.get(2));
|
|
|
|
|
if (areaCompare != 0) {
|
|
|
|
|
return areaCompare;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 区域分类相同,比较总量分类
|
|
|
|
|
return o1.get(3).compareTo(o2.get(3));
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
for (List<String> re : res) {
|
|
|
|
|
writer.writeRow(re);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
reader.close();
|
|
|
|
|
writer.flush();
|
|
|
|
|
writer.close();
|
|
|
|
|
//打开文件所在目录,并聚焦文件
|
|
|
|
|
Runtime.getRuntime().exec("explorer.exe /e,/select," + output);
|
|
|
|
|
}
|
|
|
|
|
}
|