diff --git a/Excel/幼儿入园.xlsx b/Excel/幼儿入园.xlsx index a544c5c9..f2ca5075 100644 Binary files a/Excel/幼儿入园.xlsx and b/Excel/幼儿入园.xlsx differ diff --git a/src/main/java/com/dsideal/base/Tools/ExportExcel.java b/src/main/java/com/dsideal/base/Tools/ExportExcel.java index f24cd9c4..66cb1699 100644 --- a/src/main/java/com/dsideal/base/Tools/ExportExcel.java +++ b/src/main/java/com/dsideal/base/Tools/ExportExcel.java @@ -59,7 +59,7 @@ public class ExportExcel { Row headerRow = sheet.createRow(0); // 设置行高 headerRow.setHeight((short) (28 * 20)); // 28像素 ≈ 28 * 20 缇 - String[] headers = {"行政区划", "分类", "2023", "2024", "2025", "2026", + String[] headers = {"行政区划", "年份", "年份", "2023", "2024", "2025", "2026", "2027", "2028", "2029", "2030", "2031", "2032", "2033", "2034"}; for (int i = 0; i < headers.length; i++) { Cell cell = headerRow.createCell(i); @@ -67,18 +67,20 @@ public class ExportExcel { cell.setCellStyle(headerStyle); sheet.setColumnWidth(i, 3500); // 设置列宽 } - - // 写入数据并处理合并单元格 +// 写入数据并处理合并单元格 int rowNum = 1; String lastDistrict = ""; - int mergeStartRow = 1; + String lastType = ""; + int districtMergeStartRow = 1; // 行政区划合并起始行 + int typeMergeStartRow = 1; // 类型合并起始行 for (Record record : records) { Row row = sheet.createRow(rowNum); // 设置行高 - row.setHeight((short) (28 * 20)); // 28像素 ≈ 28 * 20 缇 + row.setHeight((short) (28 * 20)); String currentDistrict = record.getStr("行政区划"); + String currentType = record.getStr("类型"); // 填充数据 for (int i = 0; i < headers.length; i++) { @@ -87,9 +89,14 @@ public class ExportExcel { if (i == 0) { cell.setCellValue(currentDistrict); - } else if (i == 1) { + } + else if (i == 1) { + cell.setCellValue(currentType); + } + else if (i == 2) { cell.setCellValue(record.getStr("分类")); - } else { + } + else { Double value = record.getDouble(headers[i]); if (value != null) { cell.setCellValue(value); @@ -97,26 +104,46 @@ public class ExportExcel { } } - // 处理合并单元格 + // 处理行政区划和类型的合并 if (!currentDistrict.equals(lastDistrict)) { - if (rowNum > mergeStartRow) { - // 合并行政区划列 + // 处理上一个行政区划的最后一组类型合并 + if (rowNum > typeMergeStartRow) { + sheet.addMergedRegion(new CellRangeAddress( + typeMergeStartRow, rowNum - 1, 1, 1)); + } + + // 处理行政区划合并 + if (rowNum > districtMergeStartRow) { + sheet.addMergedRegion(new CellRangeAddress( + districtMergeStartRow, rowNum - 1, 0, 0)); + } + districtMergeStartRow = rowNum; + typeMergeStartRow = rowNum; + } + // 在同一个行政区划内,处理类型的合并 + else if (!currentType.equals(lastType)) { + if (rowNum > typeMergeStartRow) { sheet.addMergedRegion(new CellRangeAddress( - mergeStartRow, rowNum - 1, 0, 0)); + typeMergeStartRow, rowNum - 1, 1, 1)); } - mergeStartRow = rowNum; + typeMergeStartRow = rowNum; } lastDistrict = currentDistrict; + lastType = currentType; rowNum++; } // 处理最后一组合并 - if (rowNum > mergeStartRow) { + // 先处理最后一组类型合并 + if (rowNum > typeMergeStartRow) { sheet.addMergedRegion(new CellRangeAddress( - mergeStartRow, rowNum - 1, 0, 0)); + typeMergeStartRow, rowNum - 1, 1, 1)); + } + // 再处理最后一组行政区划合并 + if (rowNum > districtMergeStartRow) { sheet.addMergedRegion(new CellRangeAddress( - mergeStartRow, rowNum - 1, 1, 1)); + districtMergeStartRow, rowNum - 1, 0, 0)); } // 保存文件 @@ -128,6 +155,7 @@ public class ExportExcel { e.printStackTrace(); } } + public static void main(String[] args) { LocalMysqlConnectUtil.Init(); diff --git a/src/main/resources/Sql/ExportExcel.sql b/src/main/resources/Sql/ExportExcel.sql index 6bf7989b..b632bf31 100644 --- a/src/main/resources/Sql/ExportExcel.sql +++ b/src/main/resources/Sql/ExportExcel.sql @@ -2,28 +2,6 @@ -- 学前入园幼儿入园总量 #sql("Xqry") -- 入园总量数据查询 - (SELECT - 行政区划, - '入园数' as 类型, - '总入园数' as 分类, - MAX(IF(年份 = 2023, 总量数值, NULL)) as '2023', - MAX(IF(年份 = 2024, 总量数值, NULL)) as '2024', - MAX(IF(年份 = 2025, 总量数值, NULL)) as '2025', - MAX(IF(年份 = 2026, 总量数值, NULL)) as '2026', - MAX(IF(年份 = 2027, 总量数值, NULL)) as '2027', - MAX(IF(年份 = 2028, 总量数值, NULL)) as '2028', - MAX(IF(年份 = 2029, 总量数值, NULL)) as '2029', - MAX(IF(年份 = 2030, 总量数值, NULL)) as '2030', - MAX(IF(年份 = 2031, 总量数值, NULL)) as '2031', - MAX(IF(年份 = 2032, 总量数值, NULL)) as '2032', - MAX(IF(年份 = 2033, 总量数值, NULL)) as '2033', - MAX(IF(年份 = 2034, 总量数值, NULL)) as '2034' - FROM excel_学前幼儿入园总量_b25b1b09b0 - WHERE 总量分类 = '总入园数' - GROUP BY 行政区划) - - UNION ALL - (SELECT 行政区划, '入园数' as 类型, @@ -90,11 +68,10 @@ UNION ALL - -- 在园总量数据查询 - (SELECT + (SELECT 行政区划, - '在园数' as 类型, - '总在园数' as 分类, + '入园数' as 类型, + '总数' as 分类, MAX(IF(年份 = 2023, 总量数值, NULL)) as '2023', MAX(IF(年份 = 2024, 总量数值, NULL)) as '2024', MAX(IF(年份 = 2025, 总量数值, NULL)) as '2025', @@ -107,15 +84,16 @@ MAX(IF(年份 = 2032, 总量数值, NULL)) as '2032', MAX(IF(年份 = 2033, 总量数值, NULL)) as '2033', MAX(IF(年份 = 2034, 总量数值, NULL)) as '2034' - FROM excel_学前幼儿在园总量_c04222fd74 - WHERE 总量分类 = '总在园数' + FROM excel_学前幼儿入园总量_b25b1b09b0 + WHERE 总量分类 = '总入园数' GROUP BY 行政区划) UNION ALL + -- 在园总量数据查询 (SELECT 行政区划, - '在园数' as 类型, + '在园幼儿数' as 类型, '城区' as 分类, MAX(IF(年份 = 2023, 区域数值, NULL)) as '2023', MAX(IF(年份 = 2024, 区域数值, NULL)) as '2024', @@ -137,7 +115,7 @@ (SELECT 行政区划, - '在园数' as 类型, + '在园幼儿数' as 类型, '镇区' as 分类, MAX(IF(年份 = 2023, 区域数值, NULL)) as '2023', MAX(IF(年份 = 2024, 区域数值, NULL)) as '2024', @@ -159,7 +137,7 @@ (SELECT 行政区划, - '在园数' as 类型, + '在园幼儿数' as 类型, '乡村' as 分类, MAX(IF(年份 = 2023, 区域数值, NULL)) as '2023', MAX(IF(年份 = 2024, 区域数值, NULL)) as '2024', @@ -175,6 +153,26 @@ MAX(IF(年份 = 2034, 区域数值, NULL)) as '2034' FROM excel_学前幼儿在园总量_c04222fd74 WHERE 区域分类 = '乡村' + GROUP BY 行政区划) + UNION ALL + (SELECT + 行政区划, + '在园幼儿数' as 类型, + '总数' as 分类, + MAX(IF(年份 = 2023, 总量数值, NULL)) as '2023', + MAX(IF(年份 = 2024, 总量数值, NULL)) as '2024', + MAX(IF(年份 = 2025, 总量数值, NULL)) as '2025', + MAX(IF(年份 = 2026, 总量数值, NULL)) as '2026', + MAX(IF(年份 = 2027, 总量数值, NULL)) as '2027', + MAX(IF(年份 = 2028, 总量数值, NULL)) as '2028', + MAX(IF(年份 = 2029, 总量数值, NULL)) as '2029', + MAX(IF(年份 = 2030, 总量数值, NULL)) as '2030', + MAX(IF(年份 = 2031, 总量数值, NULL)) as '2031', + MAX(IF(年份 = 2032, 总量数值, NULL)) as '2032', + MAX(IF(年份 = 2033, 总量数值, NULL)) as '2033', + MAX(IF(年份 = 2034, 总量数值, NULL)) as '2034' + FROM excel_学前幼儿在园总量_c04222fd74 + WHERE 总量分类 = '总在园数' GROUP BY 行政区划) ORDER BY 行政区划,