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

怎么使用JAVA,POI读写word文档,第1张

如何使用JAVA、POI读写word文档??

能不能将一个word的内容完全读过来,放到一个新生成的word文件中去,要求能将word中的表格、等保留,格式不变。最好能给个例子?网上多是很早以前的那个解决方法如下:,只能读文本内容,且新生成的word文件打开时总是要提示选择编码,不太好用,希望能有新的解决方案??!!

poi *** 作word

11 添加poi支持:包下载地址

12 POI对Excel文件的读取 *** 作比较方便,POI还提供对Word的DOC格式文件的读取。但在它的发行版本中没有发布对Word支持的模块,需要另外下载一个POI的扩展的Jar包。下载地址为;下载extractors-04_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;

// 创建WordExtractor

extractor = new WordExtractor();

// 对DOC文件进行提取

text = extractorextractText(in);

return text;

}

public static void main(String[] args) {

try{

String text = WordReaderreadDoc("c:/testdoc");

Systemoutprintln(text);

}catch(Exception e){

eprintStackTrace();

}

}

3、写入Doc文档

import javaioByteArrayInputStream;

import javaioFileOutputStream;

import javaioIOException;

import orgapachepoipoifsfilesystemDirectoryEntry;

import orgapachepoipoifsfilesystemDocumentEntry;

import orgapachepoipoifsfilesystemPOIFSFileSystem;

