使用POI实现操作Excel文件。

1、添加依赖
    <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency>
2、xls和xlsx的区别介绍
  1. xls是Excel03版本,最大支持65536行、256列,poi 操作xls,使用HSSFWorkbook
  2. xlsx是Excel007版本,最大支持1048576行、16384列,poi-ooml操作xlsx,使用XSSFWorkbook

3、代码示例,读取Excel
/*** 读.xlsx文件*/
private static List<List<String>> readXlsx(String path) throws Exception {InputStream is = Files.newInputStream(Paths.get(path));XSSFWorkbook xssfWorkbook = new XSSFWorkbook(is);List<List<String>> result = new ArrayList<List<String>>();// 循环每一页,并处理当前循环页 (sheet 页)int numberOfSheets = xssfWorkbook.getNumberOfSheets();for (int i = 0; i < numberOfSheets; i++) {XSSFSheet sheetAt = xssfWorkbook.getSheetAt(i);if (sheetAt == null) {continue;}// 从第一行一直循环到当前sheet的最后一行for (int rowNum = 1; rowNum <= sheetAt.getLastRowNum(); rowNum++) {// 获取行数据,然后在获取列数据XSSFRow xssfRow = sheetAt.getRow(rowNum);int minColIx = xssfRow.getFirstCellNum();int maxColIx = xssfRow.getLastCellNum();List<String> rowList = new ArrayList<String>();for (int colIx = minColIx; colIx < maxColIx; colIx++) {XSSFCell cell = xssfRow.getCell(colIx);if (cell == null) {continue;}rowList.add(cell.toString());}result.add(rowList);}}return result;
}/*** 读.xls文件*/
private static List<List<String>> readXls(String path) throws IOException {InputStream is = Files.newInputStream(Paths.get(path));HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);List<List<String>> result = new ArrayList<List<String>>();int numberOfSheets = hssfWorkbook.getNumberOfSheets();for (int i = 0; i < numberOfSheets; i++) {HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(i);if (hssfSheet == null) {continue;}int firstRowNum = hssfSheet.getFirstRowNum();int lastRowNum = hssfSheet.getLastRowNum();for (int rowIx = firstRowNum; rowIx < lastRowNum; rowIx++) {HSSFRow row = hssfSheet.getRow(rowIx);int minColIx = row.getFirstCellNum();int maxColIx = row.getLastCellNum();List<String> rowList = new ArrayList<String>();for (int colIx = minColIx; colIx < maxColIx; colIx++) {HSSFCell cell = row.getCell(colIx);if (cell == null) {continue;}rowList.add(cell.toString());}result.add(rowList);}}return result;
}
4、代码示例,写Excel (HSSFWorkBook类似)
// 将上面读取的数据,在重新写到一个新的文件中
private static void writeXlsx(List<List<String>> dataList, String destPath) throws IOException {// 创建一个工作簿XSSFWorkbook xssfWorkbook = new XSSFWorkbook();Sheet sheet001 = xssfWorkbook.createSheet("sheet001");for (int i = 0; i < dataList.size(); i++) {Row row = sheet001.createRow(i);List<String> rowData = dataList.get(i);for (int j = 0; j < rowData.size(); j++) {Cell cell = row.createCell(j);cell.setCellValue(rowData.get(j));}}FileOutputStream fileOutputStream = new FileOutputStream(destPath);xssfWorkbook.write(fileOutputStream);fileOutputStream.close();
}

5、合并单元格 --- addMergedRegion
private static void mergeWithXSSF(String destPath) throws IOException {XSSFWorkbook xssfWorkbook = new XSSFWorkbook();XSSFSheet sheet = xssfWorkbook.createSheet("new Sheet");XSSFRow row = sheet.createRow(1);XSSFCell cell = row.createCell(1);cell.setCellValue("测试合并单元格");// 按照范围合并单元格sheet.addMergedRegion(new CellRangeAddress(1, 1, 1, 2));FileOutputStream fileOutputStream = new FileOutputStream(destPath);xssfWorkbook.write(fileOutputStream);fileOutputStream.close();
}

合并效果:

6.合并单元格的优化 -----  addMergedRegionUnsafe

当我们还使用addMergedRegion方法的时候,比如循环10000次合并操作,可以计算一下耗时

