科大讯飞:2020年营收突破130亿元,同比增长29.23%
06-17
Apache POI基本介绍 Apache POI是Apache软件基金会提供的一个开源库。支持Excel库的所有基本功能。
基本概念 POI 中,Workbook 代表 Excel 文件(工作簿),Sheet 代表 Workbook 中的表格,Row 代表 Sheet 中的行,Cell 代表单元格。 HSSFWorkbook对应于.xls文件,并且与Office97版本兼容。
XSSFWorkbook对应一个.xlsx文件,兼容Office及以上版本。在HSSFWorkbook中,Sheet接口的实现类是HSSFSheet,Row接口的实现类是HSSFRow,Cell接口的实现类是HSSFCell。
XSSFWorkbook中实现类的命名方法类似。只需在 Sheet、Row 和 Cell 前添加 XSSF 前缀即可。
引入依赖代码语言:javascript copy
接下来我们看一下他们的实现代码以及注意事项。导出 导出操作是使用Java将数据写入Excel中。
一个常见的场景是导出页面上的数据(可能是按条件查询)。这些数据可能是财务数据,也可能是产品数据,生成Excel后返回给用户。
下载文件。该操作主要涉及Excel的创建以及使用流输出的操作。
Excel的创建过程中,还可能涉及到单元格样式的操作。创建和导出导出操作的基础数据的第一步是创建 Excel 文件。
我们编写一个方法,其参数是要写入Excel表格的数据和Excel生成方法(HSSF、XSSF),返回一个Workbook接口对象。在方法内部,我们使用反射来创建 Workbook 的实例对象。
在代码探索阶段,我们首先将数据类型限制为List,将列数限制为一定数量,生成一张表。代码如下: 代码语言:javascript copy import org.apache.poi.ss.usermodel.Cell;导入 org.apache.poi.ss.usermodel.Row;导入 org.apache.poi.ss.usermodel.Sheet;导入组织。
apache.poi.ss.usermodel.Workbook;import java.util.List;/** * Excel工厂类,负责Workbook的生成和解析* * @author calmer * @since /12/5 11:19 */ public class ExcelFactory { /** * 构造一个 Workbook 对象。具体要实例化的对象由type参数指定 * @param data 要导出的数据 * @param type Excel生成方法 * @return type对应的工作簿实例对象 * @throws 异常反射 生成对象时发生的异常*
实际场景中,Excel表格中可能不会存储Integer、String等基本数据结构的数据,更多的可能是对象数据(JSON、List),需要一个表头,通过表头显示对象行对应的属性行(指数据库查询语句执行的结果)。并且表头的样式一定要控制好。
我们对方法中的 type 属性没有任何限制,即任何像“a”或“b”这样的无效值都可以从外部传递,程序会抛出异常。可以使用静态常量或者枚举类来限制它,从而提高代码的可读性和健壮性。
我不想在这里使用静态常量或枚举类。我打算用注解来控制参数的有效性。
改进我们发现了两个问题:之前的程序不能用于实际场景,我们需要对其进行改进,使其具备处理实际数据的能力。使用注释来限制参数的有效性。
我们先解决第二个问题,即参数的问题。首先创建一个使用注解限制参数的注解代码语言: javascript copy import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;/** * * @author calmer * @since /12/5 12:27 */@Retention(RetentionPolicy.SOURCE)public @interface ExcelType { String HSSF = "org.apache.poi.hssf.usermodel.HSSFWorkbook"; String XSSF = "org.apache.poi.xssf.usermodel.XSSFWorkbook";} 在方法参数中添加注解。
代码语言: javascript copy public static Workbook createExcel(List data, @ExcelType String type) throws Exception { //内容省略} 调用时的代码语言: javascript copy ExcelFactory.createExcel(list,ExcelType.HSSF)。写(出);关于使用注解限制参数取值范围的方法,我也偶尔见过,但是这种方法编译器不会给出任何提示。
我对注释了解不够。未来我还会有更多。
机会需要仔细研究。解决实际数据问题在实际应用中,我们有很多实体类是很常见的,比如Person、Product、Order等。
通过反射,我们可以获取任意实体类的属性列表和getter方法,所以目前,我计划使用Reflection来处理多个对象的Excel导出。首先,我们创建一个方法来获取对象的属性列表(暂时不考虑获取父类属性)。
代码语言:javascript copy/** * 获取对象的属性名数组* @param clazz 类对象,用于获取类的信息* @return 类的所有属性名数组*/private static String[] getFieldsName(Class clazz ){ Field[] fields = clazz.getDeclaredFields(); String[] fieldNames = new String[fields.length]; for (int i = 0; i < fields.length; i++) { fieldNames[i] = fields[i ].getName(); }然后我们改进createExcel()方法代码语言: javascript copy public static Workbook createExcel(List data, @ExcelType String type) throws Exception { if(data == null || data.size () == 0 ){ throw new Exception("数据不能为空"); } //根据类型生成工作簿 Workbook workbook = (Workbook) Class.forName(type).newInstance(); //创建一个新工作表 Sheet Sheet = workbook.createSheet(); //生成表头行 thead = Sheet.createRow(0); String[] fieldsName = getFieldsName(data.get(0).getClass()); for (int i = 0; i < fieldsName.length; i++) { Cell cell = thead.createCell(i); cell.setCellValue(fieldsName[i]);} //保存所有属性的getter方法名 Method[]methods = new Method[fieldsName.length]; for (int i = 0; i < data.size(); i++) { 行 row =sheet.createRow(i) ;对象 obj = data.get(i); for (int j = 0; j < fieldsName.length; j++) { //加载第一行数据时,初始化所有属性的getter方法 if(i == 0){ String fieldName = fieldsName[j]; } //处理布尔值命名 "isXxx" -> "setXxx" if (fieldName.contains("is")) { fieldName = fieldName.split("is")[1];方法 [j] = obj.getClass().getMethod("get" + fieldName.substring(0,1).toUpperCase() + fieldName.substring(1)); } 单元格 = row.createCell(j);对象值=methods[j].invoke(obj); //注意判断value是否为空 if(value == null){ value = "None";cell.setCellValue(value.toString()); } } return workbook;} 感悟 通过这次探索,我知道自己还有很多不足。我写代码的时候对效率、内存占用等考虑得太少了,这些问题你自己测试的时候是看不出来的。
这些问题在你实际使用的时候就会暴露出来。比如某个操作可能会导致用户等待几十秒甚至几分钟,或者程序直接崩溃,那么以后还是要等。
要小心,不要只知道如何使用这些工具。您应该尽可能深入地研究它们。
道可以突然开悟,但事物却需要逐渐培养。
版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
标签:
相关文章
06-17
06-17
06-18
06-18
06-17
06-18
06-18
06-21
06-18
最新文章
【玩转GPU】ControlNet初学者生存指南
【实战】获取小程序中用户的城市信息(附源码)
包雪雪简单介绍Vue.js:开学
Go进阶:使用Gin框架简单实现服务端渲染
线程池介绍及实际案例分享
JMeter 注释 18 - JMeter 常用配置组件介绍
基于Sentry的大数据权限解决方案
【云+社区年度征文集】GPE监控介绍及使用