- 浏览: 319246 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
lzy.je:
期待FSF的!1985.10成立到现在GNU有多少大牛的项目数 ...
改变IT世界的11大Apache开源技术 -
dotaking:
7、8不了解
改变IT世界的11大Apache开源技术
POI 关于对 ms word的读写代码
关键字: poi
read word:
write word
写操作的代码还是有些问题:打开WORD时提示要选择字符类型
希望能改进!
当然这几个jar是少不了的
poi-2.5.1-final-20040804.jar
poi-contrib-2.5.1-final-20040804.jar
poi-scratchpad-2.5.1-final-20040804.jar
- publicclassWordExtractor{
- publicWordExtractor(){
- }
- publicStringextractText(InputStreamin)throwsIOException{
- ArrayListtext=newArrayList();
- POIFSFileSystemfsys=newPOIFSFileSystem(in);
- DocumentEntryheaderProps=(DocumentEntry)fsys.getRoot().getEntry("WordDocument");
- DocumentInputStreamdin=fsys.createDocumentInputStream("WordDocument");
- byte[]header=newbyte[headerProps.getSize()];
- din.read(header);
- din.close();
- //Prendeleinformazionidall'headerdeldocumento
- intinfo=LittleEndian.getShort(header,0xa);
- booleanuseTable1=(info&0x200)!=0;
- //booleanuseTable1=true;
- //Prendeinformazionidallapiecetable
- intcomplexOffset=LittleEndian.getInt(header,0x1a2);
- //intcomplexOffset=LittleEndian.getInt(header);
- StringtableName=null;
- if(useTable1){
- tableName="1Table";
- }else{
- tableName="0Table";
- }
- DocumentEntrytable=(DocumentEntry)fsys.getRoot().getEntry(tableName);
- byte[]tableStream=newbyte[table.getSize()];
- din=fsys.createDocumentInputStream(tableName);
- din.read(tableStream);
- din.close();
- din=null;
- fsys=null;
- table=null;
- headerProps=null;
- intmultiple=findText(tableStream,complexOffset,text);
- StringBuffersb=newStringBuffer();
- intsize=text.size();
- tableStream=null;
- for(intx=0;x<size;x++){
- WordTextPiecenextPiece=(WordTextPiece)text.get(x);
- intstart=nextPiece.getStart();
- intlength=nextPiece.getLength();
- booleanunicode=nextPiece.usesUnicode();
- StringtoStr=null;
- if(unicode){
- toStr=newString(header,start,length*multiple,"UTF-16LE");
- }else{
- toStr=newString(header,start,length,"ISO-8859-1");
- }
- sb.append(toStr).append("");
- }
- returnsb.toString();
- }
- privatestaticintfindText(byte[]tableStream,intcomplexOffset,ArrayListtext)
- throwsIOException{
- //actualtext
- intpos=complexOffset;
- intmultiple=2;
- //skipsthroughtheprmsbeforewereachthepiecetable.Thesecontaindata
- //foractualfastsavedfiles
- while(tableStream[pos]==1){
- pos++;
- intskip=LittleEndian.getShort(tableStream,pos);
- pos+=2+skip;
- }
- if(tableStream[pos]!=2){
- thrownewIOException("corruptedWordfile");
- }else{
- //parseoutthetextpieces
- intpieceTableSize=LittleEndian.getInt(tableStream,++pos);
- pos+=4;
- intpieces=(pieceTableSize-4)/12;
- for(intx=0;x<pieces;x++){
- intfilePos=
- LittleEndian.getInt(tableStream,pos+((pieces+1)*4)+(x*8)+2);
- booleanunicode=false;
- if((filePos&0x40000000)==0){
- unicode=true;
- }else{
- unicode=false;
- multiple=1;
- filePos&=~(0x40000000);//givesmeFCindocstream
- filePos/=2;
- }
- inttotLength=
- LittleEndian.getInt(tableStream,pos+(x+1)*4)
- -LittleEndian.getInt(tableStream,pos+(x*4));
- WordTextPiecepiece=newWordTextPiece(filePos,totLength,unicode);
- text.add(piece);
- }
- }
- returnmultiple;
- }
- publicstaticvoidmain(String[]args){
- WordExtractorw=newWordExtractor();
- POIFSFileSystemps=newPOIFSFileSystem();
- try{
- Filefile=newFile("C:\\test.doc");
- InputStreamin=newFileInputStream(file);
- Strings=w.extractText(in);
- System.out.println(s);
- }catch(Exceptione){
- e.printStackTrace();
- }
- }
- }
- classWordTextPiece{
- privateint_fcStart;
- privateboolean_usesUnicode;
- privateint_length;
- publicWordTextPiece(intstart,intlength,booleanunicode){
- _usesUnicode=unicode;
- _length=length;
- _fcStart=start;
- }
- publicbooleanusesUnicode(){
- return_usesUnicode;
- }
- publicintgetStart(){
- return_fcStart;
- }
- publicintgetLength(){
- return_length;
- }
- }
public class WordExtractor {
public WordExtractor() {
}
public String extractText(InputStream in) throws IOException {
ArrayList text = new ArrayList();
POIFSFileSystem fsys = new POIFSFileSystem(in);
DocumentEntry headerProps = (DocumentEntry) fsys.getRoot().getEntry("WordDocument");
DocumentInputStream din = fsys.createDocumentInputStream("WordDocument");
byte[] header = new byte[headerProps.getSize()];
din.read(header);
din.close();
// Prende le informazioni dall'header del documento
int info = LittleEndian.getShort(header, 0xa);
boolean useTable1 = (info & 0x200) != 0;
//boolean useTable1 = true;
// Prende informazioni dalla piece table
int complexOffset = LittleEndian.getInt(header, 0x1a2);
//int complexOffset = LittleEndian.getInt(header);
String tableName = null;
if (useTable1) {
tableName = "1Table";
} else {
tableName = "0Table";
}
DocumentEntry table = (DocumentEntry) fsys.getRoot().getEntry(tableName);
byte[] tableStream = new byte[table.getSize()];
din = fsys.createDocumentInputStream(tableName);
din.read(tableStream);
din.close();
din = null;
fsys = null;
table = null;
headerProps = null;
int multiple = findText(tableStream, complexOffset, text);
StringBuffer sb = new StringBuffer();
int size = text.size();
tableStream = null;
for (int x = 0; x < size; x++) {
WordTextPiece nextPiece = (WordTextPiece) text.get(x);
int start = nextPiece.getStart();
int length = nextPiece.getLength();
boolean unicode = nextPiece.usesUnicode();
String toStr = null;
if (unicode) {
toStr = new String(header, start, length * multiple, "UTF-16LE");
} else {
toStr = new String(header, start, length, "ISO-8859-1");
}
sb.append(toStr).append(" ");
}
return sb.toString();
}
private static int findText(byte[] tableStream, int complexOffset, ArrayList text)
throws IOException {
//actual text
int pos = complexOffset;
int multiple = 2;
//skips through the prms before we reach the piece table. These contain data
//for actual fast saved files
while (tableStream[pos] == 1) {
pos++;
int skip = LittleEndian.getShort(tableStream, pos);
pos += 2 + skip;
}
if (tableStream[pos] != 2) {
throw new IOException("corrupted Word file");
} else {
//parse out the text pieces
int pieceTableSize = LittleEndian.getInt(tableStream, ++pos);
pos += 4;
int pieces = (pieceTableSize - 4) / 12;
for (int x = 0; x < pieces; x++) {
int filePos =
LittleEndian.getInt(tableStream, pos + ((pieces + 1) * 4) + (x * 8) + 2);
boolean unicode = false;
if ((filePos & 0x40000000) == 0) {
unicode = true;
} else {
unicode = false;
multiple = 1;
filePos &= ~(0x40000000); //gives me FC in doc stream
filePos /= 2;
}
int totLength =
LittleEndian.getInt(tableStream, pos + (x + 1) * 4)
- LittleEndian.getInt(tableStream, pos + (x * 4));
WordTextPiece piece = new WordTextPiece(filePos, totLength, unicode);
text.add(piece);
}
}
return multiple;
}
public static void main(String[] args){
WordExtractor w = new WordExtractor();
POIFSFileSystem ps = new POIFSFileSystem();
try{
File file = new File("C:\\test.doc");
InputStream in = new FileInputStream(file);
String s = w.extractText(in);
System.out.println(s);
}catch(Exception e){
e.printStackTrace();
}
}
}
class WordTextPiece {
private int _fcStart;
private boolean _usesUnicode;
private int _length;
public WordTextPiece(int start, int length, boolean unicode) {
_usesUnicode = unicode;
_length = length;
_fcStart = start;
}
public boolean usesUnicode() {
return _usesUnicode;
}
public int getStart() {
return _fcStart;
}
public int getLength() {
return _length;
}
}
write word
- publicbooleanwriteWordFile(Stringpath,Stringcontent){
- booleanw=false;
- try{
- //byteb[]=content.getBytes("ISO-8859-1");
- byteb[]=content.getBytes();
- ByteArrayInputStreambais=newByteArrayInputStream(b);
- POIFSFileSystemfs=newPOIFSFileSystem();
- DirectoryEntrydirectory=fs.getRoot();
- DocumentEntryde=directory.createDocument("WordDocument",bais);
- FileOutputStreamostream=newFileOutputStream(path);
- fs.writeFilesystem(ostream);
- bais.close();
- ostream.close();
- }catch(IOExceptione){
- e.printStackTrace();
- }
- returnw;
- }
public boolean writeWordFile(String path, String content) { boolean w = false; try { // byte b[] = content.getBytes("ISO-8859-1"); byte b[] = content.getBytes(); ByteArrayInputStream bais = new ByteArrayInputStream(b); POIFSFileSystem fs = new POIFSFileSystem(); DirectoryEntry directory = fs.getRoot(); DocumentEntry de = directory.createDocument("WordDocument", bais); FileOutputStream ostream = new FileOutputStream(path); fs.writeFilesystem(ostream); bais.close(); ostream.close(); } catch (IOException e) { e.printStackTrace(); } return w; }
写操作的代码还是有些问题:打开WORD时提示要选择字符类型
希望能改进!
当然这几个jar是少不了的
poi-2.5.1-final-20040804.jar
poi-contrib-2.5.1-final-20040804.jar
poi-scratchpad-2.5.1-final-20040804.jar
- 09:21
- 浏览 (12760)
- 论坛浏览 (14400)
- 评论 (11)
- 分类: 心得
- 收藏
- 相关推荐
评论
11 楼 cleanboxer 2007-06-18 回复
开发poi word 的那个哥们老早就不干了,好像就职于商业的公司,apache还招募人参与呢,2006的事, poi处理word 太弱,还得用vs6.0 c++, java的开源的那个word有更详细的文档,不过没研究过,处理excel还算凑合,
不过也问题比较多,不能区分单元格内内容的格式,或错误判断
不过也问题比较多,不能区分单元格内内容的格式,或错误判断
9 楼 andyandyandy 2007-04-02 回复
写word的少见,收了
8 楼 strongkill 2007-04-02 回复
http://jakarta.apache.org/poi/index.html
poi-2.5.1-final-20040804.jar
poi-contrib-2.5.1-final-20040804.jar
poi-scratchpad-2.5.1-final-20040804.jar
能提供这几个包的下载吗?
poi-contrib-2.5.1-final-20040804.jar
poi-scratchpad-2.5.1-final-20040804.jar
能提供这几个包的下载吗?
感谢楼主,这个word extractor能够比较好的支持中文。
原先我是使用nutch的word文本提取,但是相当大部分的中文word文档无法正确提取,到官方网站查看他们的解决方案,是这么说的“Document with 2-byte characters (that's how Chinese characters are probably stored) are not correctly handled by HWPF.”One more thing you need to consider: HWPF cannot handle "fast saved" Word files. If the documents you need to parse are "fast saved" this adds an extra level of complexity.
有点小问题,希望楼主有时间的时候帮忙大家修复一下,那就是有部分提取的文本前后有小方框的,我想应该是这些字符本不该被提取。
原先我是使用nutch的word文本提取,但是相当大部分的中文word文档无法正确提取,到官方网站查看他们的解决方案,是这么说的“Document with 2-byte characters (that's how Chinese characters are probably stored) are not correctly handled by HWPF.”One more thing you need to consider: HWPF cannot handle "fast saved" Word files. If the documents you need to parse are "fast saved" this adds an extra level of complexity.
有点小问题,希望楼主有时间的时候帮忙大家修复一下,那就是有部分提取的文本前后有小方框的,我想应该是这些字符本不该被提取。
发表评论
-
改变IT世界的11大Apache开源技术
2009-09-28 08:53 1576据国外媒体报道,转眼之间,Apache软件基金会已经成立1 ... -
批量替換
2009-01-23 13:01 757DECLARE @fieldtype sysnameSET @ ... -
一篇关于web.xml配置的详细说明
2007-09-04 01:19 765一篇关于web.xml配置的详细说明 (来源于:http: ... -
打印web页面的指定区域
2009-03-12 11:34 1073打印web页面的指定区域 第一种方法:使用CSS,定义一个.n ... -
jspSmartUpload 学习
2009-03-12 18:06 829一、安装篇 jspSmartUpload是由www.js ... -
统计访问量
2009-04-02 10:13 984统计访问量 监听 ... -
视频总结-servlet高级开发
2009-04-02 10:16 803视频总结-servlet高级开发 ... -
log4j最佳配置备份
2009-05-22 11:15 967Xml代码 <?xmlversion="1. ... -
jsp 生成 图片验证码
2009-06-03 10:45 889务必注意:在比较用户输入的验证码时,需要获取系统生成的验证码, ... -
SSH协议
2009-06-05 17:05 1333[编辑] 历史 最初的 SSH ... -
单点登录
2009-06-05 17:10 945单点登录SSO(Single Sign-O ... -
CAS构建和实现单点登录解决方案
2009-06-05 17:21 1503... -
单点登录解决方案
2009-06-05 17:58 859方案概述 现代企业的信息化建设越来越完善,各种电子邮件系统 ... -
单点登陆的概念
2009-06-08 11:16 829单点登陆的概念 单点登陆的概念: 当一个大系统中存在 ... -
单点登录系统SSO原理
2009-06-08 11:28 987单点登录系统SSO原理 本文以某新闻单位多媒体数 ... -
单点登录sso的定义
2009-06-08 11:58 749单点登录sso的定义 单点登录(Single Sign O ... -
JSP获取真实IP地址
2009-06-09 15:31 823在JSP里,获取客户端的IP地址的方法是:request.ge ... -
JFreeChart API说明
2009-06-22 11:28 891JFreeChart类:void setAntiAlias(b ... -
正则表达式在JAVA中的应用
2009-06-22 13:56 909众所周知,在程序开发中,难免会遇到需要匹配、查找、替换、判断字 ... -
JFreeChart 中的数据源
2009-06-23 11:50 9823 数据源处理 JFreeChart 中的数据源是DataSe ...
相关推荐
其中,POI-HSSF组件用于读写MS Excel(.xls)文件,而POI-XSSF组件则用于读写Office Open XML(.xlsx)文件。POI-OOXML组件提供了对Office Open XML文件的支持,包括Word(.docx)、Excel(.xlsx)和PowerPoint(....
"poiDemo"可能包含基本的读写操作,而"poi2word"可能进一步展示了如何将数据从其他格式(如CSV或数据库)导入到Word文档中,或者将Word文档的内容导出到其他格式。 6. **最佳实践** - 使用try-with-resources语句...
Apache POI是广泛使用的Java库,它支持对Microsoft Office格式的文件进行读写操作,包括Word(.doc和.docx)。使用POI,我们可以创建新的Word文档,添加文本、图片、表格,甚至执行复杂的格式化任务。例如,以下代码...
Apache POI是一个开源项目,它提供了API来读取、写入和修改MS Office文件。POI支持HSSF(Horrible Spreadsheet Format)用于处理Excel文件,XSSF(XML Spreadsheet Format)用于Excel 2007以上的版本,HWPF...
简而言之,您可以使用 Java 读写 MS Excel 文件,可以使用 Java 读写 MS Word 和 MS PowerPoint 文件。本代码实例是使用java语言写的poi解密excel文件实例代码,代码只实现了.xls类型的excel,.xlsx类型的excel只需...
在IT行业中,Apache POI是一个广泛应用的库,主要用于读写Microsoft Office格式的文件,如Word、Excel和PowerPoint。在本场景中,我们关注的是如何使用Apache POI来实现Word文档的动态传参功能,这通常涉及到模板...
Apache POI是一个开源项目,它提供了API来创建、修改和显示MS Office文件,包括Excel(XLS和XLSX)、Word(DOC和DOCX)以及PowerPoint(PPT和PPTX)。在处理Excel文件时,我们主要关注的是HSSF(用于处理旧版的BIFF8...
以上就是使用Java的Apache POI框架读写Excel和Word文档的基本操作。实际应用中,你可能需要处理更复杂的情况,如样式设置、公式计算、图表操作等,这都需要进一步学习POI提供的高级API。在实践中不断探索和学习,你...
在"poi-3.0.2.rar"中,包含了Apache POI的3.0.2版本,这个版本支持对早期的Word格式(.doc)进行操作。 首先,我们需要了解Apache POI的基本使用。在Java程序中,我们导入必要的POI库,然后使用`HWPFDocument`类来...
Apache POI提供了一套API,允许程序员在Java环境中读写MS Office格式的文件,极大地拓展了Java在办公自动化领域的应用。 Apache POI 3.71是该项目的一个稳定版本,包含了对HSSF(Horizontally Stored Format)和...
Apache POI是一个开源项目,它提供了Java API来读取、创建、修改MS Office格式的文件。对于Word文档,POI提供了XWPFDocument类来处理.docx格式的文件。 2. **XWPFDocument类** `XWPFDocument`是Apache POI中的...
POI是Java开发者用来读写MS Office文档的主要工具。其中,对Excel的支持主要通过HSSF(Horrible Spreadsheet Format)和XSSF(XML Spreadsheet Format)两个API来实现。HSSF用于处理老版的BIFF格式,而XSSF则用于...
Apache POI 是一个Java库,专门用于读写Microsoft Office格式的文件,特别是Excel。在描述中提到的HSSF是POI中的一个接口,用于处理MSExcel的对象,这意味着它允许开发者在Java环境中创建、修改和读取Excel文件。...
2. 提供了对Word文档的读写支持,包括段落、表格、图片和样式。 3. 强大的API设计,使得操作Office文档变得简单易行。 4. 兼容性好,能够处理多种版本的Office文件。 5. 优化的性能,减少了内存占用,提高了处理大型...
2. "去脚本之家看看.url":这可能是一个链接,指向脚本之家网站,该网站可能提供了关于Apache POI或"poi-ooxml-schemas-3.9.jar"的教程、示例代码或资源,帮助开发者更好地理解和使用这个库。 3. "服务器软件.url":...
Apache POI是Java领域用于处理Microsoft Office格式文档的开源库,尤其在Excel文件的读写方面表现出色。本文将深入探讨如何使用Apache POI库来读取和操作Excel文件,并结合POI-XML模块进行详细讲解。 Apache POI...
简而言之,您可以使用Java读写MS Excel文件。此外,您还可以使用Java读取和写入MS Word和MS PowerPoint文件。Apache POI是您的Java Excel解决方案(适用于Excel 97-2008)。我们有一个完整的API用于移植其他OOXML和...
标题中的“poi3.7支持中文编码”指的是Apache POI库在版本3.7中对中文字符编码的支持,使得Java程序能够正确处理包含中文的Microsoft Office文档,如Excel、PowerPoint和Word。Apache POI是一个开源项目,它提供了一...
Apache POI是Apache软件基金会的一个开源项目,主要为Java平台提供了API,用于创建、修改和显示MS Office格式的文件,包括Word(.doc和.docx)、Excel(.xls和.xlsx)和PowerPoint(.ppt和.pptx)。在Java中,如果你...
为了解决这个问题,开发者可能已经对POI进行了优化或者使用了第三方库,如docx4j,这些库专为移动端进行了调整。 这个源码示例中,关键步骤可能包括: 1. **创建Word文档对象**:通过XWPFDocument类实例化一个Word...