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.rhkb.cn/news/237280.html

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

相关文章

Java副本的概念

在Java中&#xff0c;"副本"&#xff08;copy&#xff09;一词可以用于描述不同的概念&#xff0c;具体取决于上下文。以下是两个常见的用法&#xff1a; 对象的副本&#xff1a;在Java中&#xff0c;当你创建一个对象并将其赋值给另一个变量时&#xff0c;实际上是创…

electron自定义窗口和右键菜单样式

前言 electron默认沿用系统UI&#xff0c;并没有提供很多接口供使用者定制样式&#xff0c;如果想要完全自定义的样式&#xff0c;目前我能想到的方案只能是通过前端自定义样式&#xff0c;然后通过进程通信来实现系统基础功能&#xff1a;最大/小化、关闭、拖动窗口等。 效果…

迈入AI智能时代!ChatGPT国内版免费AI助手工具 peropure·AI正式上线 一个想法写一首歌?这事AI还真能干!

号外&#xff01;前几天推荐的Peropure.Ai迎来升级&#xff0c;现已支持联网模式&#xff0c;回答更新更准&#xff0c;欢迎注册体验&#xff1a; https://sourl.cn/5T74Hu 相信很多人都有过这样的想法&#xff0c;有没有一首歌能表达自己此时此刻的心情&#xff1a; 当你在深…

xtu oj 1329 连分式

题目描述 连分式是形如下面的分式&#xff0c;已知a,b和迭代的次数n&#xff0c;求连分式的值。 输入 第一行是一个整数T(1≤T≤1000)&#xff0c;表示样例的个数。 每行一个样例&#xff0c;为a,b,n(1≤a,b,n≤9) 输出 每行输出一个样例的结果&#xff0c;使用x/y分式表达…

Go-安装与基础语法

TOC 1. Go 安装与环境变量 1.1 下载 需要从Go语言的官方网站下载适合你操作系统的Go语言安装包。Go语言支持多种操作系统&#xff0c;包括Windows、Linux和Mac OS。 对于Windows用户&#xff0c;下载.msi文件&#xff0c;然后双击该文件&#xff0c;按照提示进行安装即可。…

学习Qt笔记

前言&#xff1a; 学习笔记的内容来自B站up主阿西拜编程 《Qt6 C开发指南 》2023&#xff08;上册&#xff0c;完整版&#xff09;_哔哩哔哩_bilibili《Qt6 C开发指南 》2023&#xff08;上册&#xff0c;完整版&#xff09;共计84条视频&#xff0c;包括&#xff1a;00书籍介…

FreeRTOS系统配置

一、前言 在实际使用FreeRTOS 的时候我们时常需要根据自己需求来配置FreeRTOS&#xff0c;而且不同架构 的MCU在使用的时候配置也不同。FreeRTOS的系统配置文件为FreeRTOSConfig.h&#xff0c;在此配置文件中可以完成FreeRTOS的裁剪和配置&#xff0c;这是非常重要的一个文件&a…

git修改历史(非最新)提交信息

二、修改最近第二次或更早之前的commit信息 当前有三次提交&#xff0c;从近到远分别为1、2、3 以修改第2次提交为例&#xff08;从最新往前数&#xff09; 1、使用命令git rebase -i HEAD~2 按i进入编辑模式&#xff0c;将对应的pick改为edit&#xff0c;然后ctrlc退出。最…

C++学习笔记(二十八):c++ 静态库及动态库的使用

静态库的使用 库的使用会很大程度减少我们的工作&#xff0c;本节对c中静态库和动态库的使用进行简单的介绍。静态链接库意味着这个库会被放到可执行文件中&#xff0c;在生成的exe中。动态链接库是在程序运行时链接的&#xff0c;可以在程序运行时调用加载库函数的方法来实现&…

【Linux运维】LVM和RAID学习及实践

