You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

152 lines
5.8 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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);
}
}