POI读写Excel的基本使用

article/2025/10/21 4:15:49

一、Excel导入导出的应用场景

1、数据导入:减轻录入工作量

2、数据导出:统计信息归档

3、数据传输:异构系统之间数据传输

二、POI简介(Apache POI)

1、什么是POI

Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

  • HSSF - 提供读写Microsoft Excel格式档案的功能。(.xls)
  • XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。(.xlsx)
  • HWPF - 提供读写Microsoft Word格式档案的功能。
  • HSLF - 提供读写Microsoft PowerPoint格式档案的功能。
  • HDGF - 提供读写Microsoft Visio格式档案的功能。

2、官网

http://poi.apache.org/

官网可以找到文档和每个版本的下载地址

三、POI向Excel中写操作的演示

1.excel一般分为两种版本

(1)03版本:xls

(2)07版本:xlsx

两种版本的excel的区别:03版本excel最大存储行数为65536,07版本excel理论上没有限制

2.excel操作术语

(1)整个excel文档称为 workbook

(2)在每个workbook里面有很多 sheet

(3)在每个sheet里面有很多 row

(4)在每个row里面有很多 cell

(5)在每个cell里面有很多 内容

在这里插入图片描述

3.poi向03版本excel写内容

3.1 创建一个maven工程并引入poi相关依赖

<dependencies><!--xls--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.9</version></dependency><!--xlsx--><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><!--test--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency>
</dependencies>

3.2 testWrite03Excel

  • HSSF - 提供读写Microsoft Excel格式档案的功能。(.xls)
@Test
public void testWrite03Excel() throws  Exception{// 1.创建新的Excel工作簿(workbook)// 1.1 03版本的Excel需要HSSFWorkbook对象Workbook workbook = new HSSFWorkbook();// 2.使用workbook创建sheet// 2.1在Excel工作簿中建一工作表(sheet),其名为缺省值 Sheet0//Sheet sheet = workbook.createSheet();// 2.2如要新建一名为"会员登录统计"的工作表,其语句为:Sheet sheet = workbook.createSheet("会员登录统计");// 3.使用sheet创建行(row 1)// 3.1行索引从0开始Row row1 = sheet.createRow(0);// 4.使用row创建单元格(cell 1-1)Cell cell11 = row1.createCell(0);// 5.通过cell向其中设置内容cell11.setCellValue("今日人数");// 使用row创建单元格(col 1-2)Cell cell12 = row1.createCell(1);// 5.通过cell向其中设置内容cell12.setCellValue(666);// 可使用sheet创建多行(row 2)Row row2 = sheet.createRow(1);// 使用row创建单元格(col 2-1)Cell cell21 = row2.createCell(0);cell21.setCellValue("统计时间");//创建单元格(第三列)Cell cell22 = row2.createCell(1);String dateTime = new DateTime().toString("yyyy-MM-dd HH:mm:ss");cell22.setCellValue(dateTime);// 6.新建一输出文件流(注意:要先创建文件夹)FileOutputStream out = new FileOutputStream("F:/PoiTest/01.xls");// 7.把相应的Excel 工作簿存盘workbook.write(out);// 8.操作结束,关闭文件out.close();System.out.println("文件生成成功");
}

测试结果:

在这里插入图片描述

4.poi向07版本excel写内容

4.1 testWrite07Excel

  • XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。(.xlsx)
