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

POI 关于对 ms word的读写代码

    博客分类:
  • J2EE
阅读更多

POI 关于对 ms word的读写代码

关键字: poi

read word:
Java代码 复制代码
  1. publicclassWordExtractor{
  2. publicWordExtractor(){
  3. }
  4. publicStringextractText(InputStreamin)throwsIOException{
  5. ArrayListtext=newArrayList();
  6. POIFSFileSystemfsys=newPOIFSFileSystem(in);
  7. DocumentEntryheaderProps=(DocumentEntry)fsys.getRoot().getEntry("WordDocument");
  8. DocumentInputStreamdin=fsys.createDocumentInputStream("WordDocument");
  9. byte[]header=newbyte[headerProps.getSize()];
  10. din.read(header);
  11. din.close();
  12. //Prendeleinformazionidall'headerdeldocumento
  13. intinfo=LittleEndian.getShort(header,0xa);
  14. booleanuseTable1=(info&0x200)!=0;
  15. //booleanuseTable1=true;
  16. //Prendeinformazionidallapiecetable
  17. intcomplexOffset=LittleEndian.getInt(header,0x1a2);
  18. //intcomplexOffset=LittleEndian.getInt(header);
  19. StringtableName=null;
  20. if(useTable1){
  21. tableName="1Table";
  22. }else{
  23. tableName="0Table";
  24. }
  25. DocumentEntrytable=(DocumentEntry)fsys.getRoot().getEntry(tableName);
  26. byte[]tableStream=newbyte[table.getSize()];
  27. din=fsys.createDocumentInputStream(tableName);
  28. din.read(tableStream);
  29. din.close();
  30. din=null;
  31. fsys=null;
  32. table=null;
  33. headerProps=null;
  34. intmultiple=findText(tableStream,complexOffset,text);
  35. StringBuffersb=newStringBuffer();
  36. intsize=text.size();
  37. tableStream=null;
  38. for(intx=0;x<size;x++){
  39. WordTextPiecenextPiece=(WordTextPiece)text.get(x);
  40. intstart=nextPiece.getStart();
  41. intlength=nextPiece.getLength();
  42. booleanunicode=nextPiece.usesUnicode();
  43. StringtoStr=null;
  44. if(unicode){
  45. toStr=newString(header,start,length*multiple,"UTF-16LE");
  46. }else{
  47. toStr=newString(header,start,length,"ISO-8859-1");
  48. }
  49. sb.append(toStr).append("");
  50. }
  51. returnsb.toString();
  52. }
  53. privatestaticintfindText(byte[]tableStream,intcomplexOffset,ArrayListtext)
  54. throwsIOException{
  55. //actualtext
  56. intpos=complexOffset;
  57. intmultiple=2;
  58. //skipsthroughtheprmsbeforewereachthepiecetable.Thesecontaindata
  59. //foractualfastsavedfiles
  60. while(tableStream[pos]==1){
  61. pos++;
  62. intskip=LittleEndian.getShort(tableStream,pos);
  63. pos+=2+skip;
  64. }
  65. if(tableStream[pos]!=2){
  66. thrownewIOException("corruptedWordfile");
  67. }else{
  68. //parseoutthetextpieces
  69. intpieceTableSize=LittleEndian.getInt(tableStream,++pos);
  70. pos+=4;
  71. intpieces=(pieceTableSize-4)/12;
  72. for(intx=0;x<pieces;x++){
  73. intfilePos=
  74. LittleEndian.getInt(tableStream,pos+((pieces+1)*4)+(x*8)+2);
  75. booleanunicode=false;
  76. if((filePos&0x40000000)==0){
  77. unicode=true;
  78. }else{
  79. unicode=false;
  80. multiple=1;
  81. filePos&=~(0x40000000);//givesmeFCindocstream
  82. filePos/=2;
  83. }
  84. inttotLength=
  85. LittleEndian.getInt(tableStream,pos+(x+1)*4)
  86. -LittleEndian.getInt(tableStream,pos+(x*4));
  87. WordTextPiecepiece=newWordTextPiece(filePos,totLength,unicode);
  88. text.add(piece);
  89. }
  90. }
  91. returnmultiple;
  92. }
  93. publicstaticvoidmain(String[]args){
  94. WordExtractorw=newWordExtractor();
  95. POIFSFileSystemps=newPOIFSFileSystem();
  96. try{
  97. Filefile=newFile("C:\\test.doc");
  98. InputStreamin=newFileInputStream(file);
  99. Strings=w.extractText(in);
  100. System.out.println(s);
  101. }catch(Exceptione){
  102. e.printStackTrace();
  103. }
  104. }
  105. }
  106. classWordTextPiece{
  107. privateint_fcStart;
  108. privateboolean_usesUnicode;
  109. privateint_length;
  110. publicWordTextPiece(intstart,intlength,booleanunicode){
  111. _usesUnicode=unicode;
  112. _length=length;
  113. _fcStart=start;
  114. }
  115. publicbooleanusesUnicode(){
  116. return_usesUnicode;
  117. }
  118. publicintgetStart(){
  119. return_fcStart;
  120. }
  121. publicintgetLength(){
  122. return_length;
  123. }
  124. }
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

