`
java虫
  • 浏览: 532293 次
  • 性别: 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

    。。。

    poi-ooxml-4.1.2-API文档-中文版.zip

    包含翻译后的API文档:poi-ooxml-4.1.2-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.apache.poi:poi-ooxml:4.1.2; 标签:apache、ooxml、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器...

    POI导入Excel文件--form表单提交

    POI导入Excel,详细内容查看博客 POI导入Excel文件--form表单提交 内容

    poi-ooxml-3.16-API文档-中文版.zip

    包含翻译后的API文档:poi-ooxml-3.16-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.apache.poi:poi-ooxml:3.16; 标签:apache、ooxml、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器...

    poi-ooxml-5.2.0-API文档-中英对照版.zip

    包含翻译后的API文档:poi-ooxml-5.2.0-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:org.apache.poi:poi-ooxml:5.2.0; 标签:apache、poi、ooxml、中英对照文档、jar包、java; 使用方法:解压翻译后...

    poi-scratchpad-4.1.2-API文档-中英对照版.zip

    包含翻译后的API文档:poi-scratchpad-4.1.2-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:org.apache.poi:poi-scratchpad:4.1.2; 标签:apache、poi、scratchpad、中英对照文档、jar包、java; 使用...

    poi-ooxml-3.17-API文档-中文版.zip

    包含翻译后的API文档:poi-ooxml-3.17-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.apache.poi:poi-ooxml:3.17; 标签:apache、poi、ooxml、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用...

    poi-scratchpad-4.1.2-API文档-中文版.zip

    包含翻译后的API文档:poi-scratchpad-4.1.2-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.apache.poi:poi-scratchpad:4.1.2; 标签:apache、poi、scratchpad、中文文档、jar包、java; 使用方法:解压翻译...

    poi-5.2.0-API文档-中英对照版.zip

    包含翻译后的API文档:poi-5.2.0-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:org.apache.poi:poi:5.2.0; 标签:apache、poi、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器...

    poi-ooxml-4.1.2-API文档-中英对照版.zip

    包含翻译后的API文档:poi-ooxml-4.1.2-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:org.apache.poi:poi-ooxml:4.1.2; 标签:apache、ooxml、jar包、java、中英对照文档; 使用方法:解压翻译后的API...

    POI操作Excel----------(转人家的)

    POI可以到www.apache.org下载到。编译好的jar主要有这样4个:poi包,poi Browser包,poi hdf包,poi hssf例程包。实际运行时,需要有poi包就可以了。

    poi的所有jar包,poi, poi-ooxml,poi-ooxml-schemas的各个版本jar

    poi的所有jar包,poi, poi-ooxml,poi-ooxml-schemas的各个版本jar poi的所有jar包,poi, poi-ooxml,poi-ooxml-schemas的各个版本jar

    poi-ooxml-5.2.0-API文档-中文版.zip

    包含翻译后的API文档:poi-ooxml-5.2.0-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.apache.poi:poi-ooxml:5.2.0; 标签:apache、poi、ooxml、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用...

    poi-3.17-API文档-中文版.zip

    包含翻译后的API文档:poi-3.17-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.apache.poi:poi:3.17; 标签:apache、poi、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html...

    poi-5.2.0-API文档-中文版.zip

    包含翻译后的API文档:poi-5.2.0-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.apache.poi:poi:5.2.0; 标签:apache、poi、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index....

    poi-4.1.2-API文档-中英对照版.zip

    包含翻译后的API文档:poi-4.1.2-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:org.apache.poi:poi:4.1.2; 标签:apache、jar包、java、中英对照文档; 使用方法:解压翻译后的API文档,用浏览器打开...

    poi-ooxml-3.16-API文档-中英对照版.zip

    包含翻译后的API文档:poi-ooxml-3.16-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:org.apache.poi:poi-ooxml:3.16; 标签:apache、poi、ooxml、中英对照文档、jar包、java; 使用方法:解压翻译后的...

    poi-3.10.1上传组件jar包 po poi-ooxml poi-ooxml-schemas

    poi-3.10.1上传组件jar包 poi-3.10.1.jar poi-ooxml-3.10.1.jar poi-ooxml-schemas-3.10.1.jar

    poi-4.1.2-API文档-中文版.zip

    包含翻译后的API文档:poi-4.1.2-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.apache.poi:poi:4.1.2; 标签:apache、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”...

Global site tag (gtag.js) - Google Analytics