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 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> read = reader.read(0, 0);//第0行是表头 for (int i = 0; i < reader.getColumnCount(); i++) { colNames[cl++] = read.getFirst().get(i).toString(); } //数据 List> data = reader.read(1, reader.getRowCount());//从第1行读取到最后一行 for (List row : data) { //拆分每一行的数据 for (int i = 0; i < reader.getColumnCount(); i++) { if (!fixedColumns.contains(i)) {//非fixedColumns列进行枚举 List 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 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 setArea = new HashSet<>(); setArea.add("城区"); setArea.add("镇区"); setArea.add("乡村"); List> res = new ArrayList<>(); data = reader.read(1, reader.getRowCount());//从第1行读取到最后一行 for (List row : data) { List 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>() { @Override public int compare(List o1, List 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 re : res) { writer.writeRow(re); } reader.close(); writer.flush(); writer.close(); //打开文件所在目录,并聚焦文件 Runtime.getRuntime().exec("explorer.exe /e,/select," + output); } }