[Java]POI组件的基本使用

发布于:2024-10-24 编辑:匿名 来源:网络

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 org.apache.poi poi < version>3.14 org.apache.poi poi-ooxml 3.14使用 POI 的目的使用POI就是用Java解析/操作Excel表格,实现Excel的导入/导出功能。

接下来我们看一下他们的实现代码以及注意事项。导出 导出操作是使用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 异常反射 生成对象时发生的异常*

  • InstantiationException
  • *
  • IllegalAccessException
  • *
  • InstantiationException
  • */ public static Workbook createExcel(List data,String type) throws Exception{ //生成工作簿实例对象基于类型参数 Workbook workbook = (Workbook) Class.forName(type).newInstance(); //这里也可以指定sheet的名称 //Sheetsheet = workbook.createSheet("sheetName");工作表=workbook.createSheet(); //限制列数 int cols = 10; int rows = data.size() / cols;整数索引=0; for (int rowNum = 0; rowNum < rows; rowNum++) { Row row =sheet.createRow(rowNum); } for (int colNum = 0; colNum < cols; colNum++) { Cell cell = row.createCell(colNum); cell.setCellValue(data.get(index++).toString());返回工作簿; } }调用时,我们生成数据并构造Workbook对象,然后调用Workbook的write(OutputStream stream)方法生成Excel文件代码语言:javascript copy List strings = new ArrayList<>(); for (int i = 0; i < ; i++) { strings.add(Integer.toString(i));}FileOutputStream out = new FileOutputStream( "F:\\testXSSF.xlsx");ExcelFactory.createExcel(strings," org.apache.poi.xssf.usermodel.XSSFWorkbook").write(out);out.close();生成结果: 问题上面的代码已经完成了简单的Excel文件生成操作,但是还存在一些问题没有得到解决。

    实际场景中,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;} 感悟 通过这次探索,我知道自己还有很多不足。我写代码的时候对效率、内存占用等考虑得太少了,这些问题你自己测试的时候是看不出来的。

    这些问题在你实际使用的时候就会暴露出来。比如某个操作可能会导致用户等待几十秒甚至几分钟,或者程序直接崩溃,那么以后还是要等。

    要小心,不要只知道如何使用这些工具。您应该尽可能深入地研究它们。

    道可以突然开悟,但事物却需要逐渐培养。

    [Java]POI组件的基本使用

    站长声明

    版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

    标签:

    相关文章

    • 科大讯飞:2020年营收突破130亿元,同比增长29.23%

      科大讯飞:2020年营收突破130亿元,同比增长29.23%

      4月19日晚,科大讯飞发布年度业绩报告及未经审计的第一季度业绩报告。 报告显示,2019年,科大讯飞营收突破亿元,同比增长29.23%;归属于上市公司股东的净利润13.64亿元,同比增长66.48%。 今年一季度,科大讯飞营收25.01亿元,同比增长77.55%。 净利润1.39亿元,去年同期净亏

      06-17

    • 【创业24小时】2022年10月18日

      【创业24小时】2022年10月18日

      投融资昨天,国内市场共发生16起投资披露事件,5起企业服务事件(imBee、正富软件、悠桦林、湘凯电、北大昆云)、4先进制造案例(天科新能源、微信半导体、中间信息、世禹精密)、医疗健康案例3例(清盈华康、创模生物、坤实生物)、汽车交通案例2例 一开始(兴通伦、艾拉比智

      06-17

    • IPO三高重拾:平均发行估值高达35.77倍

      IPO三高重拾:平均发行估值高达35.77倍

      《大众证券报》 统计显示,7月20只新股平均发行估值已触及35.77倍,较6月增长30%。   除了IPO估值大幅提升外,新股的“三高”,即超强的募资比例和高发行价也陡然增高。 数据显示,7月份20只新股平均超额资金比例达到93.44%,较5月份的54.56%水平大幅提升70%以上。 例如,2

      06-17

    • AI安防的“硬汉温柔”用人脸识别技术帮助寻亲

      AI安防的“硬汉温柔”用人脸识别技术帮助寻亲

      6月3日下午,在广州民政局指导下,嘉都科技携手羊城晚报、广州市慈善协会,和宝贝回家找孩子。 广州嘉都智能大厦联合举办“AI援助,把爱带回家”人工智能+慈善战略合作会,利用人工智能技术打造寻亲平台,帮助更多失散亲人找到回家的路。 羊城晚报集团党委书记、管委会主任刘

      06-18

    • O2O服务有上百种?一颗葡萄命就够了

      O2O服务有上百种?一颗葡萄命就够了

      今年一季度以来,O2O移动应用呈井喷式发展,从基本的衣食住行,到按摩、美容、健康等细分领域多维度发展。 不到两年的时间,这个行业突然出现了一片“红海”。 与普通的创业者不同,这片红海正是杨维全眼中的蓝海,也是葡萄生命的未来。 在昨天的GMIC全球O2O峰会上,葡萄生活

      06-18

    • 吴泳铭带头,阿里巴巴全军电商和云

      吴泳铭带头,阿里巴巴全军电商和云

      阿里巴巴首次出现一位集团CEO兼任两大核心业务CEO。 12月20日上午,阿里巴巴集团董事长与蔡崇信发布全体成员信,宣布阿里巴巴集团CEO、桃田集团董事长吴泳铭将兼任桃田集团CEO。 前桃田集团CEO戴珊卸任后,将协助集团成立阿里巴巴集团资产管理公司。 据36氪报道,昨天晚上在香

      06-17

    • 易佰科技完成数千万美元B轮融资 -王牌生态

      易佰科技完成数千万美元B轮融资 -王牌生态

      近日,医药营销技术(Pharma MarTech)综合解决方案提供商北京易佰科技有限公司(以下简称“易佰科技”)宣布完成数千万美元轮融资B轮融资,由汇美资本领投,KIP资本跟投。 本轮融资完成后,易佰科技将进一步加大技术研发投入,加速新业务拓展。 钟鼎资本参与了易佰科技2018

      06-18

    • 国内首支推动ESG体系建设公益基金成立

      国内首支推动ESG体系建设公益基金成立

      12月7日下午,中国社会文化发展基金会安安智慧慈善基金成立新闻发布会在多功能厅举行北京建国门外外交公寓大厅。 发布会上,该基金会常务副秘书长蒋晔深入解读了安安智慧慈善基金成立的历史背景和意义。 安安智慧慈善基金会专项基金管理委员会常务副主任陈光发布了基金会在丰

      06-18

    • 立足新发展阶段,构建芯片发展格局:2023中国集成电路制造年会暨供应链创新发展大会在广州盛大开幕

      立足新发展阶段,构建芯片发展格局:2023中国集成电路制造年会暨供应链创新发展大会在广州盛大开幕

      CICD 4月18日,中国半导体行业协会集成电路分会及配套产业分会,由中国集成电路封装测试创新联盟、装备创新联盟、材料创新联盟、元器件创新联盟、检验检测创新联盟、投资创新联盟、广东省集成电路行业协会、粤港澳大湾区主办大湾区半导体产业联盟等单位第25届中国集成电路制造

      06-06

    • 在Android手机上下载游戏有多难?

      在Android手机上下载游戏有多难?

      前段时间拿到了魅族刚刚推出的魅族18X。 搭载了今年的“真香”处理器高通骁龙,还配备了铜管+石墨散热层和Hz高刷新率。 这样的性能组合,怎么能不测试游戏呢?但当我打开魅族应用商店并搜索《原神》时,我发现没有这个应用程序。 顺便搜了一下许久的《哈利波特:魔法觉醒》,

      06-21

    • 与共享充电宝不同,耀铭科技完成3600万A轮融资

      与共享充电宝不同,耀铭科技完成3600万A轮融资

      据投资界2月3日消息,手机充电服务公司耀铭科技获得游族网络董事长A轮投资, CEO林奇金额为10000元。 今年10月,耀明科技获得1亿元天使轮融资。   耀明科技成立于2007年,是一家专注于智能手机充电服务业务的公司。 与共享充电宝的押金模式不同,耀明科技主打“新便捷”模

      06-18

    • Nike 首款官方 NFT 鞋款正式亮相,可结合药水改变“皮肤”

      Nike 首款官方 NFT 鞋款正式亮相,可结合药水改变“皮肤”

      这彩色图案是不是很眼熟?看着这个向日葵图案,虽然不知道是什么,但很多人肯定猜到一定和村上隆有关。 ▲图片来自:OpenSea 没错,这其实是村上隆与虚拟时尚品牌 RTFKT 在 OpenSea 平台上推出的一系列 NFT——“CLONE X”。 本系列大约有0个3D角色。 拥有这些NFT的用户可以在

      06-21