From 1ad8c63ddb46c59b623417188f4e7d8c55b3f2e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B5=B7?= <10402852@qq.com> Date: Fri, 3 Jan 2025 15:45:49 +0800 Subject: [PATCH] 'commit' --- Excel/幼儿入园.xlsx | Bin 0 -> 11452 bytes .../com/dsideal/base/Tools/ExportExcel.java | 121 +++++++++++++++++- src/main/resources/Sql/ExportExcel.sql | 117 +++++++++++++++-- 3 files changed, 224 insertions(+), 14 deletions(-) create mode 100644 Excel/幼儿入园.xlsx diff --git a/Excel/幼儿入园.xlsx b/Excel/幼儿入园.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..d3cbadc8d9a5d20ecdbbe59971e1a1fc7c0204ab GIT binary patch literal 11452 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

{*2fRaD@zzb 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 literal 0 HcmV?d00001 diff --git a/src/main/java/com/dsideal/base/Tools/ExportExcel.java b/src/main/java/com/dsideal/base/Tools/ExportExcel.java index c4026e69..2e6c0a57 100644 --- a/src/main/java/com/dsideal/base/Tools/ExportExcel.java +++ b/src/main/java/com/dsideal/base/Tools/ExportExcel.java @@ -4,20 +4,135 @@ import com.dsideal.base.Tools.Util.LocalMysqlConnectUtil; import com.jfinal.plugin.activerecord.Db; import com.jfinal.plugin.activerecord.Record; import com.jfinal.plugin.activerecord.SqlPara; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import java.io.FileOutputStream; import java.util.List; import static com.dsideal.base.DataEase.Model.DataEaseModel.DB_NAME; public class ExportExcel { + static String excelFileName = "D:\\dsWork\\YunNanDsBase\\Excel\\幼儿入园.xlsx"; + + public static void exportToExcel(List records, String filePath) { + try (Workbook workbook = new XSSFWorkbook()) { + Sheet sheet = workbook.createSheet("数据统计"); + + // 创建标题行样式 + CellStyle headerStyle = workbook.createCellStyle(); + // 设置边框 + headerStyle.setBorderTop(BorderStyle.THIN); + headerStyle.setBorderBottom(BorderStyle.THIN); + headerStyle.setBorderLeft(BorderStyle.THIN); + headerStyle.setBorderRight(BorderStyle.THIN); + // 设置背景色 + headerStyle.setFillForegroundColor(IndexedColors.LIGHT_BLUE.getIndex()); + headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + // 设置对齐方式 + headerStyle.setAlignment(HorizontalAlignment.CENTER); + headerStyle.setVerticalAlignment(VerticalAlignment.CENTER); + // 设置字体 + Font headerFont = workbook.createFont(); + headerFont.setBold(true); + headerFont.setFontName("黑体"); + headerFont.setFontHeightInPoints((short) 12); + headerStyle.setFont(headerFont); + + // 创建数据行样式 + CellStyle dataStyle = workbook.createCellStyle(); + // 设置边框 + dataStyle.setBorderTop(BorderStyle.THIN); + dataStyle.setBorderBottom(BorderStyle.THIN); + dataStyle.setBorderLeft(BorderStyle.THIN); + dataStyle.setBorderRight(BorderStyle.THIN); + // 设置背景色 + dataStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex()); + dataStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + // 设置对齐方式 + dataStyle.setAlignment(HorizontalAlignment.CENTER); + dataStyle.setVerticalAlignment(VerticalAlignment.CENTER); + + // 创建表头 + Row headerRow = sheet.createRow(0); + // 设置行高 + headerRow.setHeight((short) (28 * 20)); // 28像素 ≈ 28 * 20 缇 + 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); + cell.setCellValue(headers[i]); + cell.setCellStyle(headerStyle); + sheet.setColumnWidth(i, 3500); // 设置列宽 + } + + // 写入数据并处理合并单元格 + int rowNum = 1; + String lastDistrict = ""; + int mergeStartRow = 1; + + for (Record record : records) { + Row row = sheet.createRow(rowNum); + // 设置行高 + row.setHeight((short) (28 * 20)); // 28像素 ≈ 28 * 20 缇 + + String currentDistrict = record.getStr("行政区划"); + + // 填充数据 + for (int i = 0; i < headers.length; i++) { + Cell cell = row.createCell(i); + cell.setCellStyle(dataStyle); + + if (i == 0) { + cell.setCellValue(currentDistrict); + } else if (i == 1) { + cell.setCellValue(record.getStr("分类")); + } else { + Double value = record.getDouble(headers[i]); + if (value != null) { + cell.setCellValue(value); + } + } + } + + // 处理合并单元格 + if (!currentDistrict.equals(lastDistrict)) { + if (rowNum > mergeStartRow) { + // 合并行政区划列 + sheet.addMergedRegion(new CellRangeAddress( + mergeStartRow, rowNum - 1, 0, 0)); + } + mergeStartRow = rowNum; + } + + lastDistrict = currentDistrict; + rowNum++; + } + + // 处理最后一组合并 + if (rowNum > mergeStartRow) { + sheet.addMergedRegion(new CellRangeAddress( + mergeStartRow, rowNum - 1, 0, 0)); + sheet.addMergedRegion(new CellRangeAddress( + mergeStartRow, rowNum - 1, 1, 1)); + } + + // 保存文件 + try (FileOutputStream fileOut = new FileOutputStream(filePath)) { + workbook.write(fileOut); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } public static void main(String[] args) { LocalMysqlConnectUtil.Init(); SqlPara sqlPara = Db.getSqlPara("exportExcel.Xqry"); List list = Db.use(DB_NAME).find(sqlPara); - for (Record record : list) { - System.out.println(record); - } + exportToExcel(list, excelFileName); } } diff --git a/src/main/resources/Sql/ExportExcel.sql b/src/main/resources/Sql/ExportExcel.sql index d77778a7..6bf7989b 100644 --- a/src/main/resources/Sql/ExportExcel.sql +++ b/src/main/resources/Sql/ExportExcel.sql @@ -1,9 +1,10 @@ #namespace("exportExcel") -- 学前入园幼儿入园总量 #sql("Xqry") - (SELECT + -- 入园总量数据查询 + (SELECT 行政区划, - 上级行政区划, + '入园数' as 类型, '总入园数' as 分类, MAX(IF(年份 = 2023, 总量数值, NULL)) as '2023', MAX(IF(年份 = 2024, 总量数值, NULL)) as '2024', @@ -19,13 +20,13 @@ MAX(IF(年份 = 2034, 总量数值, NULL)) as '2034' FROM excel_学前幼儿入园总量_b25b1b09b0 WHERE 总量分类 = '总入园数' - GROUP BY 行政区划, 上级行政区划) + GROUP BY 行政区划) UNION ALL (SELECT 行政区划, - 上级行政区划, + '入园数' as 类型, '城区' as 分类, MAX(IF(年份 = 2023, 区域数值, NULL)) as '2023', MAX(IF(年份 = 2024, 区域数值, NULL)) as '2024', @@ -41,13 +42,13 @@ MAX(IF(年份 = 2034, 区域数值, NULL)) as '2034' FROM excel_学前幼儿入园总量_b25b1b09b0 WHERE 区域分类 = '城区' - GROUP BY 行政区划, 上级行政区划) + GROUP BY 行政区划) UNION ALL (SELECT 行政区划, - 上级行政区划, + '入园数' as 类型, '镇区' as 分类, MAX(IF(年份 = 2023, 区域数值, NULL)) as '2023', MAX(IF(年份 = 2024, 区域数值, NULL)) as '2024', @@ -63,13 +64,13 @@ MAX(IF(年份 = 2034, 区域数值, NULL)) as '2034' FROM excel_学前幼儿入园总量_b25b1b09b0 WHERE 区域分类 = '镇区' - GROUP BY 行政区划, 上级行政区划) + GROUP BY 行政区划) UNION ALL (SELECT 行政区划, - 上级行政区划, + '入园数' as 类型, '乡村' as 分类, MAX(IF(年份 = 2023, 区域数值, NULL)) as '2023', MAX(IF(年份 = 2024, 区域数值, NULL)) as '2024', @@ -85,14 +86,108 @@ MAX(IF(年份 = 2034, 区域数值, NULL)) as '2034' FROM excel_学前幼儿入园总量_b25b1b09b0 WHERE 区域分类 = '乡村' - GROUP BY 行政区划, 上级行政区划) + 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 行政区划) + + 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 行政区划) + + 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 行政区划) + + 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 上级行政区划, 行政区划, + ORDER BY 行政区划, + CASE 类型 + WHEN '入园数' THEN 1 + WHEN '在园数' THEN 2 + END, CASE 分类 WHEN '总入园数' THEN 1 + WHEN '总在园数' THEN 1 WHEN '城区' THEN 2 WHEN '镇区' THEN 3 WHEN '乡村' THEN 4 - END + END; #end #end \ No newline at end of file