@Test
public void testWrite07Excel() throws Exception{// 1.创建新的Excel工作簿(workbook)// 1.1 07版本的Excel需要XSSFWorkbook对象Workbook workbook = new XSSFWorkbook();// 2.使用workbook创建sheet// 2.1在Excel工作簿中建一工作表(sheet),其名为缺省值 Sheet0//Sheet sheet = workbook.createSheet();// 2.2如要新建一名为"会员登录统计"的工作表,其语句为:Sheet sheet = workbook.createSheet("会员登录统计");// 3.使用sheet创建行(row 1)// 3.1行索引从0开始Row row1 = sheet.createRow(0);// 4.使用row创建单元格(cell 1-1)Cell cell11 = row1.createCell(0);// 5.通过cell向其中设置内容cell11.setCellValue("今日人数");// 使用row创建单元格(col 1-2)Cell cell12 = row1.createCell(1);// 5.通过cell向其中设置内容cell12.setCellValue(666);// 可使用sheet创建多行(row 2)Row row2 = sheet.createRow(1);// 使用row创建单元格(col 2-1)Cell cell21 = row2.createCell(0);cell21.setCellValue("统计时间");//创建单元格(第三列)Cell cell22 = row2.createCell(1);String dateTime = new DateTime().toString("yyyy-MM-dd HH:mm:ss");cell22.setCellValue(dateTime);// 6.新建一输出文件流(注意:要先创建文件夹)FileOutputStream out = new FileOutputStream("F:/PoiTest/01.xlsx");// 7.把相应的Excel 工作簿存盘workbook.write(out);// 8.操作结束,关闭文件out.close();System.out.println("文件生成成功");
}

测试结果:

在这里插入图片描述

在这里插入图片描述

四、POI大文件写操作-HSSF、XSSF和SXSSF

1.使用HSSF(03版本excel)

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

java.lang.IllegalArgumentException: Invalid row number (65536) outside
allowable range (0…65535)

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

@Test
public void testWrite03BigData() throws IOException {//记录开始时间long begin = System.currentTimeMillis();//创建一个SXSSFWorkbook//-1:关闭 auto-flushing,将所有数据存在内存中Workbook workbook = new HSSFWorkbook();//创建一个sheetSheet sheet = workbook.createSheet();//xls文件最大支持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("done");FileOutputStream out = new FileOutputStream("F:/PoiTest/01.xls");workbook.write(out);// 操作结束,关闭文件out.close();//记录结束时间long end = System.currentTimeMillis();System.out.println((double)(end - begin)/1000);
}

2.使用XSSF(07版本excel)

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

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

@Test
public void testWrite07BigData() throws IOException {//记录开始时间long begin = System.currentTimeMillis();//创建一个XSSFWorkbookWorkbook workbook = new XSSFWorkbook();......FileOutputStream out = new FileOutputStream("F:/PoiTest/01.xlsx");......
}

3.使用SXSSF

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

注意:

过程中会产生临时文件,需要清理临时文件(C:\Users\helen\AppData\Local\Temp)

默认由100条记录被保存在内存中,如果查过这数量,则最前面的数据被写入临时文件

如果想自定义内存中数据的数量,可以使用new SXSSFWorkbook(数量)

@Test
public void testWrite07BigDataFast() throws IOException {//记录开始时间long begin = System.currentTimeMillis();//创建一个SXSSFWorkbookWorkbook workbook = new SXSSFWorkbook();......FileOutputStream out = new FileOutputStream("F:/PoiTest/01.xlsx");workbook.write(out);// 操作结束,关闭文件out.close();//清除临时文件((SXSSFWorkbook)workbook).dispose();//记录结束时间long end = System.currentTimeMillis();System.out.println((double)(end - begin)/1000);
}

SXSSFWorkbook-来至官方的解释:实现“BigGridDemo”策略的流式XSSFWorkbook版本。这允许写入非常大的文件而不会耗尽内存,因为任何时候只有可配置的行部分被保存在内存中。

请注意,仍然可能会消耗大量内存,这些内存基于您正在使用的功能,例如合并区域,注释…仍然只存储在内存中,因此如果广泛使用,可能需要大量内存。

五、POI向Excel读操作的演示

测试数据:
在这里插入图片描述

1.poi读03版本excel

@Test
public void testRead03() throws Exception{// 1.获取操作文件输入流InputStream in = new FileInputStream("F:/PoiTest/01.xls");// 2.创建workbookWorkbook workbook = new HSSFWorkbook(in);// 3.通过workbook获取工作表sheetSheet sheet = workbook.getSheetAt(0);// 4.通过sheet获取第一行rowRow row = sheet.getRow(0);// 5.通过row获取第一列cell1、第二列cell2、第三列cell3Cell cell1 = row.getCell(0);Cell cell2 = row.getCell(1);Cell cell3 = row.getCell(2);// 6.通过cell获取三列的内容String stringCellValue1 = cell1.getStringCellValue();String stringCellValue2 = cell2.getStringCellValue();String stringCellValue3 = cell3.getStringCellValue();// 输出单元内容System.out.println(stringCellValue1);System.out.println(stringCellValue2);System.out.println(stringCellValue3);// 7.操作结束,关闭文件in.close();
}

