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的基本读写相关推荐

  1. java解析excel,poi和easyExcel

    做项目遇到上传excel并解析excel内容组装成结构话json,网上查了很多方法,做了poi和easyExcel两个方法的对比 两者都可以解析excel文件,但是两个也有不同: 一.poi 官方说明 ...

  2. java处理excel(poi和easyexcel)

    poi和easyexcel性能区别 poi xls(03) 65536 poi HSSF xlsx(07) 无限制 poi-ooxml XSSF 工作簿:Workbook 工作表:Sheet 行:Ro ...

  3. Poi与EasyExcel进行文件读写、模版生成

    一.Poi 简介: Apache POI是Apache软件基金会提供的100%开源库.大多数中小规模的应用程序开发主要依赖于Apache POI(HSSF+ XSSF). 它支持Excel 库的所有基 ...

  4. Java操作Excel:POI和EasyExcel

    文章与博客园同步,欢迎访问:https://www.cnblogs.com/MessiXiaoMo3334/p/13288568.html 代码地址:https://gitee.com/ilovemo ...

  5. 手把手教你用java读写excel表格文件(POI,EasyExcel)

    视频链接-我是学习之星我为狂神打call~ [狂神说Java]POI及EasyExcel一小时搞定通俗易懂 想给项目添加一个表格导入导出功能吗? "xxx管理系统"没有导入导出功能 ...

  6. Excel文件解析性能对比(POI,easyexcel,xlsx-streamer)

    问题: 在解析excel内容时,由于用户误操作,偶尔会误录入大量空行,如果代码处置不当,进行文档内容解析时,就会占用大量时间和内存,甚至引起服务器内存消耗殆尽,导致服务无法访问,或者引起OOM. 解决 ...

  7. poi和easyExcel基于Java操作Excel学习笔记

    1 学习前言 Excel和读写和文件的读写没有本质的区别,都是属于IO操作,我们使用原生的IO就能解决Excel的导入和导出,当然操作起来比较麻烦,性能也不高,这次我们就学习poi和easyExcel ...

  8. 【Excel】Java 操作 Excel 的两种方式:POI、EasyExcel

    1. 了解 POI 和 EasyExcel Java 中,常见的用来操作 Excel 的方式有 2 种:POI.EasyExcel.主要用于:对 Excel 进行导入.导出. POI:Apache.一 ...

  9. Java操作excel(POI、EasyExcel)

    Apache POI和EasyExcel学习 easyExcel easyExcel 官网地址:https://www.yuque.com/easyexcel/doc/easyexcel EasyEx ...

  10. Excel相关操作(一)POI和easyExcel学习整理

    视频链接:[狂神说Java]POI及EasyExcel一小时搞定通俗易懂 主要内容:如何用java操作excel,主要涉及到POI和easyExcel这两个 学习代码:https://pan.baid ...

最新文章

  1. Golang经典面试题下
  2. 【TensorFlow-windows】keras接口——ImageDataGenerator裁剪
  3. RecyclerView(一)综合使用综述(Android 5.0 新特性)
  4. 1、win7 scala安装及idea中scala配置
  5. mysql双主配置及其注意事项
  6. Bolt界面引擎元对象(UIObject)的动态创建
  7. 2021宇哥八套卷总结—第一套试卷分析
  8. 超分 Super-Resolution
  9. Lambda拉姆达表达式使用学习
  10. 压缩包修改所属目录Linux,LINUX 压缩、解压、打包文件 修改文件所属组
  11. 使用windows自带的测速工具WinSat对移动硬盘进行测速
  12. 双亲委派模型以及SpringFactoriesLoader详解(最全最简单的介绍)
  13. macOS--苹果本安装Win(看完可省200块)
  14. 推荐几个出论文的好方向!
  15. 位运算符——左移、右移
  16. 申请GOOGLE的企业邮局
  17. JDK下载API文档
  18. [机器学习]西瓜书南瓜书学习(更新中)
  19. excel打不开是什么原因_网页打不开是什么原因
  20. 山东八年级计算机教案,初中信息技术 青岛版 八年级信息技术全册教案

热门文章

  1. php避免超卖,thinkphp防止超卖
  2. 记一次android设备通过tun0网络连接上级国标平台问题
  3. 推荐 :数据可视化的方法、工具和应用
  4. 叶酸修饰的金星形纳米颗粒,Gold star shaped nanoparticles modified with folic acid
  5. 1415-2团队博客汇总表
  6. Android视频播放器开发
  7. 跨越OpenGL和D3D的鸿沟[转]
  8. 开发一个在线Excel系统?SpreadJS让开发如此简单
  9. leetcode No5. Longest Palindromic Substring
  10. 2016.8.26 动态规划及杂题选讲 [树形dp] [数论] [矩阵快速幂]