LVM和RAID学习及实践 背景LVM简介新加硬盘的操作RAID-磁盘阵列应用场景RAID0RAID1其他结构RAID制作RAID 小结 背景 某台服务器的磁盘管理需要自己动手处理&#xff0c;找了一些资料也踩了一些坑&#xff0c;在这里记录一下&#xff0c;先介绍一下LVM和RAID这两个东西。在计算机…

通过反射修改MultipartFile类文件名

1、背景 项目上有这样一个需求&#xff0c;前端传文件过来&#xff0c;后端接收后按照特定格式对文件进行重命名。(修改文件名需求其实也可以在前端处理的) //接口类似于下面这个样子 PosMapping("/uploadFile") public R uploadFile(List<MultipartFile> fil…

Golang中for和for range语句的使用技巧、对比及常见的避坑

Update1 2024.1.0更新&#xff1a; Go 团队将修改 for 循环变量的语义&#xff0c;Go1.21 新版本即可体验&#xff01; 今天看见了这篇文章&#xff0c;Go的1.22版本将更新&#xff0c;大致理解未会默认进行v&#xff1a;v这个操作&#xff0c;因此此文所概述的许多坑&#xf…

鸿蒙(HarmonyOS)应用开发指南

1. 概述 1.1 简介 鸿蒙&#xff08;即 HarmonyOS &#xff0c;开发代号 Ark&#xff0c;正式名称为华为终端鸿蒙智能设备操作系统软件&#xff09;是华为公司自 2012 年以来开发的一款可支持鸿蒙原生应用和兼容 AOSP 应用的分布式操作系统。该系统利用“分布式”技术将手机、电…

imx6ull基于yocto工程的l汇编点亮ed

通过汇编点亮led 在裸机状态下通过汇编点亮led&#xff0c;即没有操作系统&#xff0c;(uboot kernel rootfs 都不需要实现&#xff09;。 led点亮原理 1.GPIO复用 根据原理图&#xff0c;找到led对应的引脚&#xff08;pin)&#xff0c;复用为GPIO&#xff08;只有GPIO才能…

Unity之角色控制器

PS:公司终于给我派任务了&#xff0c;最近几天都没学Unity&#x1f927;。 一、角色控制器的实现方式 目前小编知道的角色控制器实现方式有三种&#xff1a; 应用商店的角色控制系统Unity自己的角色控制器通过物理系统去做角色控制器 本篇介绍的是第二种Unity自己的角色控制…

springboot集成jsp

首先pom中引入依赖包 <!--引入servlet--> <dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId> </dependency> <!--引入jstl标签库--> <dependency><groupId>javax.servle…

脱机I/O方式和假脱机系统

提示&#xff1a;在写这个博客的时候小编更加的觉得计算机基础知识的重要性了&#xff0c;而且对计算机的整个发展历程和计算机的底层工作原理特别感兴趣 脱机I/O方式和假脱机系统 一、脱机I/O方式二、假脱机系统1、假脱机技术&#xff08;SPOOLing&#xff0c; simulataneaus …

[NSSCTF Round#16 Basic] CPR

打着玩玩&#xff0c;比赛很简单。 Crypto pr 一个RSA题&#xff0c;n1p*q,n2q*r给了两个c和p,r而且flag经过pad用单因子无法解出。分别用p,r解完再取crt from Crypto.Util.number import * import randomflagplaintext NSSCTF{****************} charset abcdefghijklmn…

Open CASCADE学习|基于visual studio 2022编译源码

目录 1、简介 2、下载 2.1下载visual studio 2022 community 2.2下载下载cmake工具 2.3下载源码 2.4下载第三方插件 3、安装 3.1安装visual studio 2022 community 3.2安装cmake 4、编译源码 5、测试 1、简介 Open CASCADE&#xff08;简称…

【b站咸虾米】新课uniapp零基础入门到项目打包(微信小程序/H5/vue/安卓apk)全掌握

课程地址&#xff1a;【新课uniapp零基础入门到项目打包&#xff08;微信小程序/H5/vue/安卓apk&#xff09;全掌握】 https://www.bilibili.com/video/BV1mT411K7nW/?p12&share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 三、vue语法 继续回到官…