diff --git a/Doc/全省及州市县区人口与教育报告集20241023/16个州市报告2022/分析报告20240510/~$州人口变化及其对教育的影响20240424.docx b/Doc/全省及州市县区人口与教育报告集20241023/16个州市报告2022/分析报告20240510/~$州人口变化及其对教育的影响20240424.docx deleted file mode 100644 index ccdc7fd7..00000000 Binary files a/Doc/全省及州市县区人口与教育报告集20241023/16个州市报告2022/分析报告20240510/~$州人口变化及其对教育的影响20240424.docx and /dev/null differ diff --git a/Doc/全省及州市县区人口与教育报告集20241023/16个州市报告2022/分析报告20240510/丽江市人口变化及其对教育的影响20240418.docx b/Doc/全省及州市县区人口与教育报告集20241023/16个州市报告2022/分析报告20240510/丽江市人口变化及其对教育的影响20240418.docx index 9797f848..330bcd18 100644 Binary files a/Doc/全省及州市县区人口与教育报告集20241023/16个州市报告2022/分析报告20240510/丽江市人口变化及其对教育的影响20240418.docx and b/Doc/全省及州市县区人口与教育报告集20241023/16个州市报告2022/分析报告20240510/丽江市人口变化及其对教育的影响20240418.docx differ diff --git a/Doc/全省及州市县区人口与教育报告集20241023/16个州市报告2022/分析报告20240510/保山市人口变化及其对教育的影响20240507.docx b/Doc/全省及州市县区人口与教育报告集20241023/16个州市报告2022/分析报告20240510/保山市人口变化及其对教育的影响20240507.docx index 94c324c1..78633831 100644 Binary files a/Doc/全省及州市县区人口与教育报告集20241023/16个州市报告2022/分析报告20240510/保山市人口变化及其对教育的影响20240507.docx and b/Doc/全省及州市县区人口与教育报告集20241023/16个州市报告2022/分析报告20240510/保山市人口变化及其对教育的影响20240507.docx differ diff --git a/Doc/全省及州市县区人口与教育报告集20241023/16个州市报告2022/分析报告20240510/大理州人口变化及其对教育的影响20240424.docx b/Doc/全省及州市县区人口与教育报告集20241023/16个州市报告2022/分析报告20240510/大理州人口变化及其对教育的影响20240424.docx index 6eae0111..483afc32 100644 Binary files a/Doc/全省及州市县区人口与教育报告集20241023/16个州市报告2022/分析报告20240510/大理州人口变化及其对教育的影响20240424.docx and b/Doc/全省及州市县区人口与教育报告集20241023/16个州市报告2022/分析报告20240510/大理州人口变化及其对教育的影响20240424.docx differ diff --git a/Doc/全省及州市县区人口与教育报告集20241023/16个州市报告2022/分析报告20240510/德宏傣族景颇族自治州人口变化及其对教育的影响20240416.docx b/Doc/全省及州市县区人口与教育报告集20241023/16个州市报告2022/分析报告20240510/德宏傣族景颇族自治州人口变化及其对教育的影响20240416.docx index aa6a0cf8..8c05cea6 100644 Binary files a/Doc/全省及州市县区人口与教育报告集20241023/16个州市报告2022/分析报告20240510/德宏傣族景颇族自治州人口变化及其对教育的影响20240416.docx and b/Doc/全省及州市县区人口与教育报告集20241023/16个州市报告2022/分析报告20240510/德宏傣族景颇族自治州人口变化及其对教育的影响20240416.docx differ diff --git a/Doc/待处理/市/【9】总人口变化及预测-双/总人口变化及预测-双.xlsx b/Doc/待处理/市/【9】总人口变化及预测-双/总人口变化及预测-双.xlsx index b7383bcd..e69f8e05 100644 Binary files a/Doc/待处理/市/【9】总人口变化及预测-双/总人口变化及预测-双.xlsx and b/Doc/待处理/市/【9】总人口变化及预测-双/总人口变化及预测-双.xlsx differ diff --git a/src/main/java/com/dsideal/base/Tools/FillData/City/C9.java b/src/main/java/com/dsideal/base/Tools/FillData/City/C9.java index 78f04b0d..2566fa8d 100644 --- a/src/main/java/com/dsideal/base/Tools/FillData/City/C9.java +++ b/src/main/java/com/dsideal/base/Tools/FillData/City/C9.java @@ -28,43 +28,6 @@ public class C9 { //示例Excel static String sampleExcelPath = "D:\\dsWork\\YunNanDsBase\\Doc\\待处理\\市\\【9】总人口变化及预测-双\\总人口变化及预测-双.xlsx"; - /** - * 获取指定文档中指定图表数据 - * - * @param docPath 文档路径 - * @param chartNumber 图表序号 - * @param skipRowCount 跳过的行数 - * @return 结果数据 - * @throws IOException - * @throws InvalidFormatException - */ - public static List> getChartData(String docPath, int chartNumber, int skipRowCount, int expectLimit) throws IOException, InvalidFormatException, InterruptedException { - InputStream is = new FileInputStream(docPath); - ZipSecureFile.setMinInflateRatio(-1.0d); - XWPFDocument doc = new XWPFDocument(is); - //排序后的图表 - List charts = ExcelKit.getSortListForXWPFChart(doc.getCharts()); - XSSFWorkbook workbook = charts.get(chartNumber).getWorkbook(); - List> data = ExcelKit.readSheet(workbook, skipRowCount); - is.close(); - - //如果达到目标预期的数量,就直接返回poi获取的数据列表 - int totalRow = data.size() + skipRowCount; - if (totalRow < expectLimit) { - System.out.println("期望数量>=" + expectLimit + ",现在只有" + totalRow + "条,理解为POI读取WORD图表存在问题,使用python进行二次获取数据..."); - // 留出足够的com关闭word的时间长度,否则会有异常 - Thread.sleep(3000); - //否则调用python+com进行再次获取数据列表,这次获取的可能才是对的 - //写入交互文本文件 - ExcelKit.callPythonPrepare(docPath, chartNumber); - //对图表进行读取 - ExcelKit.callPythonRead(); - //读取生成的EXCEL,使用POI就可以了 - data = ExcelKit.readSheet(ExcelKit.excelPath, skipRowCount); - System.out.println("二次获取数据条目数量:" + data.size() + ",期望数量=" + expectLimit); - } - return data; - } public static void main(String[] args) throws IOException, InvalidFormatException, InterruptedException { //初始化数据库连接 @@ -104,14 +67,17 @@ public class C9 { System.out.println("正在处理" + cityName + "市州文件..."); //数据在图表1 int chartNumber = 1; - List> source = getChartData(file.getAbsolutePath(), chartNumber, 6, 20);//2017年开始 + //chartNumber:第几个图表 + //skipRowCount:跳过的行数,2017年开始,第一行是表头,第二行开始是2022,所以填写了跳过6行 + //expectLimit:期望的数据行数,首先用POI进行解析,如果获取的行数大于预期行数,就是正确的,否则就需要二次调用python进行读取 + List> source = ExcelKit.getChartData(file.getAbsolutePath(), chartNumber, 6, 20); //遍历source1 for (List r : source) { Row outRow = outSheet.createRow(++rowIndex); // 导出数据 //上级行政区划,行政区划,年份,总人口变化,总人口预测 - int year = Integer.parseInt(r.getFirst()); + int year = Integer.parseInt(r.getFirst().substring(0, 4)); double value = Double.parseDouble(r.get(1)); if (year <= 2023) { diff --git a/src/main/java/com/dsideal/base/Tools/FillData/ExcelKit/ExcelKit.java b/src/main/java/com/dsideal/base/Tools/FillData/ExcelKit/ExcelKit.java index 58eeab4d..77b8fe8a 100644 --- a/src/main/java/com/dsideal/base/Tools/FillData/ExcelKit/ExcelKit.java +++ b/src/main/java/com/dsideal/base/Tools/FillData/ExcelKit/ExcelKit.java @@ -2,16 +2,20 @@ package com.dsideal.base.Tools.FillData.ExcelKit; import com.dsideal.base.DataEase.Model.ExcelReader; import com.jfinal.kit.StrKit; +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 java.io.*; import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; public class ExcelKit { @@ -380,4 +384,104 @@ public class ExcelKit { writer.flush(); writer.close(); } + + /** + * 读取excel文件 + * @param excelFilePath + * @param skipRows + * @return + */ + public static List> readExcelToList(String excelFilePath, int skipRows) { + List> data = new ArrayList<>(); + try (FileInputStream inputStream = new FileInputStream(excelFilePath)) { + Workbook workbook = new XSSFWorkbook(inputStream); + Sheet sheet = workbook.getSheetAt(0); // 获取第一个Sheet + + // 创建一个迭代器来遍历行,跳过指定数量的行 + Iterator rowIterator = sheet.iterator(); + while (skipRows > 0 && rowIterator.hasNext()) { + rowIterator.next(); + skipRows--; + } + + // 遍历每一行 + while (rowIterator.hasNext()) { + Row row = rowIterator.next(); + List rowData = new ArrayList<>(); + // 遍历每一行中的每一列 + Iterator cellIterator = row.cellIterator(); + + while (cellIterator.hasNext()) { + Cell cell = cellIterator.next(); + // 根据单元格的不同类型获取数据 + switch (cell.getCellType()) { + case STRING: + rowData.add(cell.getStringCellValue()); + break; + case NUMERIC: + if (DateUtil.isCellDateFormatted(cell)) { + rowData.add(cell.getDateCellValue().toString()); + } else { + rowData.add(Double.toString(cell.getNumericCellValue())); + } + break; + case BOOLEAN: + rowData.add(Boolean.toString(cell.getBooleanCellValue())); + break; + case FORMULA: + rowData.add(cell.getCellFormula()); + break; + default: + rowData.add(""); + break; + } + } + data.add(rowData); + } + workbook.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return data; + } + + /** + * 获取指定文档中指定图表数据 + * + * @param docPath 文档路径 + * @param chartNumber 图表序号 + * @param skipRowCount 跳过的行数 + * @return 结果数据 + * @throws IOException + * @throws InvalidFormatException + */ + public static List> getChartData(String docPath, int chartNumber, int skipRowCount, int expectLimit) throws IOException, InvalidFormatException, InterruptedException { + InputStream is = new FileInputStream(docPath); + ZipSecureFile.setMinInflateRatio(-1.0d); + XWPFDocument doc = new XWPFDocument(is); + //排序后的图表 + List charts = ExcelKit.getSortListForXWPFChart(doc.getCharts()); + XSSFWorkbook workbook = charts.get(chartNumber).getWorkbook(); + List> data = ExcelKit.readSheet(workbook, skipRowCount); + is.close(); + + //如果达到目标预期的数量,就直接返回poi获取的数据列表 + int totalRow = data.size() + skipRowCount; + if (totalRow < expectLimit) { + System.out.println("期望数量>=" + expectLimit + ",现在只有" + totalRow + "条,理解为POI读取WORD图表存在问题,使用python进行二次获取数据..."); + // 留出足够的com关闭word的时间长度,否则会有异常 + Thread.sleep(4000); + //否则调用python+com进行再次获取数据列表,这次获取的可能才是对的 + //写入交互文本文件 + ExcelKit.callPythonPrepare(docPath, chartNumber); + //对图表进行读取 + ExcelKit.callPythonRead(); + //读取生成的EXCEL,使用POI就可以了 + //使用POI + int skipRows = 1; // 假设我们要跳过第一行 + data = ExcelKit.readExcelToList(ExcelKit.excelPath, skipRows); + System.out.println("二次获取数据条目数量:" + data.size() + ",期望数量=" + expectLimit); + } + return data; + } }