POI:对Excel的基本写操作 整理1

首先导入相关依赖 

    <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --><!--xls(03)--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.2</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml --><!--xlsx(07)--><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.2</version></dependency><!-- 日期格式化工具 --><dependency><groupId>joda-time</groupId><artifactId>joda-time</artifactId><version>2.12.5</version></dependency><!--测试--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency>

1 写入简单的数据

public class ExcelWrite {String PATH = "D:\\Idea-projects\\POI\\POI_projects";// 以下是相应的写入操作方法// ......
}

(1)当向03版本的Excel中写入数据

    @Testpublic void testWrite03() throws IOException {
//        1.创建一个工作簿Workbook workbook = new HSSFWorkbook();//        2.创建一个工作表Sheet sheet = workbook.createSheet("xx");//        3.创建一行Row row = sheet.createRow(0);
//        4.创建一个单元格Cell cell1 = row.createCell(0);cell1.setCellValue("今日新增观众");Cell cell2 = row.createCell(1);cell2.setCellValue(666);//        创建第二行(2,1)Row row2 = sheet.createRow(1);Cell cell21 = row2.createCell(0);cell21.setCellValue("统计时间");//        (2,2)Cell cell22 = row2.createCell(1);String time = new DateTime().toString("yyyy-MM-dd HH:mm:ss");cell22.setCellValue(time);//        5. 生成一张表 (IO 流)   03版本就是使用xls结尾FileOutputStream fileOutputStream = new FileOutputStream(PATH + "xx03.xls");workbook.write(fileOutputStream);//        6.关闭流fileOutputStream.close();System.out.println("文件生成完毕!");}

(2)当向07版本的Excel中写入数据

    @Testpublic void testWrite07() throws IOException {
//        1.创建一个工作簿Workbook workbook = new XSSFWorkbook();//        2.创建一个工作表Sheet sheet = workbook.createSheet("xiexu1");//        3.创建一行Row row = sheet.createRow(0);
//        4.创建一个单元格Cell cell1 = row.createCell(0);cell1.setCellValue("今日新增观众");Cell cell2 = row.createCell(1);cell2.setCellValue(666);//        创建第二行(2,1)Row row2 = sheet.createRow(1);Cell cell21 = row2.createCell(0);cell21.setCellValue("统计时间");//        (2,2)Cell cell22 = row2.createCell(1);String time = new DateTime().toString("yyyy-MM-dd HH:mm:ss");cell22.setCellValue(time);//        5. 生成一张表(IO 流)   03版本就是使用xlsx结尾FileOutputStream fileOutputStream = new FileOutputStream(PATH + "xiexu07.xlsx");workbook.write(fileOutputStream);//        6.关闭流fileOutputStream.close();System.out.println("文件生成完毕!");}

2 写入大量的数据

(1)当向03版本的Excel中写入大量数据

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

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

    @Testpublic void testWriteBigData03() throws IOException {// 计算时间差long beginTime = System.currentTimeMillis();// 1.创建一个工作簿Workbook workbook = new HSSFWorkbook();// 2.创建一个工作表Sheet sheet = workbook.createSheet("xiexu2");// 3. 写入数据  (03版最多只能放65536行, 超出会报异常)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);}}System.out.println("写入完成!");FileOutputStream fileOutputStream = new FileOutputStream(PATH + "bigData03.xls");workbook.write(fileOutputStream);fileOutputStream.close();long endTime = System.currentTimeMillis();System.out.println((double) (endTime - beginTime) / 1000);  // 毫秒转换为秒}


1.129s  还是非常快的


只能写入65536行,超出会报异常


(2)当向07版本的Excel中写入大量数据

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

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

    @Testpublic void testWriteBigData07() throws IOException {   // 耗时长// 计算时间差long beginTime = System.currentTimeMillis();// 1.创建一个工作簿Workbook workbook = new XSSFWorkbook();// 2.创建一个工作表Sheet sheet = workbook.createSheet("xiexu3");// 3. 写入数据for (int rowNum = 0 ; rowNum < 65538; rowNum++) {   // ? 65538Row row = sheet.createRow(rowNum);for (int cellNum = 0; cellNum < 10; cellNum++) {Cell cell = row.createCell(cellNum);cell.setCellValue(cellNum);}}System.out.println("over");FileOutputStream fileOutputStream = new FileOutputStream(PATH + "bigData07.xlsx");workbook.write(fileOutputStream);fileOutputStream.close();long endTime = System.currentTimeMillis();System.out.println((double) (endTime - beginTime) / 1000);  // 毫秒转换为秒}

耗时4.812s, 相比于03版本,是非常慢的


可以写入超出65536行的数据 

(3)因为07版本写入大量数据时的速度较慢,所以我们可以用07的加速版的做法:SXSSFWorkbork()

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

注意:过程中会产生临时文件,需要清理临时文件(默认有100条记录被保存在内存中,如果超出了这个数量,则最前面的数据被写入临时文件,如果想自定义内存中数据的数量,可以使用  new  SXSSFWorkbook(自定义的数量值)  ) 

    @Testpublic void testWriteBigData07quick() throws IOException {   // SXSSF 更快// 计算时间差long beginTime = System.currentTimeMillis();// 1.创建一个工作簿Workbook workbook = new SXSSFWorkbook();// 2.创建一个工作表Sheet sheet = workbook.createSheet("xiexu4");// 3. 写入数据for (int rowNum = 0 ; rowNum < 65538; rowNum++) {   // ? 65538Row row = sheet.createRow(rowNum);for (int cellNum = 0; cellNum < 10; cellNum++) {Cell cell = row.createCell(cellNum);cell.setCellValue(cellNum);}}System.out.println("over");FileOutputStream fileOutputStream = new FileOutputStream(PATH + "bigData07quick.xlsx");workbook.write(fileOutputStream);fileOutputStream.close();((SXSSFWorkbook) workbook).dispose();    // 清除临时文件long endTime = System.currentTimeMillis();System.out.println((double) (endTime - beginTime) / 1000);  // 毫秒转换为秒}


现在是1.667s相比于之前,还是非常快的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/345042.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript常用事件详解

一、用于form&#xff08;表单&#xff09;的事件 在网页中经常会遇到一些表单的验证&#xff0c;是通过事件进行处理的&#xff0c;比如用户输入用户名之后&#xff0c;及时显示用户是否被注册 用于form&#xff08;表单&#xff09;的事件 事件名功能 onblur 当元素失…

【java八股文】之JVM基础篇

1、Java中都有哪些引用&#xff1f; 强引用 &#xff1a;发生GC时候不会被回收 软引用&#xff1a;发生内存满&#xff08;内存溢出的时候&#xff09;会被回收&#xff08;通常用于缓存&#xff09; 弱引用&#xff1a;发生下一次GC时候会被回收 虚引用&#xff1a;无法通过虚…

【微信小程序独立开发1】项目提出和框架搭建

前言&#xff1a;之前学习小程序开发时仿照别人的页面自己做了一个商城项目和小说项目&#xff0c;最近突发奇想&#xff0c;想从0开发一个关于《宠物日记》的小程序&#xff0c;需求和页面都由自己设计&#xff0c;将在这记录开发的全部流程和过程中遇到的难题等... 1、搭建小…

1024 科学计数法 (20)

科学计数法是科学家用来表示很大或很小的数字的一种方便的方法&#xff0c;其满足正则表达式 [-][1-9].[0-9]E[-][0-9]&#xff0c;即数字的整数部分只有 1 位&#xff0c;小数部分至少有 1 位&#xff0c;该数字及其指数部分的正负号即使对正数也必定明确给出。 现以科学计数…

Danswer部署指南

Quickstart How to deploy Danswer on your local machine ​ Requirements gitdocker with compose (docker version > 1.13.0) ​ Setup This quickstart guide covers setting up Danswer for local execution Clone the Danswer repo: git clone https://github.com…

一款快速稳定的漏洞扫描工具【afrog】零基础入门到精通

工具介绍 afrog 是一款快速、稳定的高性能漏洞扫描器。支持用户自定义PoC&#xff0c;内置CVE、CNVD、默认密码、信息泄露、指纹识别、越权访问、任意文件读取、命令执行等多种类型。通过afrog&#xff0c;网络安全专业人员可以快速验证和修复漏洞&#xff0c;这有助于增强他们…

强化学习应用(二):基于Q-learning的无人机物流路径规划研究(提供Python代码)

一、Q-learning简介 Q-learning是一种强化学习算法&#xff0c;用于解决基于马尔可夫决策过程&#xff08;MDP&#xff09;的问题。它通过学习一个价值函数来指导智能体在环境中做出决策&#xff0c;以最大化累积奖励。 Q-learning算法的核心思想是通过不断更新一个称为Q值的…

mac 使用brew卸载node

1.查看当前的node版本 node -v 2.查看使用brew 安装的版本&#xff0c;可以看到本机装了14、16、18版本的node brew search node 3.卸载node brew uninstall node版本号 --force 如分别删除14、16、18版本的node命令如下 brew uninstall node14 --force brew uninstall no…

软考高级系统架构设计师考试经验分享

文章目录 1. 软考介绍&#xff08;1&#xff09;什么是软考&#xff08;2&#xff09;软考的作用&#xff08;3&#xff09;软考各科目的难度&#xff08;4&#xff09;考试时间&#xff08;5&#xff09;考试形式 2.系统架构设计师备考经验&#xff08;1&#xff09;辅导资料&…

谷粒商城-缓存使用分布式锁SpringCache(5天)

缓存使用 1.1.1 哪些数据适合放入缓存 即时性、 数据一致性要求不高的 访问量大且更新频率不高的数据&#xff08;读多&#xff0c; 写少&#xff09; 例如&#xff1a;电商类应用&#xff0c; 商品分类&#xff0c; 商品列表等适合缓存 本地缓存 使用Map进行本地缓存 本地缓存…

如何配置Kafka账号密码

背景 我们需要与第三方系统进行数据同步&#xff0c;需要搭建公网Kafka&#xff0c;Kafka默认是没有用户密码校验的&#xff0c;所以我们需要配置用户名密码校验。 配置 新增JAAS配置文件 在conf目录下新增kafka_server_jaas.conf文件&#xff0c;文件内容如下&#xff1a;…

基于SpringBoot的洗衣店管理系统

基于SpringBoot的洗衣店管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 登录界面 可视化展示 用户界面 管理员界面 摘要 洗衣店管理系统基于Spring Boot框…