public class WordWriter {

public static boolean writeDoc(String path, String content) {

boolean w = false;

try {

// byte b[] = contentgetBytes("ISO-8859-1");

byte b[] = contentgetBytes();

ByteArrayInputStream bais = new ByteArrayInputStream(b);

POIFSFileSystem fs = new POIFSFileSystem();

DirectoryEntry directory = fsgetRoot();

DocumentEntry de = directorycreateDocument("WordDocument", bais);

FileOutputStream ostream = new FileOutputStream(path);

fswriteFilesystem(ostream);

baisclose();

ostreamclose();

} catch (IOException e) {

eprintStackTrace();

}

return w;

}

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

String wr=WordReaderreadDoc("D:\\testdoc");

boolean b = writeDoc("D:\\resultdoc",wr);

java导出word代码如下:

package combankutil;

import javaawtColor;

import javaioFileOutputStream;

import javaioIOException;

import comlowagietextCell;

import comlowagietextDocument;

import comlowagietextDocumentException;

import comlowagietextElement;

import comlowagietextFont;

import comlowagietextFontFactory;

import comlowagietextImage;

import comlowagietextPageSize;

import comlowagietextParagraph;

import comlowagietextPhrase;

import comlowagietextTable;

import comlowagietextpdfBaseFont;

import comlowagietextrtfRtfWriter2;

public class WordTools {

public void createDocContext(String file) throws DocumentException,

IOException {

// 设置纸张大小

Document document = new Document(PageSizeA4);

// 建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中

RtfWriter2getInstance(document, new FileOutputStream(file));

documentopen();

// 设置中文字体

BaseFont bfChinese = BaseFontcreateFont("STSongStd-Light",

"UniGB-UCS2-H", BaseFontNOT_EMBEDDED);

// 标题字体风格

Font titleFont = new Font(bfChinese, 12, FontBOLD);

// 正文字体风格

Font contextFont = new Font(bfChinese, 10, FontNORMAL);

Paragraph title = new Paragraph("标题");

// 设置标题格式对齐方式

titlesetAlignment(ElementALIGN_CENTER);

titlesetFont(titleFont);

documentadd(title);

String contextString = "iText是一个能够快速产生PDF文件的java类库。"

+ " \n"// 换行

+ "iText的java类对于那些要产生包含文本,"

+ "表格,图形的只读文档是很有用的。它的类库尤其与java Servlet有很好的给合。"

+ "使用iText与PDF能够使你正确的控制Servlet的输出。";

Paragraph context = new Paragraph(contextString);

// 正文格式左对齐

contextsetAlignment(ElementALIGN_LEFT);

contextsetFont(contextFont);

// 离上一段落(标题)空的行数

contextsetSpacingBefore(5);

// 设置第一行空的列数

contextsetFirstLineIndent(20);

documentadd(context);

//利用类FontFactory结合Font和Color可以设置各种各样字体样式

/

FontUNDERLINE 下划线,FontBOLD 粗体

/

Paragraph underline = new Paragraph("下划线的实现", FontFactorygetFont(

FontFactoryHELVETICA_BOLDOBLIQUE, 18, FontUNDERLINE,

new Color(0, 0, 255)));

documentadd(underline);

// 设置 Table 表格

Table aTable = new Table(3);

int width[] = {25,25,50};

aTablesetWidths(width);//设置每列所占比例

aTablesetWidth(90); // 占页面宽度 90%

aTablesetAlignment(ElementALIGN_CENTER);//居中显示

aTablesetAlignment(ElementALIGN_MIDDLE);//纵向居中显示

aTablesetAutoFillEmptyCells(true); //自动填满

aTablesetBorderWidth(1); //边框宽度

aTablesetBorderColor(new Color(0, 125, 255)); //边框颜色

aTablesetPadding(0);//衬距,看效果就知道什么意思了

aTablesetSpacing(0);//即单元格之间的间距

aTablesetBorder(2);//边框

//设置表头

/

cellsetHeader(true);是将该单元格作为表头信息显示;

cellsetColspan(3);指定了该单元格占3列;

为表格添加表头信息时,要注意的是一旦表头信息添加完了之后, \

必须调用 endHeaders()方法,否则当表格跨页后,表头信息不会再显示

/

Cell haderCell = new Cell("表格表头");

haderCellsetHeader(true);

haderCellsetColspan(3);

aTableaddCell(haderCell);

aTableendHeaders();

Font fontChinese = new Font(bfChinese, 12, FontNORMAL, ColorGREEN);

Cell cell = new Cell(new Phrase("这是一个测试的 33 Table 数据", fontChinese ));

cellsetVerticalAlignment(ElementALIGN_TOP);

cellsetBorderColor(new Color(255, 0, 0));

cellsetRowspan(2);

aTableaddCell(cell);

aTableaddCell(new Cell("#1"));

aTableaddCell(new Cell("#2"));

aTableaddCell(new Cell("#3"));

aTableaddCell(new Cell("#4"));

Cell cell3 = new Cell(new Phrase("一行三列数据", fontChinese ));

cell3setColspan(3);

cell3setVerticalAlignment(ElementALIGN_CENTER);

aTableaddCell(cell3);

documentadd(aTable);

documentadd(new Paragraph("\n"));

//添加

// Image img=ImagegetInstance(">

如果没有特殊需求,可以直接使用jacob_zip中提供的jacobjar和jacobdll。把jacobdll文件放在系统可以找得到的

路径上,一般放c:/windows/system32下就行了,注意你用的jacobdll文件和你的jacobjar包要匹配,否则会报错哦! 

如果想自己编译也很简单,把jacob__srczip解开,建个工程,在buildxml中稍作配置即可: 

<property name="JDK" value="D:\Java\j2sdk142_13"/>

<property name="MSDEVDIR" value="D:\Microsoft Visual Studio\VC98"/>

<property name="version" value="112"/>

看出来了吗,你的机器上需要有JDK和VC环境,VC是用来生成jacobdll文件的,如果编译时说找不到MSPDB60DLL,那就在你的

Microsoft Visual Studio目录下搜索一下,拷贝到D:\Microsoft Visual

Studio\VC98\Bin下就行了。

如果需要对jacob里的jar包改名,(虽然通常不会发生这种情况,但如果你需要两个版本的jacob同时使用,改名可能是一种选择),这时你的工作就多一些:

(1)package改名是必须的了,比如我们把src下的comjacobactiveX改为comtestjacobactiveX,把

comjacobcom改为comtestjacobcom,打包时只有这两个包是有用的,所以只改它们就够了。

(2)然后修改buildxml中srcjavajacobmainpackage的value为comtestjacob,修改javaclassmain的value为comtestjacobcomJacob。

(3)别忘了javaJarBin中打包的源码路径也要改,<include name="com//class" />改为<include name="com/test//class" />。

(4)buildxml中对生成的dll和jar包也要改个名,比如我们把这两个文件改为jacob_testdll和

jacob_testjar。修改buildxml中的eneratedfilenamedll和generatedfilenamejar

的value为你新改的名字。

(5)comtestjacobcomLibraryLoader中,SystemloadLibrary("jacob");改成

SystemloadLibrary("jacob_test");

(6)另外,很重要的,在jni中cpp和h中com_jacob_com统一改为com_test_jacob_com,com/jacob

/com统一改为com/test/jacob/com。

(7)ant编译,编译好的文件在release目录下。

(8)最后把编译好的jacob_testdll文件放在windows/system32下就大功告成了。

现在该用到jacobjar了,如果你自己修改过jar包的名字,用新改的jar包,如jacob_testjar,这里统一称为jacobjar。

首先在classpath中引入jacobjar包,如果是web应用,WEB-INF的lib中也要加入jacobjar包。

下面给一个例子:

类ReplaceWordjava

import comjacobcom;

import comjacobactiveX;

public class ReplaceWord {

public static void main(String[] args) {

ActiveXComponent app = new ActiveXComponent("WordApplication"); //启动word

String inFile = "C:\\testdoc"; //要替换的word文件

try {

appsetProperty("Visible", new Variant(false)); //设置word不可见

Dispatch docs = appgetProperty("Documents")toDispatch();

Dispatch doc = Dispatchinvoke(docs,"Open",DispatchMethod,new

Object[] { inFile, new Variant(false),new Variant(false) }, new

int[1])toDispatch();

//打开word文件,注意这里第三个参数要设为false,这个参数表示是否以只读方式打开,因为我们要保存原文件,所以以可写方式打开。

Dispatch

selection=appgetProperty("Selection")toDispatch();//获得对Selection组件

Dispatchcall(selection, "HomeKey", new Variant(6));//移到开头

Dispatch find = Dispatchcall(selection, "Find")toDispatch();//获得Find组件

Dispatchput(find, "Text", "name"); //查找字符串"name"

Dispatchcall(find, "Execute"); //执行查询

Dispatchput(selection, "Text", "张三"); //替换为"张三"

Dispatchcall(doc, "Save"); //保存

Dispatchcall(doc, "Close", new Variant(false));

} catch (Exception e) {

eprintStackTrace();

} finally {

appinvoke("Quit", new Variant[] {});

appsafeRelease();

}

}

}

也许你会问,我怎么知道要调用哪个方法传哪些参数来进行 *** 作?别忘了,word还有宏呢!自己录制一个宏,编辑这个宏就可以看到代码了!用哪个对象的哪个方法就看你的了。

我总结了一下:

document下的组件都用Dispatch selection=appgetProperty("Selection")toDispatch()这种方法获得;

再往下的组件就需要调用selection的方法来获取,如 Dispatch find = Dispatchcall(selection, "Find")toDispatch();

如果某个方法需要参数,Dispatch doc =

Dispatchinvoke(docs,"Open",DispatchMethod,new Object[] { inFile, new

Variant(false),new Variant(false) }, new

int[1])toDispatch()是一个例子,这是调用docs的Open方法,Object[]数组里就是它需要的参数了;

如果要修改某个组件的属性呢,用Dispatchput(find, "Text", "name")这种形式,"Text"是属性名,"name"是值。

word有微软的专用格式,如果要读取其内容,可以使用jar包,如下:1。用jacob 其实jacob是一个bridage,连接java和com或者win32函数的一个中间件,jacob并不能直接抽取word,excel等文件,需要自己写dll哦,不过已经有为你写好的了,就是jacob的作者一并提供了。 jacob下载: >

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

int bit;

for (int i = 0; i < bslength;i++) {

bit = (bs[i] & 0x0f0)

>> 4;

sbappend("\\'");

sbappend(digital[bit]);

bit = bs[i] & 0x0f;

sbappend(digital[bit]);

}

return sbtoString();

}

public String readByteRtf(InputStream ins, String path){

String sourcecontent =

"";

try{

ins = new

FileInputStream(path);

byte[] b

= new byte[1024];

if (ins == null) {

Systemoutprintln("源模板文件不存在");

}

int bytesRead = 0;

while (true) {

bytesRead = insread(b, 0, 1024); // return final read bytes

counts

if(bytesRead == -1) {// end of InputStream

Systemoutprintln("读取模板文件结束");

break;

}

sourcecontent += new String(b, 0, bytesRead); // convert to string

using bytes

}

}catch(Exception e){

eprintStackTrace();

}

以上就是关于怎么使用JAVA,POI读写word文档全部的内容,包括:怎么使用JAVA,POI读写word文档、怎么用java导出word、如何使用java *** 作word 文档等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9659970.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存