Java代码 复制代码
  1. publicbooleanwriteWordFile(Stringpath,Stringcontent){
  2. booleanw=false;
  3. try{
  4. //byteb[]=content.getBytes("ISO-8859-1");
  5. byteb[]=content.getBytes();
  6. ByteArrayInputStreambais=newByteArrayInputStream(b);
  7. POIFSFileSystemfs=newPOIFSFileSystem();
  8. DirectoryEntrydirectory=fs.getRoot();
  9. DocumentEntryde=directory.createDocument("WordDocument",bais);
  10. FileOutputStreamostream=newFileOutputStream(path);
  11. fs.writeFilesystem(ostream);
  12. bais.close();
  13. ostream.close();
  14. }catch(IOExceptione){
  15. e.printStackTrace();
  16. }
  17. returnw;
  18. }
	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
评论
11 楼 cleanboxer 2007-06-18 回复
开发poi word 的那个哥们老早就不干了,好像就职于商业的公司,apache还招募人参与呢,2006的事, poi处理word 太弱,还得用vs6.0 c++, java的开源的那个word有更详细的文档,不过没研究过,处理excel还算凑合,
不过也问题比较多,不能区分单元格内内容的格式,或错误判断
10 楼 jlusdy 2007-06-15 回复
问个问题,写work java哪个开源包比较好
我看POIword支持不太够啊
9 楼 andyandyandy 2007-04-02 回复
word的少见,收了
8 楼 strongkill 2007-04-02 回复
http://jakarta.apache.org/poi/index.html
7 楼 dy.f 2007-03-15 回复
poi-2.5.1-final-20040804.jar
poi-contrib-2.5.1-final-20040804.jar
poi-scratchpad-2.5.1-final-20040804.jar

能提供这几个包的下载吗?
6 楼 transist 2007-03-06 回复
感谢楼主,这个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.


有点小问题,希望楼主有时间的时候帮忙大家修复一下,那就是有部分提取的文本前后有小方框的,我想应该是这些字符本不该被提取。
5 楼 sprite 2007-02-07 回复
希望楼主把表情符号关掉 重新编辑一下 让大家能欣赏到正确的代码
4 楼 fish922 2007-02-07 回复
word的代码不对!
3 楼 minimu 2006-09-14 回复
收藏下
2 楼 抛出异常的爱 2006-09-14 回复
代码里应该关了表情符号吧
1 楼 java虫 2006-09-14 回复
不错,收藏一下。论坛里这方面帖子不多
分享到:
评论

