javapoi读取word文件|java解析word文档有哪些方法

|

『壹』 java 中用poi读取word和用docx4j读取word

不知道你是具体读取Word里面的什么元素,下面以读取文字和图片为例吧,两个代码示例,你参考看看:

读取文本

import com.spire.doc.Document;

import java.io.FileWriter;

import java.io.IOException;

public class ExtractText {public static void main(String[] args) throws IOException {//加载Word文档Document document = new Document();document.loadFromFile("C:\Users\Administrator\Desktop\sample.docx");//获取文档中的文本保存为StringString text=document.getText();//将String写入Txt文件writeStringToTxt(text,"ExtractedText.txt");}public static void writeStringToTxt(String content, String txtFileName) throws IOException {FileWriter fWriter= new FileWriter(txtFileName,true);try {fWriter.write(content);}catch(IOException ex){ex.printStackTrace();}finally{try{fWriter.flush();fWriter.close();} catch (IOException ex) {ex.printStackTrace();}}}

}

2. 读取图片

import com.spire.doc.Document;

import com.spire.doc.documents.DocumentObjectType;

import com.spire.doc.fields.DocPicture;

import com.spire.doc.interfaces.ICompositeObject;

import com.spire.doc.interfaces.IDocumentObject;

import javax.imageio.ImageIO;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.IOException;

import java.util.ArrayList;

import java.util.LinkedList;

import java.util.List;

import java.util.Queue;

public class ExtractImages {

public static void main(String[] args) throws IOException {

//加载Word文档

Document document = new Document();

document.loadFromFile("C:\Users\Administrator\Desktop\sample.docx");

//创建Queue对象

Queue nodes = new LinkedList();

nodes.add(document);

//创建List对象

List images = new ArrayList();

//遍历文档中的子对象

while (nodes.size() > 0) {

ICompositeObject node = nodes.poll();

for (int i = 0; i < node.getChildObjects().getCount(); i++) {

IDocumentObject child = node.getChildObjects().get(i);

if (child instanceof ICompositeObject) {

nodes.add((ICompositeObject) child);

//获取图片并添加到List

if (child.getDocumentObjectType() == DocumentObjectType.Picture) {

DocPicture picture = (DocPicture) child;

images.add(picture.getImage());

}

}

}

}

//将图片保存为PNG格式文件

for (int i = 0; i < images.size(); i++) {

File file = new File(String.format("output/图片-%d.png", i));

ImageIO.write(images.get(i), "PNG", file);

}

}

}

注意这里使用的jar包是spire.doc.jar,需要在java程序中先导入jar文件。

『贰』 java操作word 的有哪几种方式

java读取word文档时,虽然网上介绍了很多插件poi、java2Word、jacob、itext等等,poi无法读取格式(新的API估计行好像还在处于研发阶段,不太稳定,做项目不太敢用);java2Word、jacob容易报错找不到注册,比较诡异,我曾经在不同的机器上试过,操作方法完全一致,有的机器不报错,有的报错,去他们论坛找高人解决也说不出原因,项目部署用它有点玄;itxt好像写很方便但是我查了好久资料没有见到过关于读的好办法。经过一番选择还是折中点采用rtf最好,毕竟rtf是开源格式,不需要借助任何插件,只需基本IO操作外加编码转换即可。rtf格式文件表面看来和doc没啥区别,都可以用word打开,各种格式都可以设定。—– 实现的功能:读取rtf模板内容(格式和文本内容),替换变化部分,形成新的rtf文档。—– 实现思路:模板中固定部分手动输入,变化的部分用$info$表示,只需替换$info$即可。1、采用字节的形式读取rtf模板内容2、将可变的内容字符串转为rtf编码3、替换原文中的可变部分,形成新的rtf文档主要程序如下:public String bin2hex(String bin) {char[] digital = "0123456789ABCDEF".toCharArray();StringBuffer sb = new StringBuffer("");byte[] bs = bin.getBytes();int bit;for (int i = 0; i < bs.length;i++) {bit = (bs[i] & 0x0f0)>> 4;sb.append("\\'");sb.append(digital[bit]);bit = bs[i] & 0x0f;sb.append(digital[bit]);}return sb.toString(); }public String readByteRtf(InputStream ins, String path){ String sourcecontent =""; try{ ins = newFileInputStream(path); byte[] b= new byte[1024];if (ins == null) {System.out.println("源模板文件不存在");}int bytesRead = 0;while (true) {bytesRead = ins.read(b, 0, 1024); // return final read bytescountsif(bytesRead == -1) {// end of InputStreamSystem.out.println("读取模板文件结束");break;}sourcecontent += new String(b, 0, bytesRead); // convert to stringusing bytes} }catch(Exception e){ e.printStackTrace(); }

『叁』 Java 利用poi 可以直接读取word中的表格保持样式生成新的word么

1.读取word2003及word2007需要的jar包读取2003版本(.doc)的word文件相对来说比较简单,只需要poi-3.5-beta6-20090622.jar和poi-scratchpad-3.5-beta6-20090622.jar两个jar包即可,而2007版本(.docx)就麻烦多,我说的这个麻烦不是我们写代码的时候麻烦,是要导入的jar包比较的多,有如下7个之多:1.openxml4j-bin-beta.jar2.poi-3.5-beta6-20090622.jar3.poi-ooxml-3.5-beta6-20090622.jar4.dom4j-1.6.1.jar5.geronimo-stax-api_1.0_spec-1.0.jar6.ooxml-schemas-1.0.jar7.xmlbeans-2.3.0.jar其中4-7是poi-ooxml-3.5-beta6-20090622.jar所依赖的jar包(在poi-bin-3.5-beta6-20090622.tar.gz中的ooxml-lib目录下可以找到)。2.换行符号硬换行:文件中换行,如果是键盘中使用了"enter"的换行。软换行:文件中一行的字符数容量有限,当字符数量超过一定值时,会自动切到下行显示。对程序来说,硬换行才是可以识别的、确定的换行,软换行与字体大小、缩进有关。3.读取的注意事项值得注意的是:POI在读取不会读取word文件中的图片信息;还有就是对于2007版的word(.docx),如果word文件中有表格,所有表格中的数据都会在读取出来的字符串的最后。4.读取word文本内容代码1importjava.io.File;2importjava.io.FileInputStream;3importjava.io.InputStream;45importorg.apache.poi.POIXMLDocument;6importorg.apache.poi.POIXMLTextExtractor;7importorg.apache.poi.hwpf.extractor.WordExtractor;8importorg.apache.poi.openxml4j.opc.OPCPackage;9importorg.apache.poi.xwpf.extractor.XWPFWordExtractor;1011publicclassTest{12publicstaticvoidmain(String[]args){13try{14InputStreamis=newFileInputStream(newFile("2003.doc"));15WordExtractorex=newWordExtractor(is);16Stringtext2003=ex.getText();17System.out.println(text2003);1819OPCPackageopcPackage=POIXMLDocument.openPackage("2007.docx");20POIXMLTextExtractorextractor=newXWPFWordExtractor(opcPackage);21Stringtext2007=extractor.getText();22System.out.println(text2007);2324}catch(Exceptione){25e.printStackTrace();26}27}28}

『肆』 怎样才能把word文件读取并显示在java中请各位指教!

java读取word文档时,虽然网上介绍了很多插件poi、java2Word、jacob、itext等等,poi无法读取格式(新的API估计行好像还在处于研发阶段,不太稳定,做项目不太敢用);java2Word、jacob容易报错找不到注册,比较诡异,我曾经在不同的机器上试过,操作方法完全一致,有的机器不报错,有的报错,去他们论坛找高人解决也说不出原因,项目部署用它有点玄;itxt好像写很方便但是我查了好久资料没有见到过关于读的好法。经过一番选择还是折中点采用rtf最好,毕竟rtf是开源格式,不需要借助任何插件,只需基本IO操作外加编码转换即可。rtf格式文件表面看来和doc没啥区别,都可以用word打开,各种格式都可以设定。具体代码可以参考:/blog/468943

『伍』 怎么使用JAVA,POI读写word文档

如何使用JAVA、POI读写word文档??能不能将一个word的内容完全读过来,放到一个新生成的word文件中去,要求能将word中的表格、图片等保留,格式不变。最好能给个例子?网上多是很早以前的那个解决方法如下:,只能读文本内容,且新生成的word文件打开时总是要提示选择编码,不太好用,希望能有新的解决方案??!!poi操作word1.1 添加poi支持:包下载地址1.2 POI对Excel文件的读取操作比较方便,POI还提供对Word的DOC格式文件的读取。但在它的发行版本中没有发布对Word支持的模块,需要另外下载一个POI的扩展的Jar包。下载地址为;下载extractors-0.4_zip这个文件2、提取Doc文件内容public static String readDoc(String doc) throws Exception {// 创建输入流读取DOC文件FileInputStream in = new FileInputStream(new File(doc));WordExtractor extractor = null;String text = null;// 创建WordExtractorextractor = new WordExtractor();// 对DOC文件进行提取text = extractor.extractText(in);return text;}public static void main(String[] args) {try{String text = WordReader.readDoc("c:/test.doc");System.out.println(text);}catch(Exception e){e.printStackTrace();}}3、写入Doc文档 import java.io.ByteArrayInputStream;import java.io.FileOutputStream;import java.io.IOException;import org.apache.poi.poifs.filesystem.DirectoryEntry;import org.apache.poi.poifs.filesystem.DocumentEntry;import org.apache.poi.poifs.filesystem.POIFSFileSystem;public class WordWriter {public static boolean writeDoc(String path, String content) {boolean w = false;try { // byte b[] = content.getBytes("ISO-8859-1");byte b[] = content.getBytes(); ByteArrayInputStream s = new ByteArrayInputStream(b); POIFSFileSystem fs = new POIFSFileSystem();DirectoryEntry directory = fs.getRoot(); DocumentEntry de = directory.createDocument("WordDocument", s); FileOutputStream ostream = new FileOutputStream(path); fs.writeFilesystem(ostream); s.close();ostream.close(); } catch (IOException e) {e.printStackTrace();}return w;}public static void main(String[] args) throws Exception{String wr=WordReader.readDoc("D:\\test.doc");boolean b = writeDoc("D:\\result.doc",wr);

『陆』 Java poi读取doc文档出错

The supplied data appears to be a raw XML file. Formats such as Office 2003 XML are not supported

换对象来处理

~~~~~~~~~~~~~~~~~~~~~~~~~~

/***仅支持2003**@paramfile*@throwsIOException*/(Filefile)throwsIOException{InputStreamis=newFileInputStream(file);Workbookrwb=newHSSFWorkbook(is);Sheetsheet=rwb.getSheetAt(0);Rowrow=sheet.getRow(3);Cellcell=row.getCell(0);System.out.println(cell.getStringCellValue());}/***仅支持2007**@paramfile*@throwsIOException*/(Filefile)throwsIOException{InputStreamis=newFileInputStream(file);Workbookrwb=newXSSFWorkbook(is);Sheetsheet=rwb.getSheetAt(0);Rowrow=sheet.getRow(3);Cellcell=row.getCell(0);System.out.println(cell.getStringCellValue());}/***支持2003/2007**@paramfile*@throwsException*/privatestaticvoidreadExcel(Filefile)throwsException{InputStreamis=newFileInputStream(file);Workbookrwb=WorkbookFactory.create(is);Sheetsheet=rwb.getSheetAt(0);Rowrow=sheet.getRow(3);Cellcell=row.getCell(0);System.out.println(cell.getStringCellValue());}

『柒』 java解析word文档有哪些方法

java读取word文档时,虽然网上介绍了很多插件poi、java2Word、jacob、itext等等,poi无法读取格式(新的估计行好像还在处于研发阶段,不太稳定,做项目不太敢用);java2Word、jacob容易报错找不到注册,比较诡异,我曾经在不同的机器上试过,操作方法完全一致,有的机器不报错,有的报错,去他们论坛找高人解决也说不出原因,项目部署用它有点玄;itxt好像写很方便但是我查了好久资料没有见到过关于读的好办法。经过一番选择还是折中点采用rtf最好,毕竟rtf是开源格式,不需要借助任何插件,只需基本IO操作外加编码转换即可。rtf格式文件表面看来和doc没啥区别,都可以用word打开,各种格式都可以设定。—– 实现的功能:读取rtf模板内容(格式和文本内容),替换变化部分,形成新的rtf文档。—– 实现思路:模板中固定部分手动输入,变化的部分用$info$表示,只需替换$info$即可。1、采用字节的形式读取rtf模板内容2、将可变的内容字符串转为rtf编码3、替换原文中的可变部分,形成新的rtf文档主要程序如下:public String bin2hex(String bin) {char[] digital = "0123456789ABCDEF".toCharArray();StringBuffer sb = new StringBuffer("");byte[] bs = bin.getBytes();int bit;for (int i = 0; i < bs.length;i++) {bit = (bs[i] & 0x0f0)>> 4;sb.append("\\'");sb.append(digital[bit]);bit = bs[i] & 0x0f;sb.append(digital[bit]);}return sb.toString(); }public String readByteRtf(InputStream ins, String path){ String sourcecontent =""; try{ ins = newFileInputStream(path); byte[] b= new byte[1024];if (ins == null) {System.out.println("源模板文件不存在");}int bytesRead = 0;while (true) {bytesRead = ins.read(b, 0, 1024); // return final read bytescountsif(bytesRead == -1) {// end of InputStreamSystem.out.println("读取模板文件结束");break;}sourcecontent += new String(b, 0, bytesRead); // convert to stringusing bytes} }catch(Exception e){ e.printStackTrace(); } return sourcecontent ;}以上为核心代码,剩余部分就是替换,从新组装java中的String.replace(oldstr,newstr);方法可以实现,在这就不贴了。源代码部分详见附件。运行源代码前提:c盘创建YQ目录,将附件中"模板.rtf"复制到YQ目录之下,运行OpreatorRTF.java文件即可,就会在YQ目录下生成文件名如:21时15分19秒_cheney_记录.rtf的文件。 package com;import java.io.File;import java.io.FileInputStream;import java.io.FileWriter;import java.io.IOException;import java.io.InputStream;import java.io.PrintWriter;import java.text.SimpleDateFormat;import java.util.Date;public class OperatorRTF {public String strToRtf(String content){char[] digital = "0123456789ABCDEF".toCharArray();StringBuffer sb = new StringBuffer("");byte[] bs = content.getBytes();int bit;for (int i = 0; i < bs.length; i++) {bit = (bs[i] & 0x0f0)>> 4;sb.append("\\'");sb.append(digital[bit]);bit = bs[i] & 0x0f;sb.append(digital[bit]);}return sb.toString();}public String replaceRTF(String content,String replacecontent,intflag){String rc = strToRtf(replacecontent);String target = "";if(flag==0){target = content.replace("$timetop$",rc);}if(flag==1){target = content.replace("$info$",rc);}if(flag==2){target = content.replace("$idea$",rc);}if(flag==3){target = content.replace("$advice$",rc);}if(flag==4){target = content.replace("$infosend$",rc);}return target;}public String getSavePath() {String path = "C:\\YQ";File fDirecotry = new File(path);if (!fDirecotry.exists()) {fDirecotry.mkdirs();}return path;}public String ToSBC(String input){char[] c =input.toCharArray();for (int i =0; i < c.length; i++){if (c[i] == 32){c[i] = (char) 12288;continue;}if (c[i] < 127){c[i] = (char) (c[i] + 65248);}}return newString(c);}public void rgModel(String username, String content) {// TODO Auto-generated method stubDate current=new Date();SimpleDateFormat sdf=new java.text.SimpleDateFormat("yyyy-MM-ddHH:mm:ss");String targetname = sdf.format(current).substring(11,13) + "时";targetname += sdf.format(current).substring(14,16) + "分";targetname += sdf.format(current).substring(17,19) + "秒";targetname += "_" + username +"_记录.rtf";String strpath = getSavePath();String sourname = strpath+"\\"+"模板.rtf";String sourcecontent = "";InputStream ins = null;try{ins = new FileInputStream(sourname);byte[] b = new byte[1024];if (ins == null) {System.out.println("源模板文件不存在");}int bytesRead = 0;while (true) {bytesRead = ins.read(b, 0, 1024); // return final read bytescountsif(bytesRead == -1) {// end of InputStreamSystem.out.println("读取模板文件结束");break;}sourcecontent += new String(b, 0, bytesRead); // convert to stringusing bytes}}catch(Exception e){e.printStackTrace();}String targetcontent = "";String array[] = content.split("~");for(int i=0;i<array.length;i++){if(i==0){targetcontent = replaceRTF(sourcecontent, array[i], i);}else{targetcontent = replaceRTF(targetcontent, array[i], i);}} try {FileWriter fw = new FileWriter(getSavePath()+"\\" +targetname,true);PrintWriter out = new PrintWriter(fw);if(targetcontent.equals("")||targetcontent==""){out.println(sourcecontent);}else{out.println(targetcontent);}out.close();fw.close();System.out.println(getSavePath()+" 该目录下生成文件" +targetname + " 成功");} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static void main(String[] args) {// TODO Auto-generated method stubOperatorRTF oRTF = new OperatorRTF();String content ="2008年10月12日9时-2008年10月12日6时~我们参照检验药品的方法~我们参照检验药品的方法~我们参照检验药品的方法~我们参照检验药品的方法";oRTF.rgModel("cheney",content);}}

『捌』 怎样用Java、POI技术来读取Word文档,并把Word文档的原来格式完整地显示在页面上

可以读取元素,将word相应的元素转换为html相应的元素。不过很多word的特效都是html无法展示的,具体的做法可以参考poi的官方文档,官方文档很详细。

『玖』 如何使用JAVA,POI读写word文档

public class HwpfTest {@SuppressWarnings("deprecation")@Testpublic void testReadByExtractor() throws Exception {InputStream is = new FileInputStream("D:\\test.doc");WordExtractor extractor = new WordExtractor(is);//输出文档所有的文本System.out.println(extractor.getText());System.out.println(extractor.getTextFromPieces());//输出页眉的内容System.out.println("页眉:" + extractor.getHeaderText());//输出页脚的内容System.out.println("页脚:" + extractor.getFooterText());//输出当前word文档的元数据信息,包括作者、文档的修改时间等。System.out.println(extractor.getMetadataTextExtractor().getText());//获取各个段落的文本String paraTexts[] = extractor.getParagraphText();for (int i=0; i<paraTexts.length; i++) {System.out.println("Paragraph " + (i+1) + " : " + paraTexts[i]);}//输出当前word的一些信息printInfo(extractor.getSummaryInformation());//输出当前word的一些信息this.printInfo(extractor.getDocSummaryInformation());this.closeStream(is);}/*** 输出SummaryInfomation* @param info*/private void printInfo(SummaryInformation info) {//作者System.out.println(info.getAuthor());//字符统计System.out.println(info.getCharCount());//页数System.out.println(info.getPageCount());//标题System.out.println(info.getTitle());//主题System.out.println(info.getSubject());}/*** 输出DocumentSummaryInfomation* @param info*/private void printInfo(DocumentSummaryInformation info) {//分类System.out.println(info.getCategory());//公司System.out.println(info.getCompany());}/*** 关闭输入流* @param is*/private void closeStream(InputStream is) {if (is != null) {try {is.close();} catch (IOException e) {e.printStackTrace();}}}}


赞 (0)