`
java虫
  • 浏览: 536431 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

POI操作Excel文档-基础篇

阅读更多
一.POI简介

Jakarta POI 是apache的子项目,目标是处理ole2对象。它提供了一组操纵Windows文档的Java API

目前比较成熟的是HSSF接口,处理MS Excel(97-2002)对象。它不象我们仅仅是用csv生成的没有格式的可以由Excel转换的东西,而是真正的Excel对象,你可以控制一些属性如sheet,cell等等。

二.HSSF概况

HSSF 是Horrible SpreadSheet Format的缩写,也即“讨厌的电子表格格式”。 也许HSSF的名字有点滑稽,就本质而言它是一个非常严肃、正规的API。通过HSSF,你可以用纯Java代码来读取、写入、修改Excel文件。

HSSF 为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型”。前者很好理解,后者比较抽象,但操作效率要高得多。

三.开始编码


1 . 准备工作

要求:JDK 1.4+POI开发包

可以到 http://www.apache.org/dyn/closer.cgi/jakarta/poi/ 最新的POI工具包

2 . EXCEL 结构

HSSFWorkbook excell 文档对象介绍
HSSFSheet excell的表单
HSSFRow excell的行
HSSFCell excell的格子单元
HSSFFont excell字体
HSSFName 名称
HSSFDataFormat 日期格式
在poi1.7中才有以下2项:
HSSFHeader sheet头
HSSFFooter sheet尾
和这个样式
HSSFCellStyle cell样式
辅助操作包括
HSSFDateUtil 日期
HSSFPrintSetup 打印
HSSFErrorConstants 错误信息表

3 .具体用法实例 (采用 usermodel )


如何读Excel

读取Excel文件时,首先生成一个POIFSFileSystem对象,由POIFSFileSystem对象构造一个HSSFWorkbook,该HSSFWorkbook对象就代表了Excel文档。下面代码读取上面生成的Excel文件写入的消息字串:
POIFSFileSystem fs=newPOIFSFileSystem(new FileInputStream("d:\test.xls")); 
HSSFWorkbook  wb = new HSSFWorkbook(fs); 
  } catch (IOException e) { 
  e.printStackTrace(); 
  } 
  HSSFSheet sheet = wb.getSheetAt(0); 
  HSSFRow row = sheet.getRow(0); 
  HSSFCell cell = row.getCell((short) 0); 
  String msg = cell.getStringCellValue(); 


如何写excel,

将excel的第一个表单第一行的第一个单元格的值写成“a test”。

POIFSFileSystem fs =new POIFSFileSystem(new FileInputStream("workbook.xls")); 

    HSSFWorkbook wb = new HSSFWorkbook(fs); 

    HSSFSheet sheet = wb.getSheetAt(0); 

    HSSFRow row = sheet.getRow(0); 

    HSSFCell cell = row.getCell((short)0); 

    cell.setCellValue("a test"); 

    // Write the output to a file 

    FileOutputStream fileOut = new FileOutputStream("workbook.xls"); 

    wb.write(fileOut); 

fileOut.close(); 


4 . 可参考文档

POI 主页:http://jakarta.apache.org/poi/,

初学者如何快速上手使用POI HSSF

http://jakarta.apache.org/poi/hssf/quick-guide.html 。

代码例子 http://blog.java-cn.com/user1/6749/archives/2005/18347.html


里面有很多例子代码,可以很方便上手。

四.使用心得


POI HSSF 的usermodel包把Excel文件映射成我们熟悉的结构,诸如Workbook、Sheet、Row、Cell等,它把整个结构以一组对象的形式保存在内存之中,便于理解,操作方便,基本上能够满足我们的要求,所以说这个一个不错的选择。

分享到:
评论
15 楼 zi_wu_xian 2016-08-29  
POI操作Excel文档过于复杂了,还是用PageOffice调用VBA的接口实现比较简单。
14 楼 xy2401 2012-05-22  
突然想感慨一句六年年的文章呢
-------------------------------------------
收集整理一下,知识
13 楼 qingwenxiutong 2012-05-16  
真的是看了之后了解很多啊。感谢
12 楼 hejian123 2012-04-01  
很好,收益良多
11 楼 yagesi 2009-09-25  
yagesi 写道
楼主,我这边有个问题:
请看如下代码:
File file = new File("c:\\test.xls");

if(!file.exists())file.createNewFile();


POIFSFileSystem fileSystem = new POIFSFileSystem(new FileInputStream(file));
其余的省略,结果系统就报如下错误
Exception in thread "main" java.io.IOException: Unable to read entire header; 0 bytes read; expected 512 bytes
at org.apache.poi.poifs.storage.HeaderBlockReader.alertShortRead(HeaderBlockReader.java:149)
at org.apache.poi.poifs.storage.HeaderBlockReader.<init>(HeaderBlockReader.java:85)
at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:151)
at cn.com.poi.test.CreateExecl.main(CreateExecl.java:31)
出错位置在第三句代码;

这个代码出错的原因我已经查明:
可能是JVM帮我们创建的excle文件产生了问题,一般是字符编码方面导致的POI无法读取创建的xls文件。因为我手动在c盘下创建一个test.xls文件,就完全可以读写。

虽然知道了原因,但是具体怎么解决还没找到方案。
现在我使用的是POI最新的版本,依然有这样的原因。希望大家讨论下,谢谢



郁闷,原因很简单,我电脑上只装了国产的WPS。在测试的时候,应用程序会调用服务器的Office信息。装了个Office解决问题了。
10 楼 yagesi 2009-09-15  
楼主,我这边有个问题:
请看如下代码:
File file = new File("c:\\test.xls");

if(!file.exists())file.createNewFile();


POIFSFileSystem fileSystem = new POIFSFileSystem(new FileInputStream(file));
其余的省略,结果系统就报如下错误
Exception in thread "main" java.io.IOException: Unable to read entire header; 0 bytes read; expected 512 bytes
at org.apache.poi.poifs.storage.HeaderBlockReader.alertShortRead(HeaderBlockReader.java:149)
at org.apache.poi.poifs.storage.HeaderBlockReader.<init>(HeaderBlockReader.java:85)
at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:151)
at cn.com.poi.test.CreateExecl.main(CreateExecl.java:31)
出错位置在第三句代码;

这个代码出错的原因我已经查明:
可能是JVM帮我们创建的excle文件产生了问题,一般是字符编码方面导致的POI无法读取创建的xls文件。因为我手动在c盘下创建一个test.xls文件,就完全可以读写。

虽然知道了原因,但是具体怎么解决还没找到方案。
现在我使用的是POI最新的版本,依然有这样的原因。希望大家讨论下,谢谢
9 楼 gigivszhao 2008-12-30  
行数过多造成的。
8 楼 83194907 2008-09-19  
十分感谢您的帮助. 
7 楼 java虫 2007-08-15  
to:bonedream  

只能分多个sheet写了 
6 楼 java虫 2007-08-15  
to :wangxingli  

我没用poi操作过word
5 楼 bonedream 2007-08-09  
我用poi从数据库中读取数据
然后一行一行的写到excel文件里面
我写20000行都没有问题
但是我现在写了有34000多行的时候
就会出现下面的异常信息
java.lang.IndexOutOfBoundsException: Row number must be between 0 and 65535, was <-32768>
at org.apache.poi.hssf.usermodel.HSSFRow.setRowNum(HSSFRow.java:208)
at org.apache.poi.hssf.usermodel.HSSFRow.<init>(HSSFRow.java:98)
at org.apache.poi.hssf.usermodel.HSSFSheet.createRow(HSSFSheet.java:192)
at com.storm.excel.CreateExcel.CreateOneRow(CreateExcel.java:82)
at com.storm.struts.action.ExcelAction.ASCN_ALLDOLLY(ExcelAction.java:61)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:280)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:216)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at com.storm.util.EncodingFilter.doFilter(EncodingFilter.java:16)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
at java.lang.Thread.run(Thread.java:619)

请问有什么办法可以解决吗?
4 楼 wangxingli 2007-08-08  
看了您的帖子,想问下不知道可不可以通过POI操作WORD文档!
我们有这样一个需求:
需要将WORD中的数据导入到数据库中,数据主要是汉字!!
3 楼 java虫 2007-03-13  
没在一个单元格里写过那么多字,可能有限制.

你为什么有这种要求
2 楼 aiest 2006-12-09  
请问一下有什么办法可以解决吗?
1 楼 aiest 2006-12-09  
设置单元格超过五千个就会报单元格样式过多。

相关推荐

    POI操作Excel文档-基础篇.pdf

    Apache POI 是一个强大的开源库,专门用于处理微软的 Office 格式文件,尤其是 Excel。这个库由 Apache 软件基金会维护,其名称源于“Poor Obfuscation Implementation of an Office Interpreter”,但实际上它提供...

    poi操作excel

    在IT行业中,Apache POI是一个广泛使用的库,它允许开发者使用Java来创建、修改和读取Microsoft Office格式的文件,尤其是Excel(XLS和XLSX)文档。本篇文章将详细探讨如何使用Apache POI与SpringBoot、MyBatis以及...

    java利用poi生成excel demo

    本篇将详细介绍如何利用Apache POI库在Java中创建一个Excel文件的DEMO。 首先,Apache POI是一个开源项目,它为Java程序员提供了API,可以处理Microsoft Office格式的数据,如Word、PowerPoint和Excel。在"java利用...

    POI 读取Excel文件

    本篇文章将详细介绍如何使用 POI 来读取 Excel 文件。 1. **安装与引入 POI** 在使用 POI 之前,你需要先将其添加到你的项目依赖中。如果你使用的是 Maven,可以在 `pom.xml` 文件中添加以下依赖: ```xml ...

    Excel POI 工具类

    本篇将深入探讨"Excel POI 工具类",这个工具类旨在简化日常的Excel操作,提升开发效率。 Apache POI 提供了HSSF(Horizontally Stored Sheets Format)和XSSF(XML Spreadsheet Format)两个主要的API,分别用于...

    使用POI读写Excel文件(兼容xls与xlsx版本)

    这篇博客“使用POI读写Excel文件(兼容xls与xlsx版本)”深入探讨了如何利用Apache POI库在Java环境中处理Excel文档。 首先,让我们了解一下Apache POI的基本概念。Apache POI提供了一组API,允许开发者创建、修改...

    poi读取Excel2007文件

    在提供的压缩包文件名称列表中,我们看到的是一些与XML处理相关的JAR文件,这可能是为了支持Apache POI的工作,因为OOXML格式的Excel文件本质上是以XML为基础的。让我们逐一解析这些文件: 1. **xalan-2.7.1.jar**...

    java的POI操作excel

    Java的Apache POI库是处理Microsoft Office文档的强大工具,尤其在Excel操作方面。它允许开发者在Java应用程序中创建、修改和展示Excel文件。本篇文章将深入探讨如何利用POI进行Excel的各种操作,包括生成Excel、...

    poi方式导出excel需要的3个jar包

    3. **poi**: 这个JAR包是Apache POI的基础组件,包含了处理老版本Excel文件(XLS)的HSSF库,同时也提供了一些通用功能,如工作簿、工作表、单元格等的基本操作。 在实际开发中,导入这三个JAR包到你的项目中,你就...

    POI操纵Excel文档总结(未完成版).pdf

    【描述】:这篇文档是关于使用Apache POI库来操作Microsoft Excel文档的详细指南,涵盖了从基础概念到高级特性的各种操作。 【标签】:互联网,cs Apache POI是Java社区中的一个开源项目,主要用于读写Microsoft ...

    Apache POI导入数据到Excel电子表格

    7. poi-3.17.jar:基础的Apache POI库,用于处理旧版的BIFF格式(.xls)Excel文件。 8. commons-collections4-4.1.jar:Apache Commons Collections库,提供了集合框架的扩展。 要导入数据到Excel,首先需要创建一...

    使用poi-api创建文件导出excel文档

    在本篇文章中,我们将深入探讨如何使用POI API创建文件并导出为Excel文档。 首先,我们需要理解Apache POI的基本概念。POI是“Poor Obfuscation Implementation”的缩写,它是一个开放源码的Java API,用于读取、...

    Java使用POI实现excel模板

    本篇文章将深入探讨如何使用Java和Apache POI来实现Excel模板的功能,覆盖了单个传值、单行循环、块循环以及快循环嵌套单行循环等操作。 首先,我们需要导入Apache POI的相关依赖库,如`poi-ooxml`和`poi-ooxml-...

    Java通过POI和JXL给Excel动态添加水印

    本文将详细介绍如何利用Java编程语言结合JXL和Apache POI库来实现给Excel文档添加动态水印的功能。 #### 技术栈介绍 - **JXL**: 是一个用于读写Excel文件的Java库,支持多种Excel版本,包括.xls格式。 - **Apache ...

    Excel-Java库POI.rar

    本篇文章将详细介绍如何利用POI库来操作Excel,涵盖从基础到高级的使用技巧。 首先,让我们了解POI库的基本概念。Apache POI是Java领域中广泛使用的API,其主要功能是允许开发者创建、修改和读取Microsoft Office...

    Java使用POI读取Excel

    本篇文章将详细探讨如何使用POI库来读取Excel文件,以及如何处理合并单元格的问题。 首先,我们需要引入Apache POI库到我们的项目中。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖: ```xml &lt;groupId&gt;...

    POI Excel导出,我的又一个模板方法

    在Java开发中,Apache POI库是一个非常重要的工具,它允许程序员读取、写入和修改Microsoft Office格式的文件,包括Excel。这篇博客"POI Excel导出,我的又一个模板方法"可能详细介绍了如何使用Apache POI库来创建...

    poi的控制,poi导出excel详细介绍,有代码

    本篇文章将详细介绍如何利用 Apache POI 库中的 HSSF 相关类来实现 Excel 的读取操作,并给出示例代码。 #### 二、环境搭建 首先,确保你的开发环境中安装了 Java 开发工具包 (JDK) 并配置好了 Java 开发环境。...

Global site tag (gtag.js) - Google Analytics