java的POI操作Excel文件
java获取excel文件内容的方法
一、介绍在开发过程中,我们经常会遇到需要读取Excel文件内容的情况。
而Java作为一种广泛应用的编程语言,具有丰富的库和功能,使得它成为一种很好的选择。
本文将介绍如何使用Java来获取Excel文件的内容,并将分为以下几个部分来进行讲解。
二、使用POI库进行Excel文件操作POI(Poor Obfuscation Implementation)是Apache基金会的一个开源项目,它为Java程序提供了读取和写入Microsoft Office格式文件的功能。
具体来说,POI库中的HSSF模块可以用于读取和操作Excel文件。
以下是使用POI库进行Excel文件操作的步骤。
1. 引入POI库首先需要引入POI库的相关依赖。
可以通过Maven来引入POI库,添加以下依赖到项目的pom.xml文件中即可:```xml<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. 读取Excel文件接下来,我们可以通过POI库的相关类来读取Excel文件。
首先需要创建一个文件输入流来读取Excel文件,然后通过HSSFWorkbook类来加载文件内容,最后可以通过遍历的方式获取Excel文件的内容。
以下是一个简单的示例:```javaFileInputStream file = new FileInputStream("example.xls"); HSSFWorkbook workbook = new HSSFWorkbook(file); HSSFSheet sheet = workbook.getSheetAt(0);for (Row row : sheet) {for (Cell cell : row) {// 处理单元格的内容}}```3. 处理Excel文件内容在读取Excel文件内容后,我们可以通过POI库提供的类来处理Excel 文件的内容,比如获取单元格的值、设置单元格的值等操作。
poi excel公式处理
在Excel中,可以使用公式来处理POI(Poor Obfuscation Implementation)文件。
POI是Apache软件基金会的一个开源项目,用于读取、写入和操作Microsoft Office格式的文件,包括Excel。
要在Excel中处理POI文件,可以遵循以下步骤:
1. 引入POI库:首先,确保您的Java项目中已引入POI库的相关依赖。
您可以在Maven或Gradle构建工具中添加POI的依赖项。
2. 创建Excel工作簿:使用POI的API,您可以创建一个新的Excel工作簿对象。
例如,在POI中,HSSFWorkbook类用于创建一个新的Excel文件。
3. 获取工作表对象:一旦您有了Excel工作簿对象,您可以使用它来获取特定的工作表对象。
例如,HSSFSheet类可用于获取一个工作表。
4. 处理单元格数据:您可以使用POI的API来读取和写入单元格数据。
例如,HSSFRow和HSSFCell类可用于获取行和单元格对象,以进行数据处理。
5. 应用公式:POI还提供了对Excel公式的支持。
您可以使用setCellFormula()方法将公式应用于单元格。
6. 保存Excel文件:完成数据处理和公式应用后,您可以使用POI的API将Excel 文件保存到指定的位置。
例如,使用HSSFWorkbook类的write()方法将工作簿对象写入文件。
通过遵循上述步骤,您可以在Java中使用POI库处理Excel文件,包括应用公式到单元格中。
这样,您可以读取、修改和生成包含公式的POI Excel文件。
1。
java使用poi(XSSFWorkbook)读取excel(.xlsx)文件
java使⽤poi(XSSFWorkbook)读取excel(.xlsx)⽂件经过⼀番搜索发现,java操纵excel⽂件常⽤的有jxl和poi两种⽅式,孰好孰坏看⾃⼰需求⽽定。
其中最主要的区别在于jxl不⽀持.xlsx,⽽poi⽀持.xlsx这⾥介绍的使⽤poi⽅式(XSSFWorkbook),实际上poi提供了HSSFWorkbook和XSSFWorkbook两个实现类。
区别在于HSSFWorkbook是针对.xls⽂件,XSSFWorkbook是针对.xslx⽂件。
⾸先明确⼀下基本概念: 先创建⼀个⼯作簿,⼀个⼯作簿可以有多个⼯作表,⼀个⼯作表可以有多个⾏,⼀个⾏可以有多个单元格 ⼯作簿 ----------->XSSFWorkbook ⼯作表 ----------->XSSFSheet ⾏ ----------->XSSFRow 单元格 ----------->XSSFCell下图为创建的student.xlsx的内容:导⼊依赖:<!--poi--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.0</version></dependency>读取student.xlsx⽂件代码:1package com.zjk.testexcel;23import ermodel.*;4import java.io.FileInputStream;5import java.io.IOException;67/**8 * @Auther: zjk9 * @Date: 2019/8/3010 * @Description:11*/12public class TestExcel1 {13public static void main(String[] args) {14try {15//创建⼯作簿16 XSSFWorkbook xssfWorkbook = new XSSFWorkbook(new FileInputStream("D:\\test-excel\\student.xlsx"));17 System.out.println("xssfWorkbook对象:" + xssfWorkbook);18//读取第⼀个⼯作表(这⾥的下标与list⼀样的,从0开始取,之后的也是如此)19 XSSFSheet sheet = xssfWorkbook.getSheetAt(0);20 System.out.println("sheet对象:" + sheet);21//获取第⼀⾏的数据22 XSSFRow row = sheet.getRow(0);23 System.out.println("row对象:" + row);24//获取该⾏第⼀个单元格的数据25 XSSFCell cell0 = row.getCell(0);26 System.out.println("cello对象:" + cell0);27 } catch (IOException e) {28 e.printStackTrace();29 }30 }31 }控制台输出结果:可以发现具体到⾏对象时,就解析成xml⽂件了xssfWorkbook对象: Name: /xl/workbook.xml - Content Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xmlsheet对象: Name: /xl/worksheets/sheet1.xml - Content Type: application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xmlrow对象: <xml-fragment r="1" spans="1:4" xmlns:r="/officeDocument/2006/relationships" xmlns:xdr="/drawingml/2006/spreadsheetDraw <main:c r="A1" t="s"> <main:v>0</main:v> </main:c> <main:c r="B1" t="s"> <main:v>1</main:v> </main:c> <main:c r="C1" t="s"> <main:v>2</main:v> </main:c> <main:c r="D1" t="s"><main:v>3</main:v></main:c></xml-fragment>cello对象:姓名以上可以实现了读取某⾏某单元格的数据,那么接下来就该读取整个表的所有数据了:package com.zjk.testexcel;import ermodel.XSSFCell;import ermodel.XSSFRow;import ermodel.XSSFSheet;import ermodel.XSSFWorkbook;import java.io.FileInputStream;import java.io.IOException;/*** @Auther: zjk* @Date: 2019/8/30* @Description:*/public class TestExcel2 {public static void main(String[] args) {try {//创建⼯作簿XSSFWorkbook xssfWorkbook = new XSSFWorkbook(new FileInputStream("D:\\test-excel\\student.xlsx"));System.out.println("xssfWorkbook对象:" + xssfWorkbook);//读取第⼀个⼯作表XSSFSheet sheet = xssfWorkbook.getSheetAt(0);System.out.println("sheet对象:" + sheet); //获取最后⼀⾏的num,即总⾏数。
java_POI教程
java_POI教程
POI(Poor Obfuscation Implementation)是一个Apache基金会下
的开源项目,全称为Apache POI,提供了Java程序操作Office文档的
功能。
其中最常用的组件为POI.HSSF用于操作Excel文档、POI.XSSF用
于操作Excel 2024及以上版本的文档、POI.HSLF用于操作PowerPoint
文档以及POI.XSLF用于操作PowerPoint 2024及以上版本的文档。
1. Excel文档操作
2. Excel图表生成
POI.HSSF也支持在Excel文档中生成各种图表。
可以通过Sheet对
象的createDrawingPatriarch(方法创建绘图对象,并使用绘图对象的createChart(方法创建图表。
通过图表对象可以设置图表的标题、图例、
数据源等属性,并使用createData(方法创建数据区域,再使用setDataFormula(方法设置数据源等。
3. PowerPoint文档操作
4. Word文档操作
以上是POI的基本使用方法和常见功能的简要介绍。
实际使用POI时,还可以通过POI提供的API进行更加复杂的操作,例如合并单元格、设置
样式、添加图片等。
此外,POI还支持读写不同格式的Office文档,
如.xlsx、pptx和.docx等。
poi多sheet解析 -回复
poi多sheet解析-回复POI是一款强大的Java库,用于处理Microsoft Office文档,包括Excel、Word和PowerPoint等文件。
其中,POI的Excel模块可以解析Excel 文件,并且支持多个工作表(sheet)的解析。
在本文中,我们将一步一步地回答有关POI多个工作表解析的问题。
在开始之前,首先要确保已经配置好POI库。
可以通过在项目的构建文件(如pom.xml)中添加POI的依赖来实现。
这样,我们就能够开始POI 多个工作表解析的过程了。
第一步是读取Excel文件。
我们可以使用POI库中的Workbook类来实现这一步骤。
首先,通过WorkbookFactory类的静态方法create()来创建一个Workbook对象。
然后,使用Workbook对象的getSheet()方法来获取想要解析的工作表。
例如,如果想解析第一个工作表,可以使用getSheetAt(0)方法。
接下来,我们需要确定工作表中的数据范围。
POI提供了Row和Cell类来处理Excel表中的行和单元格数据。
通过使用Sheet对象的getRow()方法,我们可以获取特定行的数据。
通过使用Row对象的getCell()方法,我们可以获取特定单元格的数据。
同时,POI还提供了getLastRowNum()方法,以获取该工作表的最后一行的索引。
一旦我们确认了数据范围,就可以开始解析数据了。
使用循环,逐行读取工作表中的数据。
例如,可以使用for循环从第一行(一般是索引为1)开始,一直迭代到最后一行。
然后,在每一行中,使用getCell()方法获取特定单元格的值,将其存储在变量中,以供后续处理使用。
可以根据需要将这些数据存储在集合中,例如List或Map。
另外,如果Excel文件中的工作表与特定主题相关,可以通过筛选特定条件的数据来进一步处理。
例如,可以使用if语句来判断某个单元格的值是否满足某个条件,如果满足,则存储在集合中。
java poi excel 读写
java poi excel 读写摘要:1.Java POI 简介2.Java POI Excel 读写功能3.使用Java POI 读取Excel 文件4.使用Java POI 写入Excel 文件5.总结与展望正文:Java POI 是一个开源的Java 库,它允许Java 开发人员操作Microsoft Office 文档,如Word、Excel、PowerPoint 等。
其中,Java POI Excel 提供了读取和写入Excel 文件的功能。
1.Java POI 简介Java POI 是一个基于Apache License 2.0 协议的开源项目,它为Java 开发人员提供了一种操作Microsoft Office 文档的方法。
Java POI 支持读取和写入多种Office 文档格式,包括Excel、Word、PowerPoint 等。
通过使用Java POI,开发人员可以在不安装Microsoft Office 的情况下,对Office 文档进行操作。
2.Java POI Excel 读写功能Java POI Excel 提供了丰富的API,允许Java 开发人员对Excel 文件进行读取和写入操作。
Excel 文件主要包括两种类型:XLS 和XLSX。
Java POI 支持这两种文件格式,同时还支持读取和写入XML 格式的Excel 文件。
3.使用Java POI 读取Excel 文件使用Java POI 读取Excel 文件主要包括以下几个步骤:(1) 导入相关的Java POI 库:```javaimport ermodel.*;import ermodel.XSSFWorkbook;import java.io.FileInputStream;import java.io.IOException;```(2) 创建一个Workbook 对象,表示Excel 文件:```javaWorkbook workbook = new XSSFWorkbook(new FileInputStream("example.xlsx"));```(3) 获取工作表:```javaSheet sheet = workbook.getSheetAt(0);```(4) 遍历工作表中的行和列,获取单元格数据:```javafor (Row row : sheet) {for (Cell cell : row) {String cellValue = getCellValue(cell);System.out.print(cellValue + "t");}System.out.println();}```4.使用Java POI 写入Excel 文件使用Java POI 写入Excel 文件主要包括以下几个步骤:(1) 创建一个新的Excel 文件:```javaWorkbook workbook = new XSSFWorkbook();```(2) 添加一个新的工作表:```javaSheet sheet = workbook.createSheet("Sheet1");```(3) 创建行:```javaRow row = sheet.createRow(0);```(4) 创建单元格,并设置单元格数据:```javaCell cell = row.createCell(0);cell.setCellValue("Hello, World!");```(5) 将数据写入Excel 文件:```javatry (FileOutputStream fileOut = newFileOutputStream("output.xlsx")) {workbook.write(fileOut);} catch (IOException e) {e.printStackTrace();}```5.总结与展望Java POI 是一个功能强大的Java 库,它允许Java 开发人员轻松地操作Microsoft Office 文档,如Excel、Word、PowerPoint 等。
java poi的使用
java poi的使用JavaPOI是一种流行的Java库,用于在Java中读取和写入Microsoft Office格式的文件,例如Excel、Word和PowerPoint。
它提供了丰富的API来处理这些文件,包括创建、修改、读取和写入文件。
Java POI可以与多种文件格式一起使用,包括旧版本的Microsoft Office文件(.xls),以及新版本的Open Office XML文件(.xlsx)。
使用Java POI可以实现许多功能,例如:1. 读取和解析Excel文件中的数据2. 写入数据到Excel文件中3. 创建Excel文件4. 修改Excel文件中的数据5. 处理Excel文件中的格式和样式6. 读取和解析Word文件中的数据7. 写入数据到Word文件中8. 创建Word文件9. 修改Word文件中的数据10. 处理Word文件中的格式和样式11. 读取和解析PowerPoint文件中的数据12. 写入数据到PowerPoint文件中13. 创建PowerPoint文件14. 修改PowerPoint文件中的数据15. 处理PowerPoint文件中的格式和样式在使用Java POI时,需要了解一些基本概念,例如:1. Workbook:Excel工作簿,包含多个Sheet2. Sheet:Excel工作表,包含多个Row3. Row:Excel行,包含多个Cell4. Cell:Excel单元格,包含一个值和一个样式Java POI提供了多个类和方法来操作这些基本元素,可以根据需要选择合适的API来实现所需的功能。
总之,Java POI是Java开发中一个非常强大的工具,可以帮助我们处理Microsoft Office格式的文件。
熟练掌握Java POI的使用,可以提高我们的工作效率,减少人力成本,也可以让我们的应用程序更加灵活和实用。
java的poi批注规则
java的poi批注规则Apache POI是一个用于读写Microsoft Office文件的开源Java库。
在POI中,批注是指在Excel单元格中添加的注释或说明。
批注可以帮助用户了解特定单元格中数据的含义或提供其他相关信息。
在使用POI库操作Excel文件时,可以通过POI提供的API来操作批注。
在POI中,要操作Excel单元格的批注,首先需要创建一个HSSFPatriarch对象,然后通过HSSFPatriarch对象的createComment方法创建一个HSSFComment对象,接着将HSSFComment对象与特定的单元格关联起来。
以下是一些关于POI批注的规则和操作步骤:1. 创建HSSFPatriarch对象:在POI中,可以通过HSSFWorkbook对象的createSheet方法创建一个HSSFSheet对象,然后通过HSSFSheet对象的createDrawingPatriarch方法创建一个HSSFPatriarch对象,用于管理单元格中的注释。
2. 创建HSSFComment对象:可以通过HSSFPatriarch对象的createComment方法创建一个HSSFComment对象,该方法需要传入一个HSSFClientAnchor对象作为参数,用于指定批注的位置和大小。
3. 关联批注与单元格:通过HSSFCell对象的setCellComment方法将HSSFComment 对象与特定的单元格关联起来,从而在Excel中显示批注。
4. 设置批注内容和格式:可以通过HSSFComment对象的setString方法设置批注的内容,通过setVisible方法设置批注是否可见,通过setAuthor方法设置批注的作者等。
5. 读取和修改批注:可以通过HSSFCell对象的getCellComment方法获取单元格的批注,然后对批注进行修改或删除操作。
总之,在使用POI库操作Excel文件时,可以通过上述规则和操作步骤来添加、修改和删除单元格的批注,从而实现对Excel文件中批注的管理和控制。
POI实现Java程序操作Excel报表的应用分析
ti i 、“ - -Z  ̄ * np 3 1# l
/ / 产生工作簿对象
H S S et he =w rbo .et he ; 产 生T S F h e set ok ok r e et / ca S 0
作表 对 象
, / 设置 第一个工作表 的名称为f s he, i t et设置字符 rS
p bi s t tn l i =tsxs. E cl u l t i Sr gxs l ” t l1/ xe c ac i F e e . 『/ 文件的
名称 p bis t ima (tn g[{ ul ac o i Sr g rs ) c t iv d n i a ]
t{ r y
可以用纯Jy代码来读取、 aa 写入、 修改E cl xe 文件。
二 P ! 用配 置 O应
PI O 包可以在A ah p ce官方 网站下载 。 下载 后, 解压
宿得 到如 图 1 所示 的 目录结 构 。 应 用 中主要 用p i3 一 在 o . _ 1
p bi ls rae x eR p r { u l cas e tE c l e ot c C
/ / 往第一个单元格中写入信息
clsteV le” 试 消 息” e. Cl a ( 1e l u 测 ) ;
FlO tuS em u =n wFlO tuSra xsi ) i up tt a f t e i up tt m( Fl; e r O e e l e
poi常用方法
poi常用方法Poi是指POI(Poor Obfuscation Implementation),是一份Apache下开源的Java组件,主要用于操作Excel格式的文档。
Poi功能丰富,应用广泛,下面将围绕poi常用方法给大家做一篇介绍。
1.导入poi包在项目工程中,我们需要在pom.xml中引用poi相关的jar包,也可以在项目java源码中手动引用。
如果不想下载poi组件,也可以根据maven的配置文件向maven中心仓库请求自动下载。
2.创建工作簿使用poi操作Excel文档,第一步需要创建一个工作簿对象。
我们可以通过创建一个HSSFWorkbook对象或XSSFWorkbook对象来实现。
```HSSFWorkbook wb = new HSSFWorkbook();//创建xls文件XSSFWorkbook wb = new XSSFWorkbook();//创建xlsx文件```3.创建工作表Excel文档通常是由多个工作表组成,我们通过POI也可以创建工作表。
在创建工作簿之后,同样可以创建一个或多个工作表。
```HSSFSheet sheet = wb.createSheet();//创建xls工作表XSSFSheet sheet = wb.createSheet();//创建xlsx工作表```4.创建单元格Excel文档中常常有很多单元格,每个单元格都有固定的行和列。
POI也可以创建或修改单元格。
```HSSFRow row = sheet.createRow(0);//创建第一行HSSFCell cell = row.createCell(0);//创建第一列第一个单元格cell.setCellValue("这是一个单元格的值");//设置单元格的值```5.读取单元格我们可以使用POI来读取Excel文档中的单元格。
使用一个HSSFCell 对象可以读取一行数据的值。
java中poi解析Excel文件版本问题解决办法
java中poi解析Excel⽂件版本问题解决办法poi解析Excel⽂件版本问题解决办法poi解析Excel⽂件时有两种格式:HSSFWorkbook格式⽤来解析Excel2003(xls)的⽂件XSSFWorkbook格式⽤来解析Excel2007(xlsx)的⽂件如果⽤HSSFWorkbook解析Excel2007(xlsx)时就会报异常:“The supplied data appears to be in the Office 2007+ XML.You are calling the part of POI that deals with OLE2 Office Documents.You need to call a different part of POI to process this data (eg XSSF instead of HSSF)”因为HSSFWorkbook和XSSFWorkbook都实现了Workbook接⼝,所以我们可以⽤Workbook来解析两个版本的Excel。
代码如下:try{//将⽂件的输⼊流转换成WorkbookWorkbook wb = WorkbookFactory.create(numFile.getInputStream());//获得第⼀个⼯作表Sheet sheet = wb.getSheetAt(0);//获得第⼀⾏Row row = sheet.getRow(0);//获得第⼀⾏的第⼀列Cell cell = row.getCell(0);}catch (Exception e){e.printStackTrace();}以上就是poi解析Excel⽂件版本问题解决办法的详解,如有疑问请留⾔或者到本站社区交流讨论,谢谢⼤家对本站的⽀持!。
POI操作大全(动态合并单元格为单元格生成一个自定义的数据显示格式自定义公式计算结果生
POI操作大全(动态合并单元格为单元格生成一个自定义的数据显示格式自定义公式计算结果生POI是一个用于操作Microsoft Office格式文件的Java库。
通过POI库,可以实现对Excel、Word和PowerPoint文件的读写操作。
本文将介绍POI库的一些常用操作,包括动态合并单元格、为单元格生成自定义的数据显示格式、自定义公式计算结果等。
一、动态合并单元格在Excel中,可以将多个相邻的单元格合并成一个单元格,以便显示更大的数据块。
POI库可以很方便地实现对合并单元格的操作。
1.创建合并区域:```javaCellRangeAddress region = new CellRangeAddress(rowStart, rowEnd, colStart, colEnd);sheet.addMergedRegion(region);```其中,rowStart和rowEnd表示合并区域的起始行和结束行,colStart和colEnd表示合并区域的起始列和结束列。
2.设置合并单元格的值:```javaCell cell = sheet.getRow(rowStart).createCell(colStart);cell.setCellValue("合并单元格的值");```这里,我们取合并区域的起始行和起始列,设置单元格的值。
二、为单元格生成一个自定义的数据显示格式在Excel中,可以对单元格的值设置格式,以便以不同的方式展示数据。
POI库提供了设置单元格格式的方法。
1.创建格式对象:```javaCellStyle cellStyle = workbook.createCellStyle(;```2.设置格式:```javaDataFormat dataFormat = workbook.createDataFormat(;short format = dataFormat.getFormat("自定义格式");cellStyle.setDataFormat(format);```其中,"自定义格式"是Excel中的一种格式化字符串。
poi读取xlsx文件原理
poi读取xlsx文件原理
POI读取XLSX文件的原理可以概括为以下几个步骤:
1.创建POI工作簿对象:首先,需要创建一个POI工作簿对象,该对象将代表Excel文件。
可以使用WorkbookFactory.create()方法来创建工作簿对象。
2.获取工作表对象:通过工作簿对象,可以获取到工作表对象。
可以使用getSheetAt()方法来获取特定索引的工作表对象,或者使用getSheetName()方法获取特定名称的工作表对象。
3.读取单元格数据:通过工作表对象,可以获取到单元格对象,并从中读取单元格数据。
可以使用getRow()方法获取行对象,然后使用getCell()方法获取单元格对象。
通过单元格对象,可以获取单元格的值、类型、格式等信息。
4.处理数据:在读取单元格数据后,可以根据需要进行数据处理。
例如,可以将数据存储到数据库中,或者将数据转换为其他格式。
5.关闭工作簿对象:最后,需要关闭工作簿对象,释放相关资源。
可以使用close()方法来关闭工作簿对象。
通过以上步骤,POI可以读取XLSX文件中的数据并进行处理。
需要注意的是,在使用POI读取Excel文件时,需要先安装相应的依赖库,例如Apache POI库。
同时,为了确保数据的准确性和完整性,需要对读取的数据进行校验和验证。
poi clonesheet用法 -回复
poi clonesheet用法-回复poi clonesheet用法:一步一步回答POI(Poor Obfuscation Implementation)是一个开源的Java类库,提供了许多用于操作Microsoft Office文档的功能。
POI项目的一个重要特性是可以通过POI库来创建和操作Excel文件。
在POI库中,有一个非常实用的功能叫做clonesheet。
这个功能允许我们在一个Excel文件中,复制一个已有的工作表,并在新的工作表中进行修改和编辑。
clonesheet的用法非常简单,但是却非常强大。
在本文中,我们将一步一步介绍和回答关于poi clonesheet用法的问题。
第一步:导入POI库要使用poi clonesheet功能,首先要确保已经导入了POI库。
POI库的最新版本可以从官方网站(第二步:创建一个Excel文件在Java中,可以使用Workbook来表示一个Excel文件。
我们可以通过调用WorkbookFactory的create方法来创建一个新的Excel文件。
javaWorkbook workbook = WorkbookFactory.create(newFile("path/to/excel.xlsx"));在这个例子中,我们创建了一个名为workbook的Workbook对象,并将它与一个已经存在的Excel文件进行关联。
第三步:复制一个工作表要使用poi clonesheet功能,我们首先需要获取要复制的工作表。
POI 库中的Workbook对象提供了getSheet方法来获取工作表。
我们可以通过调用这个方法,并传递工作表的名称或索引来获取工作表对象。
javaSheet sheetToClone = workbook.getSheet("Sheet1");在这个例子中,我们获取了名为"Sheet1"的工作表。
使用POI进行Excel操作的总结一——创建Workbook,Sheet,Row以及Cell
使⽤POI进⾏Excel操作的总结⼀——创建Workbook,Sheet,Row以及Cell前段时间,看在其他的⽹站上给出Excel⽂档的导⼊与导出操作,感觉很酷的样⼦,所以就学习了⼀下如何使⽤POI进⾏Excel的操作,现在对之前的学习过程进⾏⼀个总结。
⼀、现在普遍使⽤的Excel⽂档有xls以及xlsx这两种Excel⽂档,其中xls格式的Excel⽂档⼜分为5.0/95⼯作簿以及97-2003⼯作簿这两种。
需要注意的是,由于5.0/95⼯作簿的版本太低,现在的POI⽂档不再⽀持这种类型的Excel⽂档的读取⼯作,当试图读取这种类型的Excel⽂档的时候,POI会抛出⼀个异常(OldExcelFormatException)。
我现在使⽤的POI是3.14版本。
⼆、Workbook的创建1、由于Excel中存在xls以及xlsx这两种格式,所以创建⽅式也有所不同。
其中对于xls格式的⽂档,需要使⽤HSSFWorkbook来创建⼯作簿对象,⽽对于xlsx格式的Excel⽂档,则需要使⽤XSSFWrokbook来创建⼯作簿。
有⼀点需要注意的是,HSSFWorkbook与XSSFWorkbook 这两个类其实都是Workbook接⼝的⼀个实现类。
好了,下⾯就是创建⼯作簿对象的代码://创建⼀个不存在的excel⽂件private static Workbook createWorkbookIfNotExist(String fileName) throws Exception {Workbook wb = null;if(fileName.endsWith(".xls")) {wb = new HSSFWorkbook();} else if(fileName.endsWith(".xlsx")) {wb = new XSSFWorkbook();} else {throw new Exception("⽂件类型错误!");}try{OutputStream output = new FileOutputStream(fileName);wb.write(output);}catch(FileNotFoundException e) {System.out.println("⽂件创建失败,失败原因为:" + e.getMessage());throw new FileNotFoundException();}System.out.println(fileName + "⽂件创建成功!");return wb;}//创建⼀个新的或者已存在的Excel⽂档的Workbookpublic static Workbook createWorkbook(String fileName) throws Exception {InputStream input = null;Workbook wb = null;try{input = new FileInputStream(fileName);wb = WorkbookFactory.create(input);} catch(FileNotFoundException e) {System.out.println("要打开的⽂件不存在,正试图创建该⽂件,请稍后……!");wb = createWorkbookIfNotExist(fileName);} catch(OldExcelFormatException e) {System.out.println("⽂件打开失败,原因:要打开的Excel⽂件版本过低!");throw new OldExcelFormatException("⽂件版本过低");} finally {if(input != null) {input.close();}}return wb;}2、创建Sheet的时候,同样的也存在HSSFSheet以及XSSHSheet这两种类型。
javaexcel解析常见方法
一、介绍在日常工作中,我们经常会遇到需要处理Excel文件的情况。
而对于Java程序员来说,对Excel文件进行解析是一项常见的任务。
本文将介绍一些常见的JavaExcel解析方法,希望能够帮助大家更好地处理Excel文件。
二、使用POI库解析Excel1. POI库简介POI(Poor Obfuscation Implementation)是Apache软件基金会的开源项目,旨在提供Java程序操作Microsoft Office格式文件的功能。
在处理Excel文件时,可以使用POI库来完成读取、写入和修改Excel文件的操作。
2. 使用POI库解析Excel的基本步骤a. 创建一个输入流,将Excel文件加载到工作簿中。
b. 获取工作表,可以根据工作表的名称或索引来获取。
c. 遍历工作表,获取每一行的数据。
d. 遍历每一行,获取单元格的数值并进行相应的处理。
3. 代码示例```java// 读取Excel文件File file = new File("test.xlsx");FileInputStream fis = new FileInputStream(file); XSSFWorkbook workbook = new XSSFWorkbook(fis);// 获取工作表XSSFSheet sheet = workbook.getSheetAt(0);// 遍历工作表for (Row row : sheet) {// 遍历行for (Cell cell : row) {// 获取单元格的值String value = cell.getStringCellValue();// 进行相应的处理}}// 关闭流fis.close();```4. 注意事项使用POI库解析Excel时,需要注意处理空单元格、日期格式、数值类型等特殊情况,以确保解析的准确性。
三、使用EasyExcel库解析Excel1. EasyExcel库简介EasyExcel是阿里巴巴开源的一款针对大数据量Excel操作的Java库。
java中使用POI解析Excel文件
if(workbook.getSheetAt(numSheets) != null) {
HSSFSheet aSheet = workbook.getSheetAt(numSheets);// 获得一个sheet
NumberFormat formater = NumberFormat.getInstance();
formater.setGroupingUsed(false);
if(cell != null) {
switch(cell.getCellType()) {
case HSSFCell.CELL_TYPE_NUMERIC:
content.append(this.convertCell(cell)).append("\t"); //获得一个单元格的值
}
}
content.append("\n");
}
}
}
return content.toString();
cellValue = formater.format(cell.getNumericCellValue());
break;
case HSSFCell.CELL_TYPE_BLANK:
cellValue = cell.getStringCellValue();
break;
if (workbook.getSheetAt(numSheets) != null) {
XSSFSheet aSheet = workbook.getSheetAt(numSheets);// 获得一个sheet
Java学习笔记-EXCEL文件的读写操作
一、基于POI操作EXCEL文件1.<!-- POI依赖包-->2.<dependency>3.<groupId>org.apache.poi</groupId>4.<artifactId>poi</artifactId>5.<version>4.1.2</version>6.</dependency>7.<dependency>8.<groupId>org.apache.poi</groupId>9.<artifactId>poi-ooxml</artifactId>10.<version>4.1.2</version>11.</dependency>12.<dependency>13.<groupId>org.apache.poi</groupId>14.<artifactId>poi-ooxml-schemas</artifactId>15.<version>4.1.2</version>16.</dependency>17.<dependency>18.<groupId>xerces</groupId>19.<artifactId>xercesImpl</artifactId>20.<version>2.12.0</version>21.</dependency>EXCEL文件读操作示例如下:1.import ng.StringUtils;2.import ng.time.DateFormatUtils;3.import org.apache.poi.openxml4j.exceptions.OpenXML4JException;4.import org.apache.poi.openxml4j.opc.OPCPackage;5.import ermodel.*;6.import org.apache.poi.xssf.eventusermodel.XSSFReader;7.import org.apache.poi.xssf.model.SharedStringsTable;8.import org.apache.poi.xssf.model.StylesTable;9.import ermodel.XSSFCellStyle;10.import ermodel.XSSFRichTextString;11.import org.jdom2.Attribute;12.import org.jdom2.Document;13.import org.jdom2.Element;14.import org.jdom2.JDOMException;15.import org.jdom2.input.SAXBuilder;16.import org.platform.utils.date.DateFormatter;17.import org.slf4j.Logger;18.import org.slf4j.LoggerFactory;19.import org.xml.sax.*;20.import org.xml.sax.helpers.DefaultHandler;21.import org.xml.sax.helpers.XMLReaderFactory;22.import java.io.*;23.import java.text.DecimalFormat;24.import java.text.SimpleDateFormat;25.import java.util.ArrayList;26.import java.util.Date;27.import java.util.Iterator;28.import java.util.List;29.import java.util.function.Consumer;30.31.public class PoiExcelFileReader {32.private Logger LOG =LoggerFactory.getLogger(PoiExcelFileReader.class);33.enum XssfDataType {34.BOOL, ERROR, FORMULA, INLINESTR, SSTINDEX,NUMBER, DATE, NULL35.}36.public static final SimpleDateFormat SDF = DateFormatter.TIME.get();37.public static final DecimalFormat DF = new DecimalFormat("0");38.public static final int ERROR = 0;39.public static final int BOOLEAN = 1;40.public static final int NUMBER = 2;41.public static final int STRING = 3;42.public static final int DATE = 4;43.public static final String DATE_FORMAT_STR1 = "yyyy-MM-ddHH:mm:ss";44.public static final String DATE_FORMAT_STR2 = "yyyy/MM/ddHH:mm:ss";45.private boolean isExcel2007 = true;46.private InputStream inputStream = null;47.private InputStream sheetInputStream = null;48.private InputSource sheetInputSource = null;49.private XMLReader xmlReader = null;50.private List<PoiExcelRow> rowDataList = newArrayList<PoiExcelRow>();51.// 批量处理52.private Consumer<List<PoiExcelRow>> consumer = null;53.// 批量处理的阀值54.private Integer threshold = null;55.// 跳过表头的行数56.private Integer skipHeadLineCount = 0;57.58.public PoiExcelFileReader(InputStream in, String suffix,Consumer<List<PoiExcelRow>> consumer, int threshold) {59.this(in, suffix, consumer, threshold, 0);60.}61.62.public PoiExcelFileReader(InputStream in, String suffix,Consumer<List<PoiExcelRow>> consumer, int threshold,63.int skipHeadLineCount) {64.this.inputStream = in;65.this.isExcel2007 = "xls".equals(suffix.toLowerCase()) ? false :true;66.this.consumer = consumer;67.this.threshold = threshold;68.this.skipHeadLineCount = skipHeadLineCount;69.}70.71.public void parse() {72.if (isExcel2007) {73.try {74.init(OPCPackage.open(inputStream));75.} catch (Exception e) {76.LOG.error(e.getMessage(), e);77.}78.parseExcel2007();79.} else {80.parseExcel2003(inputStream);81.}82.}83.84.public List<PoiExcelRow> getRowDataList() {85.return this.rowDataList;86.}87.88./** 初始化将Excel转换为XML */89.private void init(OPCPackage pkg) throws IOException,OpenXML4JException, SAXException{90.XSSFReader xssfReader = new XSSFReader(pkg);91.SharedStringsTable sharedStringsTable =xssfReader.getSharedStringsTable();92.StylesTable stylesTable = xssfReader.getStylesTable();93.sheetInputStream =xssfReader.getSheet(getSheetId(xssfReader.getWorkbookData()));94.sheetInputSource = new InputSource(sheetInputStream);95.xmlReader = getXmlReader(sharedStringsTable, stylesTable);96.}97.98.private XMLReader getXmlReader(SharedStringsTablesharedStringsTable, StylesTable stylesTable) throws SAXException {99.XMLReader xmlReader =XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");100.ContentHandler contentHandler = newCustomHandler(sharedStringsTable, stylesTable);101.xmlReader.setContentHandler(contentHandler);102.return xmlReader;103.}104.105.private void parseExcel2007(){106.try {107.xmlReader.parse(sheetInputSource);108.} catch (Exception e) {109.LOG.error(e.getMessage(), e);110.} finally{111.if(sheetInputStream != null){112.try {113.sheetInputStream.close(); 114.} catch (IOException e) {115.LOG.error(e.getMessage(), e); 116.}117.}118.}119.}120.121.private String getSheetId(InputStream workbookDataInputStream) { 122.String sheetId = "rId1";123.BufferedReader br = null;124.try {125.br = new BufferedReader(newInputStreamReader(workbookDataInputStream));126.String line = null;127.loop:128.while (null != (line = br.readLine())) {129.if (line.startsWith("<workbook")) {130.InputStream in = null;131.try {132.in = newByteArrayInputStream(line.getBytes("UTF-8"));133.Document document = new SAXBuilder().build(in);134.Element rootElement = document.getRootElement();135.Iterator<Element> iterator = rootElement.getChildren().iterator();136.while(iterator.hasNext()) {137.Element element = iterator.next();138.if(!"sheets".equals(element.getName())) continue;139.List<Element> children = element.getChildren();140.for (int i = 0, iLen = children.size(); i < iLen; i++) {141.Element subElement = children.get(i);142.for (Attribute attribute : subElement.getAttributes()) {143.if ("id".equa 144.s 145.b 146.}147.}148.}149.}150.} catch (JDOMException e) {151.LOG.error(e.getMessage(), e);152.} finally {153.try {154.if (null != in) in.close();155.} catch (Exception e) {156.LOG.error(e.getMessage(), e);157.}158.}159.}160.}161.} catch (IOException e) {162.LOG.error(e.getMessage(), e);163.} finally {164.try {165.if (null != workbookDataInputStream) workbookDataInputStream.close();166.if (null != br) br.close();167.} catch (Exception e) {168.LOG.error(e.getMessage(), e); 169.}170.}171.return sheetId;172.}173.174.private class CustomHandler extends DefaultHandler {175.// 映射字符串176.private SharedStringsTable sharedStringsTable = null; 177.// 单元格样式178.private StylesTable stylesTable = null;179.// 读取值180.private String readValue = null;181.// 单元格类型182.private XssfDataType dataType = null;183.// 一行中数据文本184.private String[] rowStrings = null;185.// 一行中数据类型186.private int[] rowTypes = null;187.// 当前行索引188.private int rowIndex = 0;189.// 当前列索引190.private int columnIndex;191.private short formatIndex = -1;192.193.private CustomHandler(SharedStringsTable sharedStringsTable,StylesTable stylesTable) {194.this.sharedStringsTable = sharedStringsTable;195.this.stylesTable = stylesTable;196.}197.198.@Override199.public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {200.// 单元格201.if (qName.equals("c")) {202.this.columnIndex =getColumnIndex(attributes);203.String cellType = attributes.getValue("t"); 204.String cellStyle = attributes.getValue("s"); 205.this.dataType = XssfDataType.NUMBER; 206.if ("b".equals(cellType)) {207.this.dataType = XssfDataType.BOOL;208.} else if ("e".equals(cellType)) {209.this.dataType = XssfDataType.ERROR;210.} else if ("inlineStr".equals(cellType)) {211.this.dataType = XssfDataType.INLINESTR; 212.} else if ("s".equals(cellType)) {213.this.dataType = XssfDataType.SSTINDEX;214.} else if ("str".equals(cellType)) {215.this.dataType = XssfDataType.FORMULA; 216.} else if (cellStyle != null) {217.int styleIndex = Integer.parseInt(cellStyle);218.XSSFCellStyle style =stylesTable.getStyleAt(styleIndex);219.this.formatIndex = style.getDataFormat(); 220.}221.} else if (qName.equals("row")) {222.rowIndex++;223.// 获取该行的单元格数初始化数组224.int columnNumber =getColumnNumber(attributes);225.this.rowStrings = newString[columnNumber];226.this.rowTypes = new int[columnNumber]; 227.}228.readValue = "";229.}230.231.@Override232.public void endElement(String uri, String localName, String qName) throws SAXException {233.// 单元格的值234.if (qName.equals("v")) {235.switch (this.dataType) {236.case BOOL: {237.rowStrings[columnIndex] = readValue.charAt(0) == '0' ? "FALSE" : "TRUE"; 238.rowTypes[columnIndex] = BOOLEAN;239.break;240.}241.case ERROR: {242.rowStrings[columnIndex] = "ERROR:" + readValue.toString();243.rowTypes[columnIndex] = ERROR;244.break;245.}246.case INLINESTR: {247.rowStrings[columnIndex] = new XSSFRichTextString(readValue).getString(); 248.rowTypes[columnIndex] = STRING;249.break;250.}251.case SSTINDEX: {252.rowStrings[columnIndex] =sharedStringsTable.getItemAt(Integer.parseInt(readValue)).getString();253.rowTypes[columnIndex] = STRING; 254.break;255.}256.case FORMULA: {257.rowStrings[columnIndex] = readValue;258.rowTypes[columnIndex] = STRING;259.break;260.}261.case NUMBER: {262.// 判断是否是日期格式263.if (formatIndex != -1 && DateUtil.isADateFormat(formatIndex, readValue)) {264.Date date =DateUtil.getJavaDate(Double.parseDouble(readValue));265.if (null != date) {266.rowStrings[columnIndex] = DateFormatUtils.format(date, DATE_FORMAT_STR1); 267.} else { 268.rowStrings[columnIndex] = readValue;269.}270.rowTypes[columnIndex] = DATE;271.formatIndex = -1;272.} else {273.rowStrings[columnIndex] = readValue;274.rowTypes[columnIndex] = NUMBER;275.}276.break;277.}278.default : break;279.}280.} else if (qName.equals("row")) {281.// 当解析的一行的末尾时输出数组中的数据282.if (rowIndex > skipHeadLineCount) { 283.// 过滤空行284.boolean isValid = false;285.for (int i = 0, len = rowStrings.length; i < len; i++) {286.if (StringUtils.isNotBlank(rowStrings[i])) {287.isValid = true;288.break; 289.}290.}291.if (isValid) {292.rowDataList.add(new PoiExcelRow(rowIndex, rowTypes, rowStrings));293.if (null != threshold && rowDataList.size() > threshold) {294.consumer.accept(rowDataList);295.rowDataList.clear();296.}297.}298.}299.}300.}301.302./**303.* 如果单元格类型是字符串、INLINESTR、数字、日期,readValue则是索引值304.* 如果单元格类型是布尔值、错误、公式,readValue则是内容值305.*/306.@Override307.public void characters(char[] ch, int start, int length) throws SAXException {308.readValue += new String(ch, start, length); 309.}310.311.@Override312.public void endDocument() throws SAXException {313.super.endDocument();314.if (rowDataList.size() > 0) {315.consumer.accept(rowDataList);316.rowDataList.clear();317.}318.}319.320.private int getColumnIndex(Attributes attributes) {321.String attributeValue = attributes.getValue("r"); 322.int columnIndex = -1;323.for (int i = 0, len = attributeValue.length(); i < len; ++i) { 324.if (Character.isDigit(attributeValue.charAt(i))) break;325.columnIndex = (columnIndex + 1) * 26 + attributeValue.charAt(i) - 'A';326.}327.return columnIndex;328.}329.330.private int getColumnNumber(Attributes attrubuts){331.String spans = attrubuts.getValue("spans");332.return StringUtils.isBlank(spans) ? -1 : Integer.parseInt(spans.substring(spans.indexOf(":") + 1));333.}334.335.}336.337.private void parseExcel2003(InputStream in) {338.Workbook workbook = null;339.try {340.workbook = WorkbookFactory.create(in);341.Sheet sheet = workbook.getSheetAt(0);342.int lastCellNum =sheet.getRow(0).getPhysicalNumberOfCells();343.for (int i = skipHeadLineCount, iLen = sheet.getLastRowNum();i <= iLen; i++) {344.Row row = sheet.getRow(i);345.String[] rowStrings = new String[lastCellNum]; 346.for (int j = 0, jLen = lastCellNum; j < jLen; j++) { 347.Cell cell = row.getCell(j);348.if (null == cell) continue;349.Object cellValue = null;350.switch (cell.getCellType()) {351.case BOOLEAN: cellValue = cell.getBooleanCellValue(); break;352.case ERROR: cellValue = cell.getErrorCellValue(); break;353.case FORMULA: cellValue = cell.getCellFormula(); break;354.case NUMERIC: cellValue = DF.format(cell.getNumericCellValue()); break;355.default: cellValue = cell.getStringCellValue(); break;356.}357.rowStrings[j] = String.valueOf(cellValue);358.}359.rowDataList.add(new PoiExcelRow(i, null, rowStrings));360.if (null != threshold && rowDataList.size() > threshold) {361.consumer.accept(rowDataList); 362.rowDataList.clear();363.}364.}365.if (rowDataList.size() > 0) {366.consumer.accept(rowDataList);367.rowDataList.clear();368.}369.} catch (Exception e) {370.LOG.error(e.getMessage(), e);371.} finally {372.try {373.if (null != in) in.close();374.if (null != workbook) workbook.close(); 375.} catch (IOException e) {376.LOG.error(e.getMessage(), e);377.}378.}379.}380.381.}EXCEL文件写操作示例如下:1.import org.apache.poi.xssf.streaming.SXSSFCell;2.import org.apache.poi.xssf.streaming.SXSSFRow;3.import org.apache.poi.xssf.streaming.SXSSFSheet;4.import org.apache.poi.xssf.streaming.SXSSFWorkbook;5.import ermodel.XSSFCell;6.import ermodel.XSSFRow;7.import ermodel.XSSFSheet;8.import ermodel.XSSFWorkbook;9.import org.slf4j.Logger;10.import org.slf4j.LoggerFactory;11.12.import java.io.IOException;13.import java.io.OutputStream;14.import java.math.BigDecimal;15.import java.util.List;16.17.public class PoiExcelFileWriter {18.19.private static Logger LOG =LoggerFactory.getLogger(PoiExcelFileWriter.class);20.21.public static void writeXSSFWorkbook(List<String> headerList,List<List<Object>> resultList, OutputStream outputStream) {22.XSSFWorkbook xssfWorkbook = new XSSFWorkbook();23.XSSFSheet xssfSheet = xssfWorkbook.createSheet("sheet1");24.XSSFRow xssfRow = xssfSheet.createRow(0);25.for (int i = 0, len = headerList.size(); i < len; i++) {26.XSSFCell xssfCell = xssfRow.createCell(i);27.xssfCell.setCellValue(headerList.get(i));28.}29.for (int i = 0, iLen = resultList.size(); i < iLen; i++) {30.xssfRow = xssfSheet.createRow(i + 1);31.List<Object> result = resultList.get(i);32.for (int j = 0, jLen = result.size(); j < jLen; j++) {33.XSSFCell xssfCell = xssfRow.createCell(j);34.Object valueObj = result.get(j);35.if (valueObj instanceof String) {36.xssfCell.setCellValue(null == valueObj ? "" :valueObj.toString());37.} else if (valueObj instanceof BigDecimal) {38.BigDecimal vDecimal = (BigDecimal) valueObj;39.xssfCell.setCellValue(vDecimal.doubleValue());40.} else if (valueObj instanceof Integer) {41.xssfCell.setCellValue((Integer) valueObj);42.} else if (valueObj instanceof Double) {43.xssfCell.setCellValue((Double) valueObj);44.} else {45.xssfCell.setCellValue(null == valueObj ? "" :valueObj.toString());46.}47.}48.}49.try {50.xssfWorkbook.write(outputStream);51.} catch (IOException e) {52.LOG.error(e.getMessage(), e);53.} finally {54.try {55.if (null != xssfWorkbook) xssfWorkbook.close();56.} catch (IOException e) {57.LOG.error(e.getMessage(), e);58.}59.}60.}61.62.public static void writeSXSSFWorkbook(List<String> headerList,List<List<Object>> resultList, OutputStream outputStream) {63.SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook();64.SXSSFSheet sxssfSheet = sxssfWorkbook.createSheet("sheet1");65.SXSSFRow sxssfRow = sxssfSheet.createRow(0);66.for (int i = 0, len = headerList.size(); i < len; i++) {67.SXSSFCell sxssfCell = sxssfRow.createCell(i);68.sxssfCell.setCellValue(headerList.get(i));69.}70.for (int i = 0, len = resultList.size(); i < len; i++) {71.sxssfRow = sxssfSheet.createRow(i + 1);72.List<Object> result = resultList.get(i);73.for(int j = 0, jLen = result.size(); j < jLen; j++){74.SXSSFCell sxssfCell = sxssfRow.createCell(j);75.Object valueObj = result.get(j);76.if (valueObj instanceof String) {77.sxssfCell.setCellValue(null == valueObj ? "" :valueObj.toString());78.} else if (valueObj instanceof BigDecimal) {79.BigDecimal vDecimal = (BigDecimal) valueObj;80.sxssfCell.setCellValue(vDecimal.doubleValue());81.} else if (valueObj instanceof Integer) {82.sxssfCell.setCellValue((Integer) valueObj);83.} else if (valueObj instanceof Double) {84.sxssfCell.setCellValue((Double) valueObj);85.} else {86.sxssfCell.setCellValue(null == valueObj ? "" :valueObj.toString());87.}88.}89.}90.try {91.sxssfWorkbook.write(outputStream);92.} catch (Exception e) {93.LOG.error(e.getMessage(), e);94.} finally {95.sxssfWorkbook.dispose();96.try {97.if (null != sxssfWorkbook) sxssfWorkbook.close();98.} catch (IOException e) {99.LOG.error(e.getMessage(), e);100.}101.}102.}103.104.}二、基于EASYEXCEL操作EXCEL文件1.<!-- EASYEXCEL依赖包-->2.<dependency>3.<groupId>com.alibaba</groupId>4.<artifactId>easyexcel</artifactId>5.<version>2.2.3</version>6.</dependency>EXCEL文件读写操作示例如下:1.import com.alibaba.excel.EasyExcelFactory;2.import com.alibaba.excel.ExcelWriter;3.import com.alibaba.excel.support.ExcelTypeEnum;4.import com.alibaba.excel.write.metadata.WriteSheet;5.import org.slf4j.Logger;6.import org.slf4j.LoggerFactory;7.8.import java.io.InputStream;9.import java.io.OutputStream;10.import java.util.HashMap;11.import java.util.List;12.import java.util.Map;13.14.public class EasyExcelFileUtils {15.16.private static Logger LOG = LoggerFactory.getLogger(EasyExcelFileUtils.class);17.18.public static void read(InputStream in, int threshold, List<String>headerFieldList, List<Map<String, Object>> dataList) {19.Map<Integer, String> indexFieldMap = new HashMap<Integer, String>();20.EasyExcelFactory.read(in, EventListenerUtils.getListener(21.head -> {22.Map<Integer, Object> header = (Map<Integer, Object>) head;23.for (Map.Entry<Integer, Object> entry : header.entrySet()) {24.String entryValue = String.valueOf(entry.getValue());25.headerFieldList.add(entryValue);26.indexFieldMap.put(entry.getKey(), entryValue);27.}28.},29.results -> {30.List<Object> resultList = (List<Object>) results;31.for (int i = 0, len = resultList.size(); i < len; i++) {32.Map<String, Object> data = new HashMap<String,Object>();33.Map<Integer, Object> result = (Map<Integer, Object>)resultList.get(i);34.for (Map.Entry<Integer, Object> entry : result.entrySet()) {35.data.put(indexFieldMap.get(entry.getKey()),entry.getValue());36.}37.dataList.add(data);38.}39.}, threshold)).sheet(0).headRowNumber(0).autoTrim(true).doRead();40.try {41.if (null != in) in.close();42.} catch (Exception e) {43.LOG.error(e.getMessage(), e);44.}45.}46.47.public static void write(List<List<String>> headerList, List<List<Object>>resultList, OutputStream outputStream) {48.ExcelWriter excelWriter =EasyExcelFactory.write(outputStream).excelType(ExcelTypeEnum.XLSX).useDefaultStyle(tr ue)49..needHead(true).head(headerList).autoTrim(true).build();50.WriteSheet writeSheet = new WriteSheet();51.writeSheet.setSheetNo(1);52.excelWriter.write(resultList, writeSheet);53.excelWriter.finish();54.}55.56.}1.import java.util.ArrayList;2.import java.util.List;3.import java.util.function.Consumer;4.5.import com.alibaba.excel.context.AnalysisContext;6.import com.alibaba.excel.event.AnalysisEventListener;7.8.public class EventListenerUtils {9.10./**11.* 批量监听12.* @param <T>13.* @param consumer 批量消费14.* @param threshold 批量阀值15.* @return16.*/17.public static <T> AnalysisEventListener<T>getListener(Consumer<List<T>> consumer, int threshold) {18.return new AnalysisEventListener<T>() {19.20.private List<T> ts = new ArrayList<T>();21.22.@Override23.public void invoke(T t, AnalysisContext context) {24.ts.add(t);25.if (ts.size() == threshold) {26.consumer.accept(ts);27.ts.clear();28.}29.}30.31.@Override32.public void doAfterAllAnalysed(AnalysisContextcontext) {33.if (ts.size() > 0) {34.consumer.accept(ts);35.ts.clear();36.}37.}38.39.};40.}41.42./**43.* 批量监听44.* @param <T>45.* @param headConsumer 表头消费46.* @param consumer 批量消费47.* @param threshold 批量阀值48.* @return49.*/50.public static <T> AnalysisEventListener<T> getListener(Consumer<T>headConsumer, Consumer<List<T>> consumer, int threshold) {51.return new AnalysisEventListener<T>() {52.53.private List<T> ts = new ArrayList<T>();54.55.@Override56.public void invoke(T t, AnalysisContext context) {57.if(context.readRowHolder().getRowIndex() == 0) {58.headConsumer.accept(t);59.} else {60.ts.add(t);61.if (ts.size() == threshold) {62.consumer.accept(ts);63.ts.clear();64.}65.}66.}67.68.@Override69.public void doAfterAllAnalysed(AnalysisContextcontext) {70.if (ts.size() > 0) {71.consumer.accept(ts);72.ts.clear();73.}74.}75.76.};77.}78.79./**80.* 限制数量的监听81.* @param <T>82.* @param headConsumer 表头消费83.* @param consumer 消费84.* @param threshold 限制阀值85.* @return86.*/87.public static <T> AnalysisEventListener<T>getLimitListener(Consumer<T> headConsumer, Consumer<List<T>> consumer, int threshold) {88.return new AnalysisEventListener<T>() {89.90.private List<T> ts = new ArrayList<T>();91.92.@Override93.public void invoke(T t, AnalysisContext context) {94.if(context.readRowHolder().getRowIndex() == 0) {95.headConsumer.accept(t);96.} else {97.if (ts.size() < threshold) {98.ts.add(t);99.}100.}101.}102.103.@Override104.public void doAfterAllAnalysed(AnalysisContext context) {105.if (ts.size() > 0) {106.consumer.accept(ts);107.ts.clear();108.}109.}110.111.};112.}113.114.}。
java poi excel 读写
题目:探索Java中POI库的Excel读写功能1. 简介Java作为一种广泛应用的编程语言,拥有丰富的库和框架来支持各种应用场景。
其中,POI(Poor Obfuscation Implementation)库是Java操作Microsoft Office格式文件的重要工具之一。
在POI库中,Excel的读写功能一直备受开发者关注,因为Excel在商业和数据处理领域有着广泛的应用。
本文将深入探讨Java中POI库的Excel读写功能,介绍其基本用法和注意事项。
2. POI库的基本概念POI库是Apache软件基金会的一个开源项目,旨在提供Java程序对Microsoft Office格式文件的读写功能。
它支持对Excel、Word和PowerPoint等文件的操作,其中Excel的读写功能是开发者们最为关注的部分。
POI库主要由HSSF(Horrible Spreadsheet Format)、XSSF(XML Spreadsheet Format)和SXSSF(Streaming Usermodel API)三个子项目组成,在具体应用时,开发者可以根据自己的需求选择合适的子项目来实现对Excel文件的读写。
3. Excel的读操作在POI库中,读取Excel文件的操作主要通过HSSFWorkbook和XSSFWorkbook来实现。
HSSFWorkbook用于操作.xls格式的文件,而XSSFWorkbook用于操作.xlsx格式的文件。
使用POI库读取Excel文件的过程包括打开Excel文件、读取工作表、遍历行和列数据等步骤。
在具体的代码实现中,开发者可以根据需求选择不同的API来完成特定的读取任务,例如使用HSSF类库来从.xls文件中读取数据,或者使用XSSF类库来从.xlsx文件中读取数据。
在读取Excel文件时,开发者需要注意文件格式、数据类型和异常处理等问题,以确保读取的准确性和健壮性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
java的POI操作Excel文件(2)现在我要做的东西基本完成啦,我把这段时间使用POI的一些心得总结出来,希望能对和我遇到相同问题的朋友有所帮助,至于POI基本的使用方法,自己去看文档吧。
1、设置分页符的bugPOI里的HSSFSheet类提供了setRowBreak方法可以设置Sheet的分页符。
Bug:如果你要设置分页符的Sheet是本来就有的,并且你没有在里面插入过分页符,那么调用setRowBreak时POI会抛出空指针的异常。
解决方法:在Excel里给这个sheet插入一个分页符,用POI打开后再把它删掉,然后你就可以随意插入分页符了。
如果sheet是由POI生成的则没有这个问题。
我跟踪了setRowBreak的源代码,发现是Sheet.Java下的PageBreakRecord rowBreaks这个变量在搞鬼,如果Sheet里原来没有分页符,开发这个模块的那位兄台忘了为这个对象new实例,所以只能我们先手工给Excel插入一个分页符来触发POI为rowBreaks创建实例。
2、如何拷贝行我在的POI用户论坛翻遍了每个相关的帖子,找遍了api,也没看到一个拷贝行的方法,没办法,只能自己写://注:this.fWorkbook是一个HSSHWorkbook,请自行在外部newpublic void copyRows(String pSourceSheetName,String pTargetSheetName,int pStartRow, int pEndRow,int pPosition){HSSFRow sourceRow = null;HSSFRow targetRow = null;HSSFCell sourceCell = null;HSSFCell targetCell = null;HSSFSheet sourceSheet = null;HSSFSheet targetSheet = null;Region region = null;int cType;int i;short j;int targetRowFrom;int targetRowTo;if ((pStartRow == -1) || (pEndRow == -1)){return;}sourceSheet = this.fWorkbook.getSheet(pSourceSheetName);targetSheet = this.fWorkbook.getSheet(pTargetSheetName);//拷贝合并的单元格for (i = 0; i < sourceSheet.getNumMergedRegions(); i++){region = sourceSheet.getMergedRegionAt(i);if ((region.getRowFrom() >= pStartRow) && (region.getRowTo() <= pEndRow)) {targetRowFrom = region.getRowFrom() - pStartRow + pPosition; targetRowTo = region.getRowTo() - pStartRow + pPosition;region.setRowFrom(targetRowFrom);region.setRowTo(targetRowTo);targetSheet.addMergedRegion(region);}}//设置列宽for (i = pStartRow; i <= pEndRow; i++){sourceRow = sourceSheet.getRow(i);if (sourceRow != null){for (j = sourceRow.getFirstCellNum(); j < sourceRow.getLastCellNum(); j++) {targetSheet.setColumnWidth(j, sourceSheet.getColumnWidth(j));}break;}}//拷贝行并填充数据for (;i <= pEndRow; i++){sourceRow = sourceSheet.getRow(i);if (sourceRow == null){continue;}targetRow = targetSheet.createRow(i - pStartRow + pPosition);targetRow.setHeight(sourceRow.getHeight());for (j = sourceRow.getFirstCellNum(); j < sourceRow.getLastCellNum(); j++)sourceCell = sourceRow.getCell(j);if (sourceCell == null){continue;}targetCell = targetRow.createCell(j);targetCell.setEncoding(sourceCell.getEncoding());targetCell.setCellStyle(sourceCell.getCellStyle());cType = sourceCell.getCellType();targetCell.setCellType(cType);switch (cType){case HSSFCell.CELL_TYPE_BOOLEAN:targetCell.setCellValue(sourceCell.getBooleanCellValue());break;case HSSFCell.CELL_TYPE_ERROR:targetCell.setCellErrorV alue(sourceCell.getErrorCellValue());break;case HSSFCell.CELL_TYPE_FORMULA://parseFormula这个函数的用途在后面说明targetCell.setCellFormula(parseFormula(sourceCell.getCellFormula()));break;case HSSFCell.CELL_TYPE_NUMERIC:targetCell.setCellValue(sourceCell.getNumericCellV alue());break;case HSSFCell.CELL_TYPE_STRING:targetCell.setCellValue(sourceCell.getStringCellValue());break;}}}}这个函数有两个问题暂时无法解决:a、只能在同一个Workbook里面使用,跨Workbook总是拷不过去,不知道为什么?b、由于在拷贝行时也把行高也拷过去了,如果往这些单元格里写入的数据长度超过单元格长度,那么他们不会自动调整行高!3、公式的问题POI对Excel公式的支持是相当好的,但是我发现一个问题,如果公式里面的函数不带参数,比如now()或today(),那么你通过getCellFormula()取出来的值就是now(ATTR(semiV olatile))和today(ATTR(semiV olatile)),这样的值写入Excel是会出错的,这也是我上面copyRow的函数在写入公式前要调用parseFormula的原因,parseFormula这个函数的功能很简单,就是把ATTR(semiVolatile)删掉,我把它的代码贴出来:private String parseFormula(String pPOIFormula){final String cstReplaceString = "ATTR(semiV olatile)"; //$NON-NLS-1$StringBuffer result = null;int index;result = new StringBuffer();index = pPOIFormula.indexOf(cstReplaceString);if (index >= 0){result.append(pPOIFormula.substring(0, index));result.append(pPOIFormula.substring(index + cstReplaceString.length()));}else{result.append(pPOIFormula);}return result.toString();}至于为什么会出现ATTR(semiVolatile),还需要大家的探索精神!4、向Excel写入图片的问题。
我上POI论坛查相关帖子,得到两种结论:1、不支持写入图片;2、支持写入图片,通过EscherGraphics2d这个Class实现。
于是我就去查EscherGraphics2d 这个Class,发现这个Class提供了N个drawImage方法,喜出望外的我开始写代码,结果调了一天,一直看不到效果,黔驴技穷的我在万般无奈下只好跟踪进drawImage这个函数内部,经过N个函数调用后在最底层函数发现了最终答案:public boolean drawImage(Image image, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, Color bgColor, ImageObserver imageobserver){if (logger.check( POILogger.WARN ))logger.log(POILogger.WARN,"drawImage() not supported");return true;}所以我强烈建议大家,以后使用第三方开发包一定尽量下载它的源代码,这样你在碰到问题时,看看它的的内部是怎么实现的,很多时候就可以不必重蹈我的覆辙了。
既然POI不能写入图片,那我们只能把目光投向JXL,我用JXL写入图片功能是实现了,付出的代价是now()和today()这些函数丢失掉了,鱼与熊掌不能兼得吧。
==========================jsp操作===============================<%@ page contentType="application/msexcel;charset=gb2312" %>response.setHeader("Content-disposition","inline; filename=test1.xls");//以上这行设定传送到前端浏览器时的档名为test1.xls//就是靠这一行,让前端浏览器以为接收到一个excel档下面正常显示要转化的表--------------------------------------------------------------------------介绍:Jakarta_POI 使用Java读写Excel(97-2002)文件,可以满足大部分的需要。