如何使用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 文档等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)