excel的poi和EasyExcel的基本读写
java操作excel的读写操作
- excel详情
- excel中的属性
- 03版本
- 07版本excel
- POI
- easyExcel
- 读和写
excel详情
excel中的属性
1、工作簿:一个excel就是一个工作簿workbook
2、工作表:就是一个sheet,一个工作簿可以有多个工作表
3、行:row
4、列:cell
根据属性创建对象
03版本
行数:65536行,
java对象:HSSFWorkbook();
后缀名:xls
优点:过程写入缓存,不操作磁盘,最后一次写入磁盘,速度快
07版本excel
07:
行数:无限行,
java对象:XSSFWorkbook();
后缀名:xls
优点:可以写较大的数据量,如20万条
缺点:写数据慢,耗内存,也会发生内存溢出,如100万条
POI
依赖
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.9</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.9</version></dependency><dependency><groupId>joda-time</groupId><artifactId>joda-time</artifactId><version>2.10.1</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.0</version></dependency>
公共路径
String Path = "E:\\study\\com.kuang\\";
在excel中写入一行数据,注意,excel中的第一行第一列在代码中都是以0开头
== 03版本==
@Testpublic void testWrite03() throws Exception {//创建一个工作簿Workbook workbook = new HSSFWorkbook();//创建一个工作表Sheet sheet = workbook.createSheet("联系03年表格");//创建一个行Row row1 = sheet.createRow(0);//创建一个单元格Cell cell1 = row1.createCell(0);cell1.setCellValue("第一行一列");Cell cell2 = row1.createCell(1);cell2.setCellValue(666);Row row2 = sheet.createRow(1);Cell cell21 = row2.createCell(0);cell21.setCellValue("统计时间");Cell cell22 = row2.createCell(1);//(22)cell22.setCellValue(new DateTime().toString("yyy-MM-dd HH:mm:ss"));//生成一张表(io流)03版本就是使用xml结尾FileOutputStream outputStream = new FileOutputStream(Path + "苏阳联系poi.xls");workbook.write(outputStream);outputStream.close();System.out.println("完毕");}
写入多条数据
@Testpublic void testWrite03BigData() throws Exception {//当前时间long begin = System.currentTimeMillis();//创建一个工作簿Workbook workbook = new HSSFWorkbook();//创建表Sheet sheet = workbook.createSheet();//写入数据for (int rowNum=0;rowNum < 65536; rowNum++){Row row = sheet.createRow(rowNum);for(int cellNum = 0;cellNum <10;cellNum++){Cell cell = row.createCell(cellNum);cell.setCellValue(cellNum);}}FileOutputStream outputStream =new FileOutputStream(Path+"TestWrite03数据.xls");workbook.write(outputStream);outputStream.close();//写完时间long end = System.currentTimeMillis();System.out.println((double)(end-begin)/1000);}
07版本
写入少量数据
@Testpublic void testWrite07() throws Exception {//创建一个工作簿Workbook workbook = new XSSFWorkbook();//创建一个工作表Sheet sheet = workbook.createSheet("联系07年表格");//创建一个行Row row1 = sheet.createRow(0);//创建一个单元格Cell cell1 = row1.createCell(0);cell1.setCellValue("第一行一列");Cell cell2 = row1.createCell(1);cell2.setCellValue(666);Row row2 = sheet.createRow(1);Cell cell21 = row2.createCell(0);cell21.setCellValue("统计时间");Cell cell22 = row2.createCell(1);//(22)cell22.setCellValue(new DateTime().toString("yyy-MM-dd HH:mm:ss"));//生成一张表(io流)03版本就是使用xml结尾FileOutputStream outputStream = new FileOutputStream(Path + "苏阳联系poi07.xlsx");workbook.write(outputStream);outputStream.close();System.out.println("完毕");}
写入多条数据
//耗时太长//优化@Testpublic void testWrite07BigData() throws Exception {//当前时间long begin = System.currentTimeMillis();//创建一个工作簿Workbook workbook = new XSSFWorkbook();//创建表Sheet sheet = workbook.createSheet();//写入数据for (int rowNum=0;rowNum < 100000; rowNum++){Row row = sheet.createRow(rowNum);for(int cellNum = 0;cellNum <10;cellNum++){Cell cell = row.createCell(cellNum);cell.setCellValue(cellNum);}}FileOutputStream outputStream =new FileOutputStream(Path+"TestWrite07数据.xlsx");workbook.write(outputStream);outputStream.close();//写完时间long end = System.currentTimeMillis();System.out.println((double)(end-begin)/1000);}
因为多条数据导致耗时太长的情况,就需要我们进行优化,也就是SXSSF类
07优化对象
SXSSF,可以写非常大的数据量,如100万条甚至更多条,写数据速度快,占用更少的内存
默认100条记录放入内存,如果超过100条记录,将会先将前100条数据放入数据
会产生临时文件,需要在关闭流后写((SXSSFWorkbook) workbook).dispose();代码清除临时文件
@Testpublic void testWrite07BigDatas() throws Exception {//当前时间long begin = System.currentTimeMillis();//创建一个工作簿Workbook workbook = new SXSSFWorkbook();//创建表Sheet sheet = workbook.createSheet();//写入数据for (int rowNum=0;rowNum < 100000; rowNum++){Row row = sheet.createRow(rowNum);for(int cellNum = 0;cellNum <10;cellNum++){Cell cell = row.createCell(cellNum);cell.setCellValue(cellNum);}}FileOutputStream outputStream =new FileOutputStream(Path+"TestWrite07数据s.xlsx");workbook.write(outputStream);outputStream.close();//清除临时文件((SXSSFWorkbook) workbook).dispose();//写完时间long end = System.currentTimeMillis();System.out.println((double)(end-begin)/1000);}
easyExcel
读和写
实体类,及其中的作用
//@ContentRowHeight//内容行高
//@HeadRowHeight//表头行高
public class Student {/*** id*/
// @ExcelProperty(value = "ID",index = 1)//设置表头名称 ,index设置顺序(并且以0开头)@ColumnWidth(10)//设置列宽@ExcelIgnore//读取时忽略该字段private String id;/*** 学生姓名*/@ColumnWidth(20)
// @ExcelProperty(value = "学生姓名",index = 3)private String name;/*** 学生出生日期*/@ColumnWidth(20)
// @ExcelProperty(value = "学生生日",index =2 )@DateTimeFormat("yyyy-MM-dd")//日期格式化注解private Date birthday;/*** 学生性别*/
// @ExcelProperty(value = "学生行别",index = 4)private String gender;}
创建读的方法
@Testpublic void test(){/*** 构建一个读的工作簿对象*pathName:读的文件的路径** head文件中每一行数据要存储到的实体的类型的class** readListener:监听器:每一行内存,都会调用一次该对象的invoke,在invoke可以操作使用读取的数据*///获得一个工作簿对象ExcelReaderBuilder readWorkBook = EasyExcel.read("E:\\study\\easyExcel\\杭州黑马在线202003班学员信息表.xlsx", Student.class, new StudentListener());//获得第一个工作表对象ExcelReaderSheetBuilder sheet = readWorkBook.sheet();//读取工作表中内容sheet.doRead();}
读的方法中读取的每一行数据都有监听器,在监听器中对数据进行操作,然后监听器需要我们自己创建并实现监听器接口中AnalysisEventListener 的方法
package listener;import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import easyExcel.Student;public class StudentListener extends AnalysisEventListener<Student> {/*** readListener:监听器:每一行内存,都会调用一次该对象的invoke,在invoke可以操作使用读取的数据*/public void invoke(Student student, AnalysisContext analysisContext) {System.out.println("studnet"+student);}/***读取完整个文档之后调用的方法*/public void doAfterAllAnalysed(AnalysisContext analysisContext) {}
}
写与读相差不多
@Testpublic void test02(){/*** pathName:要写入的文件路径** head:写入的数据的实体类型** return:写的工作簿对象*///工作簿对象ExcelWriterBuilder write = EasyExcel.write("write.xlsx", Student.class);//工作表对象ExcelWriterSheetBuilder sheet = write.sheet();//写入sheet.doWrite(initData());}
需要我们自己造写入的数据
private static List<Student> initData() {ArrayList<Student> students = new ArrayList<>();for (int i = 0; i < 10; i++) {Student data = new Student();data.setName("杭州黑马学号0" + i);data.setBirthday(new Date());data.setGender("男");students.add(data);}students.stream().filter(x ->x.getId()==null);return students;}
excel的poi和EasyExcel的基本读写相关推荐
- java解析excel,poi和easyExcel
做项目遇到上传excel并解析excel内容组装成结构话json,网上查了很多方法,做了poi和easyExcel两个方法的对比 两者都可以解析excel文件,但是两个也有不同: 一.poi 官方说明 ...
- java处理excel(poi和easyexcel)
poi和easyexcel性能区别 poi xls(03) 65536 poi HSSF xlsx(07) 无限制 poi-ooxml XSSF 工作簿:Workbook 工作表:Sheet 行:Ro ...
- Poi与EasyExcel进行文件读写、模版生成
一.Poi 简介: Apache POI是Apache软件基金会提供的100%开源库.大多数中小规模的应用程序开发主要依赖于Apache POI(HSSF+ XSSF). 它支持Excel 库的所有基 ...
- Java操作Excel:POI和EasyExcel
文章与博客园同步,欢迎访问:https://www.cnblogs.com/MessiXiaoMo3334/p/13288568.html 代码地址:https://gitee.com/ilovemo ...
- 手把手教你用java读写excel表格文件(POI,EasyExcel)
视频链接-我是学习之星我为狂神打call~ [狂神说Java]POI及EasyExcel一小时搞定通俗易懂 想给项目添加一个表格导入导出功能吗? "xxx管理系统"没有导入导出功能 ...
- Excel文件解析性能对比(POI,easyexcel,xlsx-streamer)
问题: 在解析excel内容时,由于用户误操作,偶尔会误录入大量空行,如果代码处置不当,进行文档内容解析时,就会占用大量时间和内存,甚至引起服务器内存消耗殆尽,导致服务无法访问,或者引起OOM. 解决 ...
- poi和easyExcel基于Java操作Excel学习笔记
1 学习前言 Excel和读写和文件的读写没有本质的区别,都是属于IO操作,我们使用原生的IO就能解决Excel的导入和导出,当然操作起来比较麻烦,性能也不高,这次我们就学习poi和easyExcel ...
- 【Excel】Java 操作 Excel 的两种方式:POI、EasyExcel
1. 了解 POI 和 EasyExcel Java 中,常见的用来操作 Excel 的方式有 2 种:POI.EasyExcel.主要用于:对 Excel 进行导入.导出. POI:Apache.一 ...
- Java操作excel(POI、EasyExcel)
Apache POI和EasyExcel学习 easyExcel easyExcel 官网地址:https://www.yuque.com/easyexcel/doc/easyexcel EasyEx ...
- Excel相关操作(一)POI和easyExcel学习整理
视频链接:[狂神说Java]POI及EasyExcel一小时搞定通俗易懂 主要内容:如何用java操作excel,主要涉及到POI和easyExcel这两个 学习代码:https://pan.baid ...
最新文章
- Golang经典面试题下
- 【TensorFlow-windows】keras接口——ImageDataGenerator裁剪
- RecyclerView(一)综合使用综述(Android 5.0 新特性)
- 1、win7 scala安装及idea中scala配置
- mysql双主配置及其注意事项
- Bolt界面引擎元对象(UIObject)的动态创建
- 2021宇哥八套卷总结—第一套试卷分析
- 超分 Super-Resolution
- Lambda拉姆达表达式使用学习
- 压缩包修改所属目录Linux,LINUX 压缩、解压、打包文件 修改文件所属组
- 使用windows自带的测速工具WinSat对移动硬盘进行测速
- 双亲委派模型以及SpringFactoriesLoader详解(最全最简单的介绍)
- macOS--苹果本安装Win(看完可省200块)
- 推荐几个出论文的好方向!
- 位运算符——左移、右移
- 申请GOOGLE的企业邮局
- JDK下载API文档
- [机器学习]西瓜书南瓜书学习(更新中)
- excel打不开是什么原因_网页打不开是什么原因
- 山东八年级计算机教案,初中信息技术 青岛版 八年级信息技术全册教案
热门文章
- php避免超卖,thinkphp防止超卖
- 记一次android设备通过tun0网络连接上级国标平台问题
- 推荐 :数据可视化的方法、工具和应用
- 叶酸修饰的金星形纳米颗粒,Gold star shaped nanoparticles modified with folic acid
- 1415-2团队博客汇总表
- Android视频播放器开发
- 跨越OpenGL和D3D的鸿沟[转]
- 开发一个在线Excel系统?SpreadJS让开发如此简单
- leetcode No5. Longest Palindromic Substring
- 2016.8.26 动态规划及杂题选讲 [树形dp] [数论] [矩阵快速幂]