在这里插入图片描述

2.poi读07版本excel

@Test
public void testRead03() throws Exception{// 1.获取操作文件输入流InputStream in = new FileInputStream("F:/PoiTest/01.xlsx");// 2.创建workbookWorkbook workbook = new XSSFWorkbook(in);// 3.通过workbook获取工作表sheetSheet sheet = workbook.getSheetAt(0);// 4.通过sheet获取第一行rowRow row = sheet.getRow(0);// 5.通过row获取第一列cell1、第二列cell2、第三列cell3Cell cell1 = row.getCell(0);Cell cell2 = row.getCell(1);Cell cell3 = row.getCell(2);// 6.通过cell获取三列的内容String stringCellValue1 = cell1.getStringCellValue();String stringCellValue2 = cell2.getStringCellValue();String stringCellValue3 = cell3.getStringCellValue();// 输出单元内容System.out.println(stringCellValue1);System.out.println(stringCellValue2);System.out.println(stringCellValue3);// 7.操作结束,关闭文件in.close();}

六、poi读取不同类型的数据

测试数据:

在这里插入图片描述

@Test
public void testCellType() throws Exception {InputStream in = new FileInputStream("F:/PoiTest/01.xls");Workbook workbook = new HSSFWorkbook(in);Sheet sheet = workbook.getSheetAt(0);// 读取标题所有内容Row rowTitle = sheet.getRow(0);if (rowTitle != null) {// 行不为空// 读取cellint cellCount = rowTitle.getPhysicalNumberOfCells();for (int cellNum = 0; cellNum < cellCount; cellNum++) {Cell cell = rowTitle.getCell(cellNum);if (cell != null) {int cellType = cell.getCellType();String cellValue = cell.getStringCellValue();System.out.print(cellValue + "|");}}System.out.println();}// 读取商品列表数据int rowCount = sheet.getPhysicalNumberOfRows();for (int rowNum = 1; rowNum < rowCount; rowNum++) {Row rowData = sheet.getRow(rowNum);if (rowData != null) {// 行不为空// 读取cellint cellCount = rowTitle.getPhysicalNumberOfCells();for (int cellNum = 0; cellNum < cellCount; cellNum++) {System.out.print("【" + (rowNum + 1) + "-" + (cellNum + 1) + "】");Cell cell = rowData.getCell(cellNum);if (cell != null) {int cellType = cell.getCellType();//判断单元格数据类型String cellValue = "";switch (cellType) {case HSSFCell.CELL_TYPE_STRING://字符串System.out.print("【STRING】");cellValue = cell.getStringCellValue();break;case HSSFCell.CELL_TYPE_BOOLEAN://布尔System.out.print("【BOOLEAN】");cellValue = String.valueOf(cell.getBooleanCellValue());break;case HSSFCell.CELL_TYPE_BLANK://空System.out.print("【BLANK】");break;case HSSFCell.CELL_TYPE_NUMERIC:System.out.print("【NUMERIC】");//cellValue = String.valueOf(cell.getNumericCellValue());if (HSSFDateUtil.isCellDateFormatted(cell)) {//日期System.out.print("【日期】");Date date = cell.getDateCellValue();cellValue = new DateTime(date).toString("yyyy-MM-dd");} else {// 不是日期格式,则防止当数字过长时以科学计数法显示System.out.print("【转换成字符串】");cell.setCellType(HSSFCell.CELL_TYPE_STRING);cellValue = cell.toString();}break;case Cell.CELL_TYPE_ERROR:System.out.print("【数据类型错误】");break;}System.out.println(cellValue);}}}}in.close();
}

测试结果:

在这里插入图片描述


http://chatgpt.dhexx.cn/article/FyDroaid.shtml

相关文章

C# 加载DotNetBar组件

C#作为前端的开发软件&#xff0c;使用的人很多&#xff0c;但是原生的C#界面较为简陋&#xff0c;已经不能满足公司级的开发工作了&#xff0c;今天这篇博客的主要内容是讲一下怎么在C#端使用一个可以提升界面美感的第三方控件&#xff0c;DotNetBar 首先去官网下载最新的DotN…

DevComponents.DotNetBar2 美化包使用以及验证教程

使用这个美化包是在别人项目上看到的&#xff0c;遇到一些懵逼问题&#xff0c;不断总结&#xff0c;所以写一下教程 DotNetBar 美化包控件不可编辑问题&#xff1a; 如图&#xff1a; 解决办法&#xff1a; 安装DotNetBar 这个软件&#xff08;有试用版&#xff09;&#xff…

winform DevComponents.DotNetBar2 添加到工具栏方法

当C#项目引入皮肤组件&#xff0c;或其他组件是&#xff0c;发现工具框里面没有引用的组件怎么办&#xff1f; 1.组件的引用 我是把下载好的*.dll组件&#xff0c;复制到项目的\bin\Debug\路径下&#xff0c;然后在项目处右键-->添加引用&#xff0c;这样组件就引入项目了…

DotNetBar控件的多文档界面的实现

DotNetBar是一个不错的DotNET控件套装&#xff0c;原来是一个DLL文件&#xff0c;能够做出很漂亮的界面效果&#xff0c;记得在8.0以前的版本&#xff0c;好像实现多文档界面稍显得麻烦一些&#xff0c;我的Winform框架、WCF框架虽然也提供了这样多文档的界面&#xff0c;不过都…

C#之DotNetBar2使用方法 - itemPanel1

用itemPanel做个按钮菜单&#xff0c;模拟用来操控开关按钮 对象buttonItem1的属性&#xff08;itempanel可以添加的子控件列表对象&#xff0c;根据需要选择&#xff0c;这里用到的Button&#xff09; 可以用控件自带的样式&#xff0c;也可以用代码控制&#xff0c;也可以预先…

winfrom DotNetBar sideNav控件使用问题

sideNav初始UI 在最开始的界面&#xff0c;不知道设置了什么东西&#xff0c;然后没有那个东西 最后又新建了个项目&#xff0c;一个一个对比参数。还是没找到&#xff01;倒是发现几个其他的参数属性 在这里记录下 这是分别对应的是对sideNav的sideNavPanel的折叠 最大化 隐藏…

界面控件DotNetBar for WinForms使用教程:highlight组件使用教程

DotNetBar for WinForms是一个拥有89个组件的用户界面控件套包&#xff0c;用户可以使用Visual Studio 2005-2015轻松地创建专业的用户界面。十多年来DotNetBar帮助开发人员轻松地创建易用的专业Windows Forms (WinForms) 用户界面。DotNetBar是全世界第一个引入全功能Office 2…

C#之DotNetBar2使用方法 - superTabControl1

C#版本&#xff1a;DevComponents.DotNetBar2 14.1.0 &#xff08;可以搜下各种版本&#xff09; 常用的控件使用属性&#xff0c;方法&#xff1b; 1&#xff09;superTabControl1 关闭和菜单设置方法 visibletrue/false closebox :关闭当前选中的TAB menubox:切换tab的菜…

DevComponents.DotNetBar2之SuperTabControl使用技巧

关于类似SuperTabControl的使用如何动态调整其TAB标签的顺序问题&#xff0c;搜了全网也没有找到类似答案&#xff0c;都提到tab键的顺序或者是通过控件界面进行调整其顺序&#xff0c;都不是想要的结果&#xff0c;有个网友问的类似问题但是没有一个答案可用。经过反复测试总结…

界面控件DotNetBar for WinForms使用教程:LayoutControl详解(二)

DotNetBar for WinForms是一个拥有89个组件的用户界面控件套包&#xff0c;用户可以使用Visual Studio 2005-2015轻松地创建专业的用户界面。十多年来DotNetBar帮助开发人员轻松地创建易用的专业Windows Forms (WinForms) 用户界面。 点击下载DotNetBar for WinForms最新试用版…

DotNetBar布局(一)

相信大家搞.NET桌面程序开发都会用到一些界面布局的组件&#xff0c;常用的由DotNetBar和devexpress。今天主要将DotNetBar在项目中布局简单介绍一下&#xff0c;个人感觉这个控件还是有很多bug的&#xff0c;不知道什么时候就出现莫名奇妙的排版问题错误。比如突然在设计视图D…

dotnetbar-SuperTabControl禁止调整顺序

superTabCtl.ReorderTabsEnabled false; 禁止调整TAB顺序 superTabCtl.CloseButtonOnTabsAlwaysDisplayedfalse; 禁止x关闭按钮一直在TAB上显示 superTabCtl.CloseButtonOnTabsVisibletrue/false;关闭按钮是否可见 注意&#xff1a; superTabitem.CloseButtonVisibletru…

Visual Studio 2019 中使用 DotNetBar

1、下载并安装DotNetBarSetupTrial 2、在新建项目或者现有项目中进行引用&#xff0c;找到DotNetBar安装路径中需要用到的dll引用&#xff0c;引用路径正确是关键 3、在工具箱中添加选项卡&#xff0c;加载需要用到的控件 先在工具箱空白处添加选项卡&#xff0c;方便管理&am…

DotNetBar for WinForms使用教程:图表控件用户指南(一)

DotNetBar for WinForms是一个拥有89个组件的用户界面控件套包&#xff0c;用户可以使用Visual Studio 2005-2015轻松地创建专业的用户界面。十多年来DotNetBar帮助开发人员轻松地创建易用的专业Windows Forms (WinForms) 用户界面。DotNetBar是全世界第一个引入全功能Office 2…

c# 使用dotnetbar 控件绘制曲线图形

废话不说,直接上过程 加载dotnetbar库后,将chartcontrol控件拖动到界面上,选择line polt 增加一个按钮,绘制曲线功能 private void buttonX26_Click(object sender, EventArgs e) { CreateChartSeries1(); } public void CreateChart…

经典:DotNetBar Suite UI 7.9 for WPF Crack

创建专业的 WPF 应用程序 DotNetBar Suite for WPF 是超过 38 个本机 Windows Presentation Foundation 控件的工具箱&#xff0c;用于创建专业的 WPF 应用程序。 Office 2016 类样式添加到功能区、日程安排和其他控件... 我们痴迷于控制性能和像素级细节。我们很自豪地说&…

DotNetBar SuperGridControl控件

1.添加表头 sgc.PrimaryGrid.SelectionGranularity SelectionGranularity.Row;//点击选中一行DevComponents.DotNetBar.SuperGrid.GridColumn gc null;gc new DevComponents.DotNetBar.SuperGrid.GridColumn("ID");sgc.PrimaryGrid.Columns.Add(gc);gc new DevCo…

DotNetBar第三方控件详解

DotNetBar是一款性价比很强的界面控件&#xff0c;带有56个Windows Form 控件的工具箱&#xff0c;使开发人员可以轻而易举地创建出专业美观的Windows Form应用程序用户界面&#xff0c;控件全部采用C#编写&#xff0c;引入了全部Office 2007 style Ribbon控件、Office 2003 of…

C#界面控件DotNetBar使用详解

一般来说&#xff0c;运用传统的界面控件元素&#xff0c;合理设计布局&#xff0c;能够设计出比较中规中矩的标准界面&#xff1b;利用一些换肤的控件或者部分界面组件&#xff0c;能够设计出相对好看一些的界面效果&#xff0c;如以前很盛行的ActiveSkin、IrisSkin和DotNetSk…

DotNetBar 14.1.X 安装+源码=不错选择

DotNetBar官方版是一款功能强大的UI桌面控件套包&#xff0c;能为用户提供了海量的控件&#xff0c;能够完美兼容Visual Studio 2005-2019等版本&#xff0c;为用户的开发工作提供了帮助。软件提供了工具栏、滑动面板、功能区超级菜单等功能&#xff0c;满足用户的各种开发控件…