main
黄海 8 months ago
parent 22177355bd
commit bbd8fe016e

@ -61,77 +61,7 @@ public class C7 {
String cityName = ru.getCityOrAreaName(file.getName());
String fileName = file.getName();
//判断是否为docx文件
if (fileName.endsWith(".docx") && !fileName.startsWith("~")) {
System.out.println("正在处理" + cityName + "市州文件...");
//读取文件
String inputUrl = file.getAbsolutePath();
InputStream is = new FileInputStream(inputUrl);
ZipSecureFile.setMinInflateRatio(-1.0d);
XWPFDocument doc = new XWPFDocument(is);
//排序后的图表
List<XWPFChart> charts = ExcelKit.getSortListForXWPFChart(doc.getCharts());
//1号模板数据在图表12和35中
int firstChartNumber = 12, secondChartNumber = 35;
XSSFWorkbook workbook = charts.get(firstChartNumber - 1).getWorkbook();
List<List<String>> source1 = ExcelKit.readSheet(workbook);
XSSFWorkbook workbook2 = charts.get(secondChartNumber - 1).getWorkbook();
List<List<String>> source2 = ExcelKit.readSheet(workbook2);
String c2 = "总在校生数";
//遍历source1
for (List<String> r : source1) {
Row outRow = outSheet.createRow(++rowIndex);
// 导出数据
//年份,总量分类,区域分类,总量数值,区域数值,行政区划,上级行政区划
ExcelKit.putData(outRow, new ArrayList<>(Arrays.asList(r.getFirst(), c2, "", r.get(4), "", cityName, "云南省")), dataStyle);
}
//遍历source2
for (int i = 0; i < source2.size(); i++) {
if (i == 0) continue;//跳过2022年这个年份重复了
List<String> r = source2.get(i);
Row outRow = outSheet.createRow(++rowIndex);
// 导出数据
//年份,总量分类,区域分类,总量数值,区域数值,行政区划,上级行政区划
ExcelKit.putData(outRow, new ArrayList<>(Arrays.asList(r.getFirst(), c2, "", r.get(4), "", cityName, "云南省")), dataStyle);
}
//2022年基数:遍历source2
for (int i = 0; i < source2.size(); i++) {
List<String> r = source2.get(i);
Row outRow = outSheet.createRow(++rowIndex);
// 导出数据
//年份,总量分类,区域分类,总量数值,区域数值,行政区划,上级行政区划
ExcelKit.putData(outRow, new ArrayList<>(Arrays.asList(r.getFirst(), "2022年基数", "", source2.getFirst().get(4),
"", cityName, "云南省")), dataStyle);
}
//城区+镇区+乡村
List<String> areaList = new ArrayList<>();
areaList.add("城区");
areaList.add("镇区");
areaList.add("乡村");
for (int k = 0; k < areaList.size(); k++) {
String areaName = areaList.get(k);
for (int i = 0; i < source1.size(); i++) {
List<String> r = source1.get(i);
Row outRow = outSheet.createRow(++rowIndex);
//年份,总量分类,区域分类,总量数值,区域数值,行政区划,上级行政区划
ExcelKit.putData(outRow, new ArrayList<>(Arrays.asList(r.getFirst(), "", areaName, "",
r.get(k + 1), cityName, "云南省")), dataStyle);
}
for (int i = 0; i < source2.size(); i++) {
if (i == 0) continue;
List<String> r = source2.get(i);
Row outRow = outSheet.createRow(++rowIndex);
//年份,总量分类,区域分类,总量数值,区域数值,行政区划,上级行政区划
ExcelKit.putData(outRow, new ArrayList<>(Arrays.asList(r.getFirst(), "", areaName, "",
r.get(k + 1), cityName, "云南省")), dataStyle);
}
}
}
}
}
//保存文件

