组件库学习—POI 和 EasyExcel

目前流行的操作 Excel 的第三方组件

easyExcel:阿里巴巴 java解析Excel工具,优化 POI, 不会出现内存溢出情况

常用场景

1、将数据导出为 Excel 表格,即导出数据

2、将 Excel 数据录入到数据库,即导入数据

Excel基本操作

导入 POI 组件依赖

   <!-- xls(03) --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.2</version></dependency><!-- xlsx(07) --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.2</version></dependency>
String PATH = "C:\\Users\\86159\\OneDrive\\文档\\Finance Support System\\需求理解\\订单\\";
/*** Excel 07版本* @throws Exception*/
@Test
public void testWrite07() throws Exception {// 1、创建一个工作簿Workbook workbook = new XSSFWorkbook();// 2、创建一个工作表Sheet sheet = workbook.createSheet("徐志摩散文诗集统计表");// 3、创建一个行(1, 1)Row row1 = sheet.createRow(0);// 4、创建一个单元格Cell cell11 = row1.createCell(0);cell11.setCellValue("陌上花开");Cell cell12 = row1.createCell(1);cell12.setCellValue("落叶");//第二行(2, 1)Row row2 = sheet.createRow(1);Cell cell21 = row2.createCell(0);cell21.setCellValue("最美的遇见");// 生成一张表 (IO 流) 07版本 文件后缀 xlsxFileOutputStream fileOutputStream = new FileOutputStream(PATH + "徐志摩散文诗集统计表07.xlsx");workbook.write(fileOutputStream);//关闭流fileOutputStream.close();System.out.println("徐志摩散文诗集统计表07 文件生成完毕");
}

注意:Excel 03版和07版对象的一个区别:文件后缀!

大数据量的写入

/*** Excel 07版本  大数据量写入* @throws Exception*/
@Test
public void testWrite07BigData() throws Exception {// 1、创建一个工作簿Workbook workbook = new XSSFWorkbook();// 2、创建一个工作表Sheet sheet = workbook.createSheet("志摩诗集07版");// 3、创建行for (int rowNum = 0; rowNum < 20; rowNum++ ) {Row row = sheet.createRow(rowNum);// 4、创建单元格for (int cellNum = 0; cellNum < 10; cellNum++) {Cell cell = row.createCell(cellNum);cell.setCellValue(cellNum);}}System.out.println("=======over======");// 生成一张表 (IO 流) 07版本 文件后缀 xlsxFileOutputStream fileOutputStream = new FileOutputStream(PATH + "志摩诗集07版.xls");workbook.write(fileOutputStream);//关闭流fileOutputStream.close();
}

注意:数据批量导入!

大文件写HSSF:

​ 缺点:做多只能处理65536行,否则会抛出异常

​ 优点:过程中写入缓存,不操作磁盘,最后一次性写入磁盘,速度快

大文件写XSSF:

​ 缺点:写数据时速度非常慢,非常耗内存,也会发生内存溢出,如100万条

​ 优点:可以写较大的数据量,如20万条

大文件写SXSSF:

​ 优点:可以写非常大的数据量,如100万条甚至更多条,占用更少的内存

​ 缺点:过程中会产生临时文件,需要清理临时文件

@Test
public void testSxssfBigData() throws Exception {// 1、创建一个工作簿Workbook workbook = new SXSSFWorkbook();// 2、创建一个工作表Sheet sheet = workbook.createSheet();// 3、创建一行for (int rowNum = 0; rowNum < 655367; rowNum++) {Row row = sheet.createRow(rowNum);// 4、创建单元格for (int cellNum = 0; cellNum < 10; cellNum++) {Cell cell = row.createCell(cellNum);cell.setCellValue(cellNum);}}// 生成一张表 07 文件后缀 xlsxFileOutputStream fileOutputStream = new FileOutputStream(PATH + "testSXSSF07.xlsx");workbook.write(fileOutputStream);// 新版的不需要代码调用清除临时文件了// 关闭流fileOutputStream.close();
}

Excel 基本操作

