From 061445db0ff6829c6a07d3c706cf8bf73eeccf32 Mon Sep 17 00:00:00 2001 From: du <1725534722@qq.com> Date: Wed, 19 Mar 2025 09:34:21 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A8=E6=80=81=E5=AF=BC=E5=87=BAexcel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BasicInformationController.java | 174 +++++++++++++++++- .../ruoyi/gysl/entity/BasicInformation.java | 16 +- .../entity/response/ProjectBuildingExcel.java | 36 ++++ .../entity/response/ProjectExcelInfo.java | 54 ++++++ .../gysl/mapper/BasicInformationMapper.java | 10 + .../gysl/service/BasicInformationService.java | 28 +++ .../impl/BasicInformationServiceImpl.java | 138 +++++++++++++- .../mapper/BasicInformationMapper.xml | 59 ++++++ ruoyi-common/pom.xml | 6 +- .../com/ruoyi/common/annotation/Excel.java | 5 + .../common/utils/poi/ChangeExcelUtil.java | 124 +++++++++++++ 11 files changed, 640 insertions(+), 10 deletions(-) create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/response/ProjectBuildingExcel.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/response/ProjectExcelInfo.java create mode 100644 ruoyi-admin/src/main/resources/mapper/BasicInformationMapper.xml create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ChangeExcelUtil.java diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/BasicInformationController.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/BasicInformationController.java index 02c6084..47c2370 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/BasicInformationController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/BasicInformationController.java @@ -3,17 +3,27 @@ package com.ruoyi.gysl.controller; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.poi.ChangeExcelUtil; import com.ruoyi.gysl.entity.BasicInformation; +import com.ruoyi.gysl.entity.response.ProjectBuildingExcel; +import com.ruoyi.gysl.entity.response.ProjectExcelInfo; import com.ruoyi.gysl.service.BasicInformationService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.apache.poi.xssf.usermodel.*; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; import java.io.Serializable; -import java.util.List; +import java.lang.reflect.Field; +import java.net.URLEncoder; +import java.util.*; /** * 基本信息(BasicInformation)表控制层 @@ -92,5 +102,167 @@ public class BasicInformationController extends BaseController { public AjaxResult delete(@RequestParam("idList") List idList) { return success(this.basicInformationService.removeByIds(idList)); } + + /** + * 动态导出基本信息 + */ + @ApiOperation("动态导出基本信息") + @PostMapping("/exportInfo") + public void exportInfo(HttpServletResponse response, @RequestParam List idList) throws NoSuchFieldException, IOException, IllegalAccessException { + //获取对应的基本信息的列表 + List info = basicInformationService.selectList(idList); + System.out.println(info); + //excel 第一层单元格 + List yc = new ArrayList<>(); + //excel 第二层单元格 + List ec = new ArrayList<>(); + //excel 第三层单元格 + List sc = new ArrayList<>(); + //项目建筑信息数据所有字段数量 + int sczdData = 0; + //一共有几组厂房,不包括重复 + int cfsl = 0; + //动态存储每个分组对应的字段数量 + Map zdsl = new LinkedHashMap<>(); + Class clazz = ProjectExcelInfo.class; + Class classBuilding = ProjectBuildingExcel.class; + // 遍历除了建筑获取其他字段注解 + for (int i = 0; i < info.size(); i++) { + if (i == 0) { + for (Field field : clazz.getDeclaredFields()) { + Excel excelColumn = field.getAnnotation(Excel.class); + if (excelColumn != null) { + if (yc.contains(excelColumn.group())) { + yc.add(""); + } else { + yc.add(excelColumn.group()); + } + if ("id".equals(excelColumn.name())) { + sc.add(""); + } else { + sc.add(excelColumn.name()); + } + if (!Objects.equals(excelColumn.group(), "序号")) { + zdsl.merge(excelColumn.group(), 1, Integer::sum); + } + ec.add(""); + } + } + } + for (ProjectBuildingExcel xmjzxx : info.get(i).getXmjzxx()) { + switch (xmjzxx.getFloor()) { + case 1: + if(!ec.contains("一层厂房")){ + ec.add("一层厂房"); + cfsl+=1; + } + break; + case 2: + if(!ec.contains("双层厂房")){ + ec.add("双层厂房"); + cfsl+=1; + } + break; + case 3: + if(!ec.contains("三层厂房")){ + ec.add("三层厂房"); + cfsl+=1; + } + break; + case 4: + if(!ec.contains("四层厂房")){ + ec.add("四层厂房"); + cfsl+=1; + } + break; + case 5: + if(!ec.contains("五层厂房")){ + ec.add("五层厂房"); + cfsl+=1; + } + break; + default: + if(!ec.contains("六层及以上厂房")){ + ec.add("六层及以上厂房"); + cfsl+=1; + } + } + for (Field field : classBuilding.getDeclaredFields()) { + Excel excelColumn = field.getAnnotation(Excel.class); + if (excelColumn != null) { + if (!yc.contains("项目建筑信息")) { + yc.add("项目建筑信息"); + } else { + yc.add(""); + } + ec.add(""); + sc.add(excelColumn.name()); + sczdData+=1; + } + } + ec.remove(ec.size()-1); + } + } + //=======================sheet处理 + // 第一步,创建一个Workbook,对应一个Excel文件 + XSSFWorkbook wb = new XSSFWorkbook(); + // 第二步,在Workbook中添加一个sheet,对应Excel文件中的sheet + XSSFSheet sheet = wb.createSheet("sheet"); + // 第三步,设置样式以及字体样式 + XSSFCellStyle titleStyle = ChangeExcelUtil.createTitleCellStyle(wb); + XSSFCellStyle headerStyle = ChangeExcelUtil.createHeadCellStyle(wb); + XSSFCellStyle contentStyle = ChangeExcelUtil.createContentCellStyle(wb); + // 行号 + int rowNum = 0; + // 创建第一页的第一行,索引从0开始 + XSSFRow row0 = sheet.createRow(rowNum++); + row0.setHeight((short) 600);// 设置行高 + sheet.setColumnWidth(1, 6000); + sheet.setColumnWidth(2, 6000); + //第二行 + XSSFRow row1 = sheet.createRow(rowNum++); + row1.setHeight((short) 500); + //第三行 + XSSFRow row2 = sheet.createRow(rowNum++); + row2.setHeight((short) 1000); + //合并单元格:excel,除了项目建筑信息的其余字段数量,项目建筑信息数据所有字段数量,一共有几组厂房,不包括重复 + ChangeExcelUtil.extracted(sheet, zdsl,sczdData,cfsl); + + // 创建第一行单元格 + for (int i = 0; i < yc.size(); i++) { + XSSFCell c00 = row0.createCell(i); + c00.setCellValue(yc.get(i)); + c00.setCellStyle(headerStyle); + } + // 创建第二行单元格 + for (int i = 0; i < ec.size(); i++) { + XSSFCell tempCell = row1.createCell(i); + tempCell.setCellValue(ec.get(i)); + tempCell.setCellStyle(headerStyle); + } + // 创建第三行单元格 + for (int i = 0; i < sc.size(); i++) { + XSSFCell tempCell = row2.createCell(i); + tempCell.setCellValue(sc.get(i)); + tempCell.setCellStyle(headerStyle); + } + //填充数据 + basicInformationService.approvalMethodfillInData(sheet, contentStyle, rowNum, info,sc,ec,sczdData/cfsl); + + // 1. 设置响应头(必须) + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("UTF-8"); + // 设置文件名(解决中文乱码) + String fileName = URLEncoder.encode("项目信息.xlsx", "UTF-8"); + response.setHeader("Content-Disposition", "attachment; filename=" + fileName); + try (ServletOutputStream out = response.getOutputStream()) { + // 3. 将 Workbook 写入响应流 + wb.write(out); + out.flush(); + } finally { + wb.close(); + } + } + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/BasicInformation.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/BasicInformation.java index 6773952..b403892 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/BasicInformation.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/BasicInformation.java @@ -116,16 +116,20 @@ public class BasicInformation extends Model { //施工许可证发放时间 @ApiModelProperty("施工许可证发放时间") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") - @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private Date issuingTime; +// @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") +// @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String issuingTime; //竣工验收时间 @ApiModelProperty("竣工验收时间") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") - @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime acceptanceTime; +// @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") +// @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String acceptanceTime; + + //建设进度 + @ApiModelProperty("建设进度") + private String jsjd; //项目法人单位简介 @NotBlank diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/response/ProjectBuildingExcel.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/response/ProjectBuildingExcel.java new file mode 100644 index 0000000..e1551d4 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/response/ProjectBuildingExcel.java @@ -0,0 +1,36 @@ +package com.ruoyi.gysl.entity.response; + +import com.ruoyi.common.annotation.Excel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 项目基本信息对应的项目建筑信息 + * @author du + * @since 2025/3/17 9:38 + */ +@Data +public class ProjectBuildingExcel { + + @Excel(name = "层数",group = "项目建筑信息") + @ApiModelProperty(value = "层数") + private Integer floor; + + @Excel(name = "总建筑高度",group = "项目建筑信息") + @ApiModelProperty(value = "总建筑高度") + private BigDecimal totalBuildingHeight; + + @Excel(name = "首层高度",group = "项目建筑信息") + @ApiModelProperty(value = "首层高度") + private BigDecimal scgd; + + @Excel(name = "2至4层高",group = "项目建筑信息") + @ApiModelProperty(value = "2至4层高") + private BigDecimal twoAndFourCg; + + @Excel(name = "4层以上层高",group = "项目建筑信息") + @ApiModelProperty(value = "4层以上层高") + private BigDecimal fourYscg; +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/response/ProjectExcelInfo.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/response/ProjectExcelInfo.java new file mode 100644 index 0000000..df4e1fa --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/response/ProjectExcelInfo.java @@ -0,0 +1,54 @@ +package com.ruoyi.gysl.entity.response; + +import com.ruoyi.common.annotation.Excel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 项目导出信息 + * @author du + * @since 2025/3/14 14:01 + */ +@Data +public class ProjectExcelInfo { + + //--基本信息 + @Excel(name="id",group = "序号") + @ApiModelProperty("序号") + private String id; + + @Excel(name = "项目名称",group = "项目基础信息") + @ApiModelProperty("项目名称") + private String name; + + @Excel(name = "项目法人单位",group = "项目基础信息") + @ApiModelProperty("项目法人单位") + private String xmfrdwxz; + + @Excel(name = "项目法人单位性质",group = "项目基础信息") + @ApiModelProperty("项目法人单位性质") + private Integer nature; + + //--规划信息 + @Excel(name = "总用地面积",group = "项目规划信息") + @ApiModelProperty(value = "总用地面积") + private BigDecimal zydmj; + + @Excel(name = "容积率",group = "项目规划信息") + @ApiModelProperty(value = "容积率") + private BigDecimal rjl; + + @Excel(name = "总建筑面积",group = "项目规划信息") + @ApiModelProperty(value = "总建筑面积") + private BigDecimal zjzmj; + + @Excel(name = "标准层建筑面积",group = "项目规划信息") + @ApiModelProperty(value = "标准层建筑面积") + private BigDecimal bzcjzmj; + + //--建筑信息 + private List xmjzxx; +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/mapper/BasicInformationMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/mapper/BasicInformationMapper.java index 07b1f7f..14f4bf0 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/gysl/mapper/BasicInformationMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/mapper/BasicInformationMapper.java @@ -2,6 +2,12 @@ package com.ruoyi.gysl.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.gysl.entity.BasicInformation; +import com.ruoyi.gysl.entity.BuildingInformation; +import com.ruoyi.gysl.entity.response.ProjectBuildingExcel; +import com.ruoyi.gysl.entity.response.ProjectExcelInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * 基本信息(BasicInformation)表数据库访问层 @@ -11,5 +17,9 @@ import com.ruoyi.gysl.entity.BasicInformation; */ public interface BasicInformationMapper extends BaseMapper { + /** + * 根据基本信息的id列表来查找 + */ + List selectList(@Param("idList") List idList); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/BasicInformationService.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/BasicInformationService.java index ea32ce3..40610eb 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/BasicInformationService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/BasicInformationService.java @@ -2,6 +2,13 @@ package com.ruoyi.gysl.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.gysl.entity.BasicInformation; +import com.ruoyi.gysl.entity.response.ProjectBuildingExcel; +import com.ruoyi.gysl.entity.response.ProjectExcelInfo; +import org.apache.poi.xssf.usermodel.XSSFCellStyle; +import org.apache.poi.xssf.usermodel.XSSFSheet; + +import java.util.List; +import java.util.Map; /** * 基本信息(BasicInformation)表服务接口 @@ -11,5 +18,26 @@ import com.ruoyi.gysl.entity.BasicInformation; */ public interface BasicInformationService extends IService { + /** + * 根据基本信息的id列表来查找 + */ + List selectList(List idList); + + + + /** + * 填充数据 + */ + void approvalMethodfillInData(XSSFSheet sheet, XSSFCellStyle contentStyle, int rowNum, List info,List sc,List ec,int a) ; + + /** + * 项目基础信息获取 + */ + String getExcelData(ProjectExcelInfo item,String str); + + /** + * 项目建筑信息获取 + */ + String getBuildingData(ProjectBuildingExcel item,String str); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/BasicInformationServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/BasicInformationServiceImpl.java index 56f02a3..a89765f 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/BasicInformationServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/BasicInformationServiceImpl.java @@ -1,11 +1,22 @@ package com.ruoyi.gysl.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.ruoyi.gysl.mapper.BasicInformationMapper; +import com.ruoyi.common.annotation.Excel; import com.ruoyi.gysl.entity.BasicInformation; +import com.ruoyi.gysl.entity.response.ProjectBuildingExcel; +import com.ruoyi.gysl.entity.response.ProjectExcelInfo; +import com.ruoyi.gysl.mapper.BasicInformationMapper; import com.ruoyi.gysl.service.BasicInformationService; +import org.apache.poi.xssf.usermodel.XSSFCell; +import org.apache.poi.xssf.usermodel.XSSFCellStyle; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; import org.springframework.stereotype.Service; +import java.lang.reflect.Field; +import java.util.List; +import java.util.Objects; + /** * 基本信息(BasicInformation)表服务实现类 * @@ -15,5 +26,128 @@ import org.springframework.stereotype.Service; @Service("basicInformationService") public class BasicInformationServiceImpl extends ServiceImpl implements BasicInformationService { -} + /** + * 根据基本信息的id列表来查找 + */ + @Override + public List selectList(List idList) { + return baseMapper.selectList(idList); + } + + /** + * 填充数据 + */ + @Override + public void approvalMethodfillInData(XSSFSheet sheet, XSSFCellStyle contentStyle, int rowNum, List info, List sc, List ec, int num) { + Class classBuilding = ProjectBuildingExcel.class; + for (ProjectExcelInfo projectExcelInfo : info) { + XSSFRow tempRow = sheet.createRow(rowNum++); + tempRow.setHeight((short) 1400); + int i1; + for (i1 = 0; i1 < sc.size(); i1++) { + XSSFCell tempCell = tempRow.createCell(i1); + tempCell.setCellStyle(contentStyle); + if (!ec.get(i1).endsWith("厂房")) { + if (Objects.equals(sc.get(i1), "")) { + tempCell.setCellValue(projectExcelInfo.getId()); + } else { + tempCell.setCellValue(getExcelData(projectExcelInfo, sc.get(i1))); + } + } + } +// XSSFCell tempCell = tempRow.createCell(8); +// tempCell.setCellStyle(contentStyle); +// tempCell.setCellValue("12312321"); + + for (int i2 = 0; i2 < projectExcelInfo.getXmjzxx().size(); i2++) { + switch (projectExcelInfo.getXmjzxx().get(i2).getFloor()) { + case 1: + i1 = ec.indexOf("一层厂房"); + break; + case 2: + i1 = ec.indexOf("双层厂房"); + break; + case 3: + i1 = ec.indexOf("三层厂房"); + break; + case 4: + i1 = ec.indexOf("四层厂房"); + break; + case 5: + i1 = ec.indexOf("五层厂房"); + break; + default: + i1 = ec.indexOf("六层及以上厂房"); + } + for (Field field : classBuilding.getDeclaredFields()) { + XSSFCell tempCell = tempRow.createCell(i1); + tempCell.setCellStyle(contentStyle); + Excel excelColumn = field.getAnnotation(Excel.class); + if (excelColumn != null) { + tempCell.setCellValue(getBuildingData(projectExcelInfo.getXmjzxx().get(i2), sc.get(i1))); + i1++; + } + } + } + } + } + + @Override + public String getExcelData(ProjectExcelInfo item, String str) { + String a = null; + switch (str) { + case "": + a = item.getId() == null ? "-" : item.getId(); + break; + case "项目名称": + a = item.getName() == null ? "-" : item.getName(); + break; + case "项目法人单位": + a = item.getXmfrdwxz() == null ? "-" : item.getXmfrdwxz(); + break; + case "项目法人单位性质": + a = String.valueOf(item.getNature() == null ? "-" : item.getNature()); + break; + case "总用地面积": + a = String.valueOf(item.getZydmj() == null ? "-" : item.getZydmj()); + break; + case "容积率": + a = String.valueOf(item.getRjl() == null ? "-" : item.getRjl()); + break; + case "总建筑面积": + a = String.valueOf(item.getZjzmj() == null ? "-" : item.getZjzmj()); + break; + case "标准层建筑面积": + a = String.valueOf(item.getBzcjzmj() == null ? "-" : item.getBzcjzmj()); + break; + } + return a; + } + + /** + * 项目建筑信息获取 + */ + @Override + public String getBuildingData(ProjectBuildingExcel item, String str) { + String a = null; + switch (str) { + case "层数": + a = item.getFloor() == null ? "-" : String.valueOf(item.getFloor()); + break; + case "总建筑高度": + a = item.getTotalBuildingHeight() == null ? "-" : String.valueOf(item.getTotalBuildingHeight()); + break; + case "首层高度": + a = String.valueOf(item.getScgd() == null ? "-" : item.getScgd()); + break; + case "2至4层高": + a = String.valueOf(item.getTwoAndFourCg() == null ? "-" : item.getTwoAndFourCg()); + break; + case "4层以上层高": + a = String.valueOf(item.getFourYscg() == null ? "-" : item.getFourYscg()); + break; + } + return a; + } +} diff --git a/ruoyi-admin/src/main/resources/mapper/BasicInformationMapper.xml b/ruoyi-admin/src/main/resources/mapper/BasicInformationMapper.xml new file mode 100644 index 0000000..7c35ab9 --- /dev/null +++ b/ruoyi-admin/src/main/resources/mapper/BasicInformationMapper.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index f141c57..700c025 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -17,7 +17,11 @@ - + + org.apache.poi + poi-ooxml + 5.2.3 + com.baomidou mybatis-plus-boot-starter diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java index 765d8e3..f13271c 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java @@ -28,6 +28,11 @@ public @interface Excel */ public String name() default ""; + /** + * 导出到Excel中的分组. + */ + public String group() default ""; + /** * 日期格式, 如: yyyy-MM-dd */ diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ChangeExcelUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ChangeExcelUtil.java new file mode 100644 index 0000000..99aabd6 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ChangeExcelUtil.java @@ -0,0 +1,124 @@ +package com.ruoyi.common.utils.poi; + +import com.ruoyi.common.annotation.Excel; +import org.apache.poi.ss.usermodel.BorderStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.VerticalAlignment; +import org.apache.poi.ss.util.CellRangeAddress; +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 java.lang.reflect.Field; +import java.util.Map; + +/** + * Excel相关处理 + * + * @author dhy + */ +public class ChangeExcelUtil { + + + + + + public static void extracted(XSSFSheet sheet, Map s, int i,int jzxx) { + // todo: 合并参数分别为: 起始行,结束行,起始列,结束列 + sheet.addMergedRegion(new CellRangeAddress(0, 2, 0, 0)); + int startCol = 1; // 合并起始列 + int endCol = 0; + for (String key : s.keySet()) { + endCol = startCol + s.get(key) - 1; + sheet.addMergedRegion(new CellRangeAddress(0, 1, startCol, endCol)); + // 更新下一个开始列(当前结束列 + 1) + startCol = endCol + 1; + } + endCol+=1; + sheet.addMergedRegion(new CellRangeAddress(0, 0, endCol, endCol+i-1)); + int ehEndCol = 0; + for (int x = 0; x < jzxx; x++) { + ehEndCol = endCol + (i/jzxx) - 1; + sheet.addMergedRegion(new CellRangeAddress(1, 1, endCol, ehEndCol)); + endCol = ehEndCol+1; + } + } + + + /** + * 创建标题样式 + * + * @param wb + * @return + */ + public static XSSFCellStyle createTitleCellStyle(XSSFWorkbook wb) { + XSSFCellStyle cellStyle = wb.createCellStyle(); + cellStyle.setAlignment(HorizontalAlignment.CENTER);//水平居中 + cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直对齐 + cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); +// cellStyle.setFillForegroundColor(IndexedColors.GREY_40_PERCENT.getIndex());//背景颜色 + + XSSFFont headerFont1 = (XSSFFont) wb.createFont(); // 创建字体样式 + headerFont1.setBold(true); //字体加粗 + headerFont1.setFontName("黑体"); // 设置字体类型 + headerFont1.setFontHeightInPoints((short) 15); // 设置字体大小 + cellStyle.setFont(headerFont1); // 为标题样式设置字体样式 + return cellStyle; + } + + /** + * 创建表头样式 + * + * @param wb + * @return + */ + public static XSSFCellStyle createHeadCellStyle(XSSFWorkbook wb) { + XSSFCellStyle cellStyle = wb.createCellStyle(); + cellStyle.setWrapText(true);// 设置自动换行 +// cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());//背景颜色 + cellStyle.setAlignment(HorizontalAlignment.CENTER); //水平居中 + cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); //垂直对齐 + cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); +// cellStyle.setBottomBorderColor(IndexedColors.BLACK.index); + cellStyle.setBorderBottom(BorderStyle.THIN); //下边框 + cellStyle.setBorderLeft(BorderStyle.THIN); //左边框 + cellStyle.setBorderRight(BorderStyle.THIN); //右边框 + cellStyle.setBorderTop(BorderStyle.THIN); //上边框 + + XSSFFont headerFont = (XSSFFont) wb.createFont(); // 创建字体样式 + headerFont.setBold(true); //字体加粗 + headerFont.setFontName("黑体"); // 设置字体类型 + headerFont.setFontHeightInPoints((short) 12); // 设置字体大小 + cellStyle.setFont(headerFont); // 为标题样式设置字体样式 + + return cellStyle; + } + + /** + * 创建内容样式 + * + * @param wb + * @return + */ + public static XSSFCellStyle createContentCellStyle(XSSFWorkbook wb) { + XSSFCellStyle cellStyle = wb.createCellStyle(); + cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 垂直居中 + cellStyle.setAlignment(HorizontalAlignment.CENTER);// 水平居中 + cellStyle.setWrapText(true);// 设置自动换行 + cellStyle.setBorderBottom(BorderStyle.THIN); //下边框 + cellStyle.setBorderLeft(BorderStyle.THIN); //左边框 + cellStyle.setBorderRight(BorderStyle.THIN); //右边框 + cellStyle.setBorderTop(BorderStyle.THIN); //上边框 + + // 生成12号字体 + XSSFFont font = wb.createFont(); + font.setColor((short) 8); + font.setFontHeightInPoints((short) 12); + cellStyle.setFont(font); + + return cellStyle; + } + +}