private static void mergeWithXSSF1(String destPath) throws IOException {XSSFWorkbook xssfWorkbook = new XSSFWorkbook();XSSFSheet sheet = xssfWorkbook.createSheet("new Sheet");long startTime = System.currentTimeMillis();for (int i = 0; i < 10000; i++) {XSSFRow row = sheet.createRow(i);XSSFCell cell = row.createCell(1);cell.setCellValue("测试合并单元格");sheet.addMergedRegion(new CellRangeAddress(i, i, 1, 2));}long endTime = System.currentTimeMillis();System.out.println("耗费时间: " + (endTime - startTime));FileOutputStream fileOutputStream = new FileOutputStream(destPath);xssfWorkbook.write(fileOutputStream);fileOutputStream.close();
}耗费时间: 22918

如果换成addMergedRegionUnsafe方法,同样循环10000次合并操作,计算了一下耗时

private static void mergeWithXSSF1(String destPath) throws IOException {XSSFWorkbook xssfWorkbook = new XSSFWorkbook();XSSFSheet sheet = xssfWorkbook.createSheet("new Sheet");long startTime = System.currentTimeMillis();for (int i = 0; i < 10000; i++) {XSSFRow row = sheet.createRow(i);XSSFCell cell = row.createCell(1);cell.setCellValue("测试合并单元格");// 改成不校验sheet.addMergedRegionUnsafe(new CellRangeAddress(i, i, 1, 2));}long endTime = System.currentTimeMillis();System.out.println("耗费时间: " + (endTime - startTime));FileOutputStream fileOutputStream = new FileOutputStream(destPath);xssfWorkbook.write(fileOutputStream);fileOutputStream.close();
}耗费时间: 926

可以看到,消耗的时间是大大减少的。

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

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

相关文章

[keil] uv编译分析

假设Keil安装路径: C:\Keil_v5\ 假设工程在 d:\HELLO , 工程Targets名:Simulator [在Manage Project Items中可修改] 如下指令为:Build(F7) C:\Keil_v5\UV4\UV4.exe -b d:\HELLO\Hello.uvproj -j0 -t Simulator -o d:\HELLO\uv4.log 如下指令为:Rebuild(CtrlAltF7) C:\Kei…

探究SpringWeb对于请求的处理过程

探究目的 在路径归一化被提出后&#xff0c;越来越多的未授权漏洞被爆出&#xff0c;而这些未授权多半跟spring自身对路由分发的处理机制有关。今天就来探究一下到底spring处理了什么导致了才导致鉴权被绕过这样严重的问题。 DispatcherServlet介绍 首先在分析spring对请求处…

[刷题记录]牛客面试笔刷TOP101

牛客笔试算法必刷TOP101系列,每日更新中~(主要是记录自己的刷题,所以描述的可能不是很清楚 但如果刚好能帮助到你就更好了) 后续后头复习的时候,记得是看正解啊,别对着错的例子傻傻看了... 目录 1.合并有序链表2023.9.3 2.链表是否有环2023.9.4 3.判断链表中环的入口点 …

一分钟图情论文:《原始的布拉德福定律》

天津大学图书馆的研究馆员范铮先生&#xff0c;在《图书情报工作》第一期中发表了题为《原始的布拉德福定律》的文章&#xff0c;详细介绍了布拉德福定律的历史背景、调查统计数据、文献曲线以及理论推导等关键内容。这篇文章让我们能够深入了解布拉德福定律的本质和原始构想。…

概率论与数理统计学习笔记(7)——全概率公式与贝叶斯公式

目录 1. 背景2. 全概率公式3. 贝叶斯公式 1. 背景 下图是本文的背景内容&#xff0c;小B休闲时间有80%的概率玩手机游戏&#xff0c;有20%的概率玩电脑游戏。这两个游戏都有抽卡环节&#xff0c;其中手游抽到金卡的概率为5%&#xff0c;端游抽到金卡的概率为15%。已知小B这天抽…

Windows环境下Springboot3+Graalvm+Idea 打包成原生镜像 踩坑

https://github.com/oracle/graal/https://github.com/graalvm/graalvm-ce-builds/releases/对应关系graalvm-ce-java17-windows-amd64-X.X.X.zipnative-image-installable-svm-java17-windows-amd64-X.X.X.jar本人使用:graalvm-ce-java17-windows-amd64-23.0.1.zipnative-imag…

蓝桥杯官网练习题(纸牌三角形)

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 A,2,3,4,5,6,7,8,9 共 99 张纸牌排成一个正三角形&#xff08;A 按 1 计算&#xff09;。要求每个边的和相等。 下图就是一种排法。 这样的排法可能会有很多。 如果…

修改Docker镜像默认下载地址

1、安装完docker desktop后&#xff0c;先不要打开 2、新建目录 D:\ProgramData\Docker 3、在C:\Users\你的用户名\AppData\Local下&#xff0c;打开cmd或者powershell执行以下命令&#xff0c;命令语法略有不同。 powershell命令&#xff1a; cmd /c mklink /J Docker D:\Pro…

1-5 AUTOSAR数据交换文件ARXML

目录 一、Arxml文件 二、各类ARXML文件 一、Arxml文件 arxml文件是AUTOSAR&#xff08;Automotive Open System Architecture&#xff09;标准定义的XML文件&#xff0c;用于描述汽车电子系统中的软件组件、通信接口和参数配置等信息。 arxml文件的主要作用是在AUTOSAR架构下…

golang教程 beego框架笔记一

安装beego 安装bee工具 beego文档 # windos 推荐使用 go install github.com/beego/bee/v2master go get -u github.com/beego/bee/v2masterwindows使用安装bee工具时碰到的问题&#xff1b; 环境配置都没有问题&#xff0c;但是执行官网的命令&#xff1a;go get -u github…

打造高效的私密论坛网站:Cpolar内网穿透+HadSky轻量级搭建指南

文章目录 前言1. 网站搭建1.1 网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3 Cpolar稳定隧道&#xff08;本地设置&#xff09;2.4 公网访问测试 总结 前言 经过多年的基础…

大数据和数据要素有什么关系?

大数据与数据要素之间存在密切的关系。大数据是指海量、多样化、高速生成的数据&#xff0c;而数据要素是指构成数据的基本元素或属性。数据要素包括但不限于数据的类型、结构、格式、单位、精度等。 大数据的产生和应用离不开数据要素的支持。数据要素确定了数据的基本特征和…

【网络基础】——HTTPS

目录 HTTPS背景知识 HTTPS是什么&#xff1f; 加密解密 为什么要加密 常见的加密方式 对称加密 非对称加密 数据摘要&&数据指纹 数字签名 HTTPS工作过程探究 方案1&#xff1a;只使用对称加密 方案2&#xff1a;只使用非对称加密 方案3&#xff1a;双方…

conda和Python的虚拟环境如何结合使用,以及二者之间到底有什么区别?

问题描述 今天在复现streamlit的代码时&#xff08;参考Streamlit 讲解专栏&#xff08;一&#xff09;&#xff1a;安装以及初步应用&#xff09;&#xff0c;根据这篇博文指导&#xff0c;要先用以下指令创建一个虚拟环境&#xff1a; # 创建虚拟环境&#xff08;使用venv&a…

【python】读取.dat格式文件

import binascii# 打开二进制文件以只读二进制模式 with open(EXCEL/文件.dat, rb) as file:binary_data file.read()print(binary_data)# 将二进制数据转换为十六进制字符串 hex_data binascii.hexlify(binary_data).decode(utf-8) # binary_data 现在包含了文件的二进制内容…

git标签基础

打标签:git可以给仓库历史中某个提交打上标签,以示重要,比较有代表人们会使用这个功能来标记发布结点(V1.0,V2.0) 列出本地标签: git tag --list git tag -l "V1.85*" 列出远端仓库的中所有标签 git ls-remote --tags给标签添加一些描述信息 git tag -a v1.3 -m …

热释电矢量传感器设计

1 概述 使用4个热释电传感器组成一个2X2的矩阵。通过曲线的相位差、 峰峰值等特征量来计算相关信息。本文使用STM32单片机设计、制作了热释电传感器矩阵&#xff1b;使用C#.NET设计了上位机软件。为以上研究做了试验平台。 2 硬件电路设计 2.1 热释电传感器介绍 热释电红外…

c++异步框架workflow分析

简述 workflow项目地址 &#xff1a; https://github.com/sogou/workflow workflow是搜狗开源的一个开发框架。可以满足绝大多数日常服务器开发&#xff0c;性能优异&#xff0c;给上层业务提供了易于开发的接口&#xff0c;却只用了少量的代码&#xff0c;举重若轻&#xff…

Fastjson_1.2.24_unserialize_rce漏洞复现

fastjson_1.2.24_unserialize_rce 说明内容漏洞编号CNVD-2017-02833漏洞名称FastJson < 1.2.24 远程代码执行漏洞评级高危影响范围1.2.24漏洞描述通过parseObject/parse将传入的字符串反序列化为Java对象时由于没有进行合理检查修复方案升级组件&#xff0c;打补丁&#xf…

9.11C高级day4

实现一个对数组求和的函数&#xff0c;数组通过实参传递给函数 sum0 function add() {for i in $*  #$*接收传来的所有参数do((sumi))doneecho $sum }#定义一个数组 arr(1 2 3 4 5 7 9)#向函数传参 add ${arr[*]}写一个函数&#xff0c;输出当前用户的uid和gid&#xff0c;并…