@Test
public void testRead03() throws Exception{// 获取文件流FileInputStream inputStream = new FileInputStream( PATH + "志摩诗集03版.xls");// 1、创建一个工作簿,Workbook workbook = new HSSFWorkbook(inputStream);// 2、得到表Sheet sheet = workbook.getSheetAt(0);// 3、得到行Row row = sheet.getRow(0);// 4、得到列Cell cell = row.getCell(0);//读取值的时候一定要注意类型  这里(0,0)是string类型,所以可以这样写System.out.println(cell.getStringCellValue());// 关闭流inputStream.close();
}

难点—读取不同类型的数据

     @Testpublic void testRead07() throws Exception{// 获取文件流FileInputStream inputStream = new FileInputStream( PATH + "副本RD 21M12 PO项目.xlsx");// 1、创建一个工作簿,Workbook workbook = new XSSFWorkbook(inputStream);// 2、得到表Sheet sheet = workbook.getSheetAt(1);// 3、获取标题内容Row rowTitle = sheet.getRow(0);// 4、得到列if(rowTitle != null){// 计数int cellCount = rowTitle.getPhysicalNumberOfCells();for (int cellNum = 0; cellNum < cellCount; cellNum++) {Cell cell = rowTitle.getCell(cellNum);if(cell != null){CellType cellType = cell.getCellType();String cellValue = cell.getStringCellValue();System.out.print(cellValue + " | ");}}}System.out.println();//读取值的时候一定要注意类型//获取表中的内容DataFormatter dataFormatter = new DataFormatter();int rowCount = sheet.getPhysicalNumberOfRows();for (int rowNum = 1; rowNum < rowCount; rowNum++) {Row rowData = sheet.getRow(rowNum);if(rowData != null){// 读取列int cellCount = rowTitle.getPhysicalNumberOfCells();for (int cellNum = 0; cellNum < cellCount; cellNum++) {System.out.print("[" + (rowNum+1) + "-" + (cellNum+1) + "]");Cell cell = rowData.getCell(cellNum);//匹配列的数据类型if(cell!=null){//获取单元格值 方法一 将数据类型都转换为string类型:
//                        CellType cellType = cell.getCellType();
//                        cell.setCellType(CellType.STRING);//获取单元格值 方法二:
//                        dataFormatter.formatCellValue(cell);System.out.println( dataFormatter.formatCellValue(cell));}}}}inputStream.close();}

了解—计算公式

@Test
public void testFormula() throws Exception {FileInputStream fileInputStream = new FileInputStream(PATH + "test07.xlsx");Workbook workbook = new XSSFWorkbook(fileInputStream);Sheet sheet = workbook.getSheetAt(0);//(0,4)单元格有求和公式Row row = sheet.getRow(0);Cell cell = row.getCell(4);//拿到计算公式FormulaEvaluator formulaEvaluator = new XSSFFormulaEvaluator((XSSFWorkbook) workbook);//输出单元格内容String formula = cell.getCellFormula();System.out.println(formula);//计算CellValue evaluate = formulaEvaluator.evaluate(cell);String cellValue = evaluate.formatAsString();System.out.println(cellValue);
}

EasyExcel 的使用

导入依赖

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version>  <!--目前底层使用的是4.1版本的POI-->
</dependency>

写入测试

//最简单的写的对象
@Data
public class DemoData {@ExcelProperty("字符串标题")private String string;@ExcelProperty("日期标题")private Date date;@ExcelProperty("数字标题")private Double doubleData;/*** 忽略这个字段*/@ExcelIgnoreprivate String ignore;
}
// 通过数据生成,后面不需要重复写
private List<DemoData> data() {List<DemoData> list = ListUtils.newArrayList();for (int i = 0; i < 10; i++) {DemoData data = new DemoData();data.setString("字符串" + i);data.setDate(new Date());data.setDoubleData(0.56);list.add(data);}return list;
}
//最简单的写入操作
@Test
public void indexWrite() {String fileName = PATH + "EasyTest.xlsx";// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data());
}

小结

发现组件库学习还挺有趣的,有不足的地方希望大家多多批评指正呀,嘻嘻嘻

快速搞定---POI 和 EasyExcel相关推荐

  1. bootstraptable导出excel独立使用_JavaWeb系列之-一小时搞定POI导出Excel

    课程简介: 课程目标:通过本视频,可以在一小时之内快速实现使用Apache POI组件导出excel,您是不是项目中用到这个功能了,是不是懒得从网上查代码改代码呢?这个简短的小视频适合您. 适用人群: ...

  2. 教你一招超级简单的方法快速搞定grub.conf文件的丢失及损坏

    教你一招超级简单的方法快速搞定grub.conf文件的丢失及损坏 实验环境: GRUB是大多数Linux系统默认使用的引导程序,当"/boot/grub/grub.conf"配置文 ...

  3. 一行代码快速搞定Flowable断点下载(下)

    一行代码快速搞定Flowable断点下载(下) 其实这个主题对应的三篇文章真的真的非常难写,首先是感觉非常多人对于函数式编程不太熟悉,然后又有一些人对于kotlin不太熟悉.这就导致了,写这三篇文章的 ...

  4. 一行代码快速搞定Flowable断点下载(中)

    一行代码快速搞定Flowable断点下载(中) 感觉上一篇家常聊了太多,这一篇就直接进入正题,首先来看一下,通过存储化以及方法拓展技术将mComposableDisposable的相关逻辑也从抽象Ac ...

  5. 一行代码快速搞定Flowable断点下载(上)

    一行代码快速搞定Flowable断点下载(上) 之前我们大致讲了讲,到底怎么完全将disposable相关代码完全隐藏. 然后到了这里,可能有些杠精就会说了,你那个方式,我们不是完全不能拿到Flowa ...

  6. 白话经典算法系列之六 快速排序 快速搞定

    快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个 ...

  7. 怎么做95置信区间图_这种动态的OD图怎么做?简单3步快速搞定

    之前在视频号中发过一个单车的出行数据可视化效果. 动态展示了某天单车不同时段的运行情况,这种动态的OD可视化效果是如何制作的呢?使用的是kepler.gl进行制作的,其实非常简单,3步即可快速搞定. ...

  8. 【转载】白话经典算法系列之六 快速排序 快速搞定

    原文地址:http://blog.csdn.net/morewindows/article/details/6684558 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经 ...

  9. 水墨特效怎么做?两种方法快速搞定!大神都在用的超美视频画面效果

    想在视频里用高大上的水墨特效,却不知道怎么做?一般做这种唯美好看的效果,在一些特效软件里需要自己去设计.渲染,这一步就难倒了很多新手.那像视频大神一样的水墨特效就没办法制作了吗? 今天就教大家快速搞定 ...

最新文章

  1. jquery autocomplete实现solr查询字段自动填充并执行查询
  2. Mybatis批量添加对象List
  3. 无法显示服务器级别,URL Rewrite会导致“无法显示此页面”
  4. Linux下jetty报java.lang.OutOfMemoryError: PermGen space及Jetty内存配置调优解决方案
  5. C语言“fread”函数的用法?
  6. JavaScript实现职责链模式
  7. 大数据之旅--Hadoop的发展史
  8. noip2017初赛的一些知识点
  9. html打印代码_惊呆了,我的 Python 代码里面出现了薛定谔的 Bug
  10. 索尼android 8,索尼宣布Android 8.0升级名单 Z系列被抛弃
  11. linux输入yum后提示: -bash: /usr/bin/yum: No such file or directory的解决方案
  12. AS3的事件模型 .
  13. Ansible Loops
  14. 学生管理系统总结收获——限制字符
  15. 国产操作系统要起来?自主银河麒麟V10发布!
  16. 给你看个宝贝:GitHub 最野的开源库,把你拿捏的死死的。。。
  17. 手机里tencent文件夹能删吗_手机上的文件夹能不能删?看完之后秒懂
  18. 如何用 Python 实现 QQ 消息自动回复?
  19. linux传不上去文件,linux下上传文件,文件上传不上去
  20. sqlserver 人名_SQLserver运维必备:T-SQL语句练习

热门文章

  1. 全国青少年软件编程等级考试标准 (预备级)
  2. 新鲜出炉: IE8 beta1 的下载地址以及官方论坛
  3. 【面试复盘】Momenta视觉算法实习生一面
  4. 【算法:数学】计算几何-多边形的重心
  5. 晋升职称服务器协议,职称晋升服务期协议-常州大学.DOC
  6. 江西计算机破格晋升中级职称,中级职称可以破格晋升的条件
  7. SQLServer数据库还原常用问题的解决方案
  8. STM32学习总结之启动文件
  9. 3DUnity编程与设计_HW7
  10. matlab薄板样条函数,薄板样条函数(Thin plate splines)的讨论与分析