怎样做网站文件验证,厦门市集美区建设局网站,公司网站有收录没排名,精品网名poi导出excel模板——通过建造者模式策略模式函数式接口实现 poi导出excel示例优化思路代码实现补充建造者模式策略模式 poi导出excel示例
首先我们现看一下poi如何导出excel#xff0c;这里举个例子#xff1a;目前想要导出一个Mapsex,List信息#xff0c;sex作为… poi导出excel模板——通过建造者模式策略模式函数式接口实现 poi导出excel示例优化思路代码实现补充建造者模式策略模式 poi导出excel示例
首先我们现看一下poi如何导出excel这里举个例子目前想要导出一个Mapsex,List信息sex作为一个sheet页Person信息包含姓名、年龄、籍贯等在Person下还有一个List属性里面包含名称、时长等这里需要通过http的response导出文件
代码如下
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Map;public class ExcelExportExample {public static void exportToResponse(MapString, ListPerson data, HttpServletResponse response) {try {response.setContentType(application/vnd.openxmlformats-officedocument.spreadsheetml.sheet); // 对于.xlsx格式// 或者使用 response.setContentType(application/vnd.ms-excel); 对于.xls格式response.setHeader(Content-Disposition, attachment; filenameoutput.xlsx); // 文件名可以根据需要修改try (Workbook workbook new XSSFWorkbook()) { // 或者使用 HSSFWorkbook for .xls 格式for (Map.EntryString, ListPerson entry : data.entrySet()) {String sheetName entry.getKey();ListPerson personList entry.getValue();Sheet sheet workbook.createSheet(sheetName);// 创建表头行Row headerRow sheet.createRow(0);headerRow.createCell(0).setCellValue(Name);headerRow.createCell(1).setCellValue(Age);headerRow.createCell(2).setCellValue(Hometown);headerRow.createCell(3).setCellValue(Hobby Name);headerRow.createCell(4).setCellValue(Hobby Duration);int rowNum 1;for (Person person : personList) {Row row sheet.createRow(rowNum);// 填充 Person 基本信息Cell nameCell row.createCell(0);nameCell.setCellValue(person.getName());Cell ageCell row.createCell(1);ageCell.setCellValue(person.getAge());Cell hometownCell row.createCell(2);hometownCell.setCellValue(person.getHometown());// 填充 Hobby 列表int hobbyColNum 3;ListHobby hobbies person.getHobbies();for (Hobby hobby : hobbies) {Cell hobbyNameCell row.createCell(hobbyColNum);hobbyNameCell.setCellValue(hobby.getName());Cell hobbyDurationCell row.createCell(hobbyColNum);hobbyDurationCell.setCellValue(hobby.getDuration());}}}try (OutputStream out response.getOutputStream()) {workbook.write(out);} catch (IOException e) {e.printStackTrace();}}} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {// 创建一个示例的 Map每个 key 对应一个工作表(sheet)// 实际数据应根据业务需求和数据源进行设置// 示例中只包含了一个性别和一个 Person你需要填充实际数据MapString, ListPerson data createSampleData();// 获取 HttpServletResponse 对象并将数据导出到响应HttpServletResponse response getHttpServletResponse(); // 你需要自行实现获取 HttpServletResponse 对象的方式exportToResponse(data, response);}
优化思路
代码中可以看到创建工作簿、设置表头行、设置数据等操作都集中在一起耦合性较高。如果后面再增加设置样式、设置不同类型单元格的样式会全部集中到对workbook的操作上而workbook又在开始时就创建了。 如果将workbook的创建于数据填充进行解耦。并且将创建工作簿、设置表头行、设置数据等操作作为一个公有方法抽取出来可以供其他导出excel的业务进行使用。形成一个导出excel的公有类。 可以使用建造者模式策略模式进行设计
代码实现
这里代码通过贴图方式介绍 首先介绍一下包这里的样式形成一个策略接口并且有一个默认实现在strategy包下。然后是templete包这里是存放具体业务的模板比如有表头文字、属性映射等等包含具体样式实现。 然后是一个建造器用来构建workbook这也是主要代码。所有代码放到了一个xssf包下这里用到了excel2007的.xlsx格式的其实也可以增加excel97的.xls格式。
建造器代码如下
首先是workbook因为在构造方法是需要传入这个workbook并且是不可变对象所以设置为final。然后是将单元格样式设置为默认样式下面就是对不同操作的方法抽取分别有创建sheet设置样式设置表头、设置数据等当然也可以扩展比如设置列宽行高这些内容。在创建sheet中使用到了setActiveSheet方法这个让sheet创建后置为活动以后就对这个shee进行操作适合多sheet的表格文件。同时在后面的操作中也能获取到当前操作的sheet。 设置data这里因为不同业务的数据格式、操作是不同的因此没有通过参数方式直接传入数据而是提供了函数式接口让其在调用时能对当前这个sheet进行操作从而设置数据。同时也可以设置样式。
样式策略接口代码如下 这里只提供了列头样式和内容样式两个接口其实可以进行扩展比如指定sheet样式、行高、列宽等可以将这些功能都抽取出来用了修饰最终的workbook。 默认的样式策略实现如下这里较为简单就不做过多赘述。 具体使用 使用就比较简单了只需要创建出建造器我这里是有不同的sheet传入了不同的值。然后填充列头数据即可。 最后通过网络流导出使用try-resource释放流。
补充
建造者模式 建造者模式是一种创建型设计模式它用于构建复杂对象将对象的构建步骤解耦并提供更好的控制和可读性。这种模式通常适用于需要创建具有多个可选参数或配置选项的对象以确保对象构建过程灵活且易于理解。 举例就是springboot的启动的创建典型的示例是 SpringApplicationBuilder 类它用于创建 Spring Boot 应用程序的构建器 public class MySpringBootApp {public static void main(String[] args) {new SpringApplicationBuilder().sources(MySpringBootApp.class).bannerMode(Banner.Mode.CONSOLE).run(args);}
}
这样的创建型设计模式通常和行为型设计模式进行结合使用。
策略模式 策略模式是一种行为设计模式它允许在运行时选择算法或行为的不同实现。这种模式定义了一组算法将它们封装成独立的策略对象并使它们可以互相替换。策略模式有助于使算法的选择独立于使用它们的客户端。 举个例子 Spring Boot 源码中广泛使用了策略模式尤其在处理各种配置和扩展点时。一个典型的例子是 Spring Boot 的属性处理其中使用了多种策略来解析配置属性。 Spring Boot 中的属性解析机制是通过 org.springframework.boot.context.properties.ConfigurationProperties 注解来实现的它支持不同的属性源如 application.properties、application.yml、环境变量等和不同的解析策略。
ConfigurationProperties(myapp)
public class MyProperties {private String property1;private int property2;// 省略 getter 和 setter// 配置属性解析策略ConfigurationPropertiesBindingpublic static class MyPropertiesConverter implements ConverterString, MyProperties {Overridepublic MyProperties convert(String source) {// 解析配置属性并返回 MyProperties 对象// 这里可以根据不同的解析策略来处理属性的转换}}
}
在上述示例中我们使用了 ConfigurationProperties 注解来声明要处理的属性前缀myapp并定义了一个内部的属性解析策略类 MyPropertiesConverter它实现了 ConverterString, MyProperties 接口。
Spring Boot 的属性绑定机制将根据不同的属性源例如 application.properties 文件或环境变量自动选择相应的属性解析策略例如 MyPropertiesConverter并将属性值解析为 MyProperties 对象。