@ -27,7 +27,7 @@ public class ExcelKit {
//删除旧的文件
ExcelKit.delExcel(sourceExcel);
sourceExcel = sourceExcel + "x";
System.out.println("源文件" + sourceExcel + "文件转换成功");
//System.out.println("源文件" + sourceExcel + "文件转换成功");
}
return sourceExcel;
}
@ -150,6 +150,9 @@ public class ExcelKit {
if (StrKit.isBlank(readCell(row.getCell(0)))) {
break;
}
if (readCell(row.getCell(0)).contains("说明")) {
break;
}
// 遍历行中的所有单元格
List<String> X = new ArrayList<>();
for (Cell cell : row) {

@ -1,15 +1,17 @@
package com.dsideal.base.Tools.FillData.City;
package com.dsideal.base.Tools.FillData.Test;
import cn.hutool.core.io.FileUtil;
import com.dsideal.base.Tools.FillData.ExcelKit.ExcelKit;
import com.dsideal.base.Tools.Util.LocalMysqlConnectUtil;
import com.dsideal.base.Tools.Util.ReadDocxUtil;
import com.jfinal.kit.StrKit;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import com.jfinal.plugin.activerecord.Record;
import java.io.File;
import java.io.IOException;
import java.util.*;
@ -19,7 +21,7 @@ public class C7_Test {
static String sampleExcelPath = "D:\\dsWork\\YunNanDsBase\\Doc\\待处理\\市\\【7】概览\\概览.xlsx";
//源文件
static String sourceExcel = "D:\\dsWork\\YunNanDsBase\\Doc\\待处理\\市\\【7】概览\\(昭通市)汇总表.xlsx";
static String parentPath = "D:\\dsWork\\YunNanDsBase\\Doc\\全省及州市县区人口与教育报告集20241023\\2023年数据更新表\\16州市数据更新表汇总20241021";
public static void main(String[] args) throws IOException, InvalidFormatException {
//初始化数据库连接
@ -27,14 +29,6 @@ public class C7_Test {
//实例化
ReadDocxUtil ru = new ReadDocxUtil();
//如果源文件或者示例文件是xls格式则转化为xlsx格式
sourceExcel = ExcelKit.ConvertXlsToXlsx(sourceExcel);
sampleExcelPath = ExcelKit.ConvertXlsToXlsx(sampleExcelPath);
//目标Excel,就是把文件名解析出来后,后面添加上【成果】,需要动态计算获取,不能写死
String excelPath = sampleExcelPath.replace(".xlsx", "【成果】.xlsx");
ExcelKit.delExcel(excelPath);
//结果Excel
XSSFWorkbook outWorkbook = new XSSFWorkbook();
//结果Sheet
@ -42,15 +36,14 @@ public class C7_Test {
//样式
XSSFCellStyle headerStyle = ExcelKit.getHeaderStyle(outWorkbook);
XSSFCellStyle dataStyle = ExcelKit.getDataStyle(outWorkbook);
//如果样例文件是xls格式则转化为xlsx格式
sampleExcelPath = ExcelKit.ConvertXlsToXlsx(sampleExcelPath);
//拷贝文件头
ExcelKit.CopyHead(sampleExcelPath, outSheet, headerStyle);
//1、用POI打开指定文件EXCEL获取它的最后一个有效数据行就是这个城市的整体数据汇总
List<List<String>> sheetList = ExcelKit.readSheet(sourceExcel, 4);
//最后一行的数据就是整个市州的数据
List<String> rowData = sheetList.getLast();
//目标Excel,就是把文件名解析出来后,后面添加上【成果】,需要动态计算获取,不能写死
String excelPath = sampleExcelPath.replace(".xlsx", "【成果】.xlsx");
ExcelKit.delExcel(excelPath);
/*
EXCELAIMap<String,String>key使 _,_
@ -126,11 +119,42 @@ public class C7_Test {
schoolData.put(grade + "_" + metric, value);
}
//开始填表
//找到parentPath下一级目录中所有文件
List<File> files = FileUtil.loopFiles(parentPath, file -> true);
int rowIndex = 0;
for (String s : a) {
for (String t : b) {
Row outRow = outSheet.createRow(++rowIndex);
ExcelKit.putData(outRow, Arrays.asList("昭通市", t,"2023",s, rowData.get(ExcelKit.transLetter2Num(schoolData.get(s + "_" + t))),"云南省"), dataStyle);
//处理这个目录
if (files != null) {
for (File file : files) {
//判断file是不是目录是目录的需要跳过
if (file.isDirectory()) continue;
//城市名称
String cityName = ru.getCityOrAreaName(file.getName());
if (StrKit.isBlank(cityName)) {
System.out.println("发现异常数据,请人工处理:" + file.getName());
System.exit(0);
}
System.out.println("正在进行" + cityName + "的数据填充~");
//如果源文件或者示例文件是xls格式则转化为xlsx格式
String sourceExcel = file.getAbsolutePath();
sourceExcel = ExcelKit.ConvertXlsToXlsx(sourceExcel);
//它的最后一个有效数据行,就是这个城市的整体数据汇总
List<List<String>> sheetList = ExcelKit.readSheet(sourceExcel, 4);//此表格有4行表头
//最后一行的数据就是整个市州的数据
List<String> rowData = sheetList.getLast();
for (String s : a) {
for (String t : b) {
Row outRow = outSheet.createRow(++rowIndex);
try {
ExcelKit.putData(outRow, Arrays.asList(cityName, t, "2023", s, rowData.get(ExcelKit.transLetter2Num(schoolData.get(s + "_" + t))), "云南省"), dataStyle);
} catch (Exception err) {
System.out.println("错误数据:");
System.out.println(rowData);
System.out.println(schoolData.get(s + "_" + t) + ":" + ExcelKit.transLetter2Num(schoolData.get(s + "_" + t)) + "找不到这一列!");
System.exit(0);
}
}
}
}
}
//保存文件
Loading…
Cancel
Save