相关推荐

    poi完美word转html

    其中,POI-HSSF组件用于读写MS Excel(.xls)文件,而POI-XSSF组件则用于读写Office Open XML(.xlsx)文件。POI-OOXML组件提供了对Office Open XML文件的支持,包括Word(.docx)、Excel(.xlsx)和PowerPoint(....

    poi word 打印

    "poiDemo"可能包含基本的读写操作,而"poi2word"可能进一步展示了如何将数据从其他格式(如CSV或数据库)导入到Word文档中,或者将Word文档的内容导出到其他格式。 6. **最佳实践** - 使用try-with-resources语句...

    java manipulate MS Word

    Apache POI是广泛使用的Java库,它支持对Microsoft Office格式的文件进行读写操作,包括Word(.doc和.docx)。使用POI,我们可以创建新的Word文档,添加文本、图片、表格,甚至执行复杂的格式化任务。例如,以下代码...

    poi实现合并word文档共4页.pdf.zip

    Apache POI是一个开源项目,它提供了API来读取、写入和修改MS Office文件。POI支持HSSF(Horrible Spreadsheet Format)用于处理Excel文件,XSSF(XML Spreadsheet Format)用于Excel 2007以上的版本,HWPF...

    java使用poi解密excel文件的实例代码

    简而言之,您可以使用 Java 读写 MS Excel 文件,可以使用 Java 读写 MS Word 和 MS PowerPoint 文件。本代码实例是使用java语言写的poi解密excel文件实例代码,代码只实现了.xls类型的excel,.xlsx类型的excel只需...

    poi实现word动态传参

    在IT行业中,Apache POI是一个广泛应用的库,主要用于读写Microsoft Office格式的文件,如Word、Excel和PowerPoint。在本场景中,我们关注的是如何使用Apache POI来实现Word文档的动态传参功能,这通常涉及到模板...

    java利用poi对Excel进行读写操作支持多sheet格式

    Apache POI是一个开源项目,它提供了API来创建、修改和显示MS Office文件,包括Excel(XLS和XLSX)、Word(DOC和DOCX)以及PowerPoint(PPT和PPTX)。在处理Excel文件时,我们主要关注的是HSSF(用于处理旧版的BIFF8...

    java 使用POI框架读写excel doc

    以上就是使用Java的Apache POI框架读写Excel和Word文档的基本操作。实际应用中,你可能需要处理更复杂的情况,如样式设置、公式计算、图表操作等,这都需要进一步学习POI提供的高级API。在实践中不断探索和学习,你...

    java word文档读取;Apache_POI_API.rar;jacob.jar;poi-3.0.2.rar

    在"poi-3.0.2.rar"中,包含了Apache POI的3.0.2版本,这个版本支持对早期的Word格式(.doc)进行操作。 首先,我们需要了解Apache POI的基本使用。在Java程序中,我们导入必要的POI库,然后使用`HWPFDocument`类来...

    poi-3.71 word 生成工具

    Apache POI提供了一套API,允许程序员在Java环境中读写MS Office格式的文件,极大地拓展了Java在办公自动化领域的应用。 Apache POI 3.71是该项目的一个稳定版本,包含了对HSSF(Horizontally Stored Format)和...

    Java利用poi对word插入文字图片.pdf

    Apache POI是一个开源项目,它提供了Java API来读取、创建、修改MS Office格式的文件。对于Word文档,POI提供了XWPFDocument类来处理.docx格式的文件。 2. **XWPFDocument类** `XWPFDocument`是Apache POI中的...

    poi-ooxml-3.9-sources.jar.zip_excel poi_hugeigz_poi ooxml 3.9.ja

    POI是Java开发者用来读写MS Office文档的主要工具。其中,对Excel的支持主要通过HSSF(Horrible Spreadsheet Format)和XSSF(XML Spreadsheet Format)两个API来实现。HSSF用于处理老版的BIFF格式,而XSSF则用于...

    POI 中文学习文档(.doc)

    Apache POI 是一个Java库,专门用于读写Microsoft Office格式的文件,特别是Excel。在描述中提到的HSSF是POI中的一个接口,用于处理MSExcel的对象,这意味着它允许开发者在Java环境中创建、修改和读取Excel文件。...

    POI最新Jar包Excel

    2. 提供了对Word文档的读写支持,包括段落、表格、图片和样式。 3. 强大的API设计,使得操作Office文档变得简单易行。 4. 兼容性好,能够处理多种版本的Office文件。 5. 优化的性能,减少了内存占用,提高了处理大型...

    poi-ooxml-schemas-3.9.jar_jb51_POI_

    2. "去脚本之家看看.url":这可能是一个链接,指向脚本之家网站,该网站可能提供了关于Apache POI或"poi-ooxml-schemas-3.9.jar"的教程、示例代码或资源,帮助开发者更好地理解和使用这个库。 3. "服务器软件.url":...

    poi_poi文件_

    Apache POI是Java领域用于处理Microsoft Office格式文档的开源库,尤其在Excel文件的读写方面表现出色。本文将深入探讨如何使用Apache POI库来读取和操作Excel文件,并结合POI-XML模块进行详细讲解。 Apache POI...

    POI导入测试用数据users.xls

    简而言之,您可以使用Java读写MS Excel文件。此外,您还可以使用Java读取和写入MS Word和MS PowerPoint文件。Apache POI是您的Java Excel解决方案(适用于Excel 97-2008)。我们有一个完整的API用于移植其他OOXML和...

    poi3.7支持中文编码

    标题中的“poi3.7支持中文编码”指的是Apache POI库在版本3.7中对中文字符编码的支持,使得Java程序能够正确处理包含中文的Microsoft Office文档,如Excel、PowerPoint和Word。Apache POI是一个开源项目,它提供了一...

    java office(word)文档读写jar

    Apache POI是Apache软件基金会的一个开源项目,主要为Java平台提供了API,用于创建、修改和显示MS Office格式的文件,包括Word(.doc和.docx)、Excel(.xls和.xlsx)和PowerPoint(.ppt和.pptx)。在Java中,如果你...

    Android应用源码利用poi将内容填到word模板源码.zip

    为了解决这个问题,开发者可能已经对POI进行了优化或者使用了第三方库,如docx4j,这些库专为移动端进行了调整。 这个源码示例中,关键步骤可能包括: 1. **创建Word文档对象**:通过XWPFDocument类实例化一个Word...

Global site tag (gtag.js) - Google Analytics