开门见山,直接上问题:
客户端:window xp系统,装的office03,
服务端:linux系统,
需求:客户在客户端上传doc文件,服务端接收并转成docx,然后对docx进行解析,在将解析完的docx转成doc,发给客户端,让客户看。
为什么这么麻烦,非要绕一圈(doc->docx->doc),是因为业务复杂,只能这么干,现在需要解决docx与doc之间相互转换,用java语言实现,代码在linux上运行的!我弄了几天了,网上扒了好久,没什么进展啊!!
恳求大侠们答疑解惑!!!!SOS!!!
客户端:window xp系统,装的office03,
服务端:linux系统,
需求:客户在客户端上传doc文件,服务端接收并转成docx,然后对docx进行解析,在将解析完的docx转成doc,发给客户端,让客户看。
为什么这么麻烦,非要绕一圈(doc->docx->doc),是因为业务复杂,只能这么干,现在需要解决docx与doc之间相互转换,用java语言实现,代码在linux上运行的!我弄了几天了,网上扒了好久,没什么进展啊!!
恳求大侠们答疑解惑!!!!SOS!!!
我开始的时候用POI尝试如上的读写操作,最后失败了(我无法替换图片,替换了文字写不回去,相当于没替换),网上找了M多代码,也没少看API,没研究出来什么结果。后来,我发现docx可以满足我的需求,我能对docx进行文字和图片的替换,因此,我现在遇到的问题的是docx如何转到doc,因为客户那边的机器都装的office03只认doc。
大家有什么好的思路尽管提出来,也可能我对POI没有深入的理解,我真的山穷水尽了!!!SOS!!!
用poi吧,很简单的,他支持office2003和office2007。
实在不行,楼主可以让用户安装个office版本转换插件,具体参考http://support.microsoft.com/kb/936011/zh-cn
正题:我不是那种一遇到问题就去问的懒人,我一直都在google答案,qq群里面也问过好多,我真的想不出来什么办法了,才来这发帖的。
我研究过POI,POI是支持office03和07,我也写过demo去完成我的需求,但是修改完doc之后,我能打印出来,但我无法将修改保存到doc中,因此我才想着去用office07,对office07我完全可以完成我的需求,但客户他们用office03,没法看docx,我现在的问题就是转换,问题的解决思路最好是在服务端用java程序实现。
对了,我写了好多代码,太多,贴出来太占地方,如果大侠们需要看,Q我739801097。我真的很想解决这个问题,此时此刻,我仍在google答案ing。希望大侠来帮忙!谢谢!
我给你看看代码吧:import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.Paragraph;
import org.apache.poi.hwpf.usermodel.Range;
import org.apache.poi.hwpf.usermodel.Table;
import org.apache.poi.hwpf.usermodel.TableCell;
import org.apache.poi.hwpf.usermodel.TableRow;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
/**
* replaceText()操作
*
*/
public class MyWordReplaceText01 { public static void main(String[] args) {
File file = new File("E:\\poi_demo01.doc");
try {
FileInputStream in = new FileInputStream(file);// 载入文档
POIFSFileSystem pfs = new POIFSFileSystem(in);
HWPFDocument hwpf = new HWPFDocument(pfs);
Range range = hwpf.getRange();// 得到文档的读取范围
int paraNum = range.numParagraphs();//得到range范围的Paragraph的个数
System.out.println("此word共有" + paraNum + "段"); int m = 0; // 数组下标
String[] ret = new String[paraNum];
boolean first = true;
String searchText = "${Ryan}";
String replacementText = "Apache Software Foundation";
for (int i = 0; i < paraNum; ++i) {//循环每段
// 从每一段落中获取文字,每一段是一个回车
Paragraph p = range.getParagraph(i);
System.out.println("长度=" + p.text().length() + ";内容:" + p.text());
int offset = p.text().indexOf(searchText);
if(offset > 0){
p.replaceText(searchText, replacementText);
System.out.println("成功找到" );
}
// para.insertBefore(text);
}
//输出表格内容
System.out.println("*************输出表格replaceText()之后内容如下:***************");
for (int i = 0; i < paraNum; ++i) {//循环每段
// 从每一段落中获取文字,每一段是一个回车
Paragraph p = range.getParagraph(i);
System.out.println("长度=" + p.text().length() + ";内容:" + p.text());
}
//写入到新的doc文件
System.out.println("======写入到新的doc文件 :=====");
OutputStream outdoc = new FileOutputStream("E:\\poi_demo02.doc");
// hwpf.write(outdoc);
pfs.writeFilesystem(outdoc);
outdoc.flush();
outdoc.close();
// //输出表格内容
// System.out.println("*************输出表格内容如下:***************");
// for (int i = 0; i < ret.length; i++) {
// System.out.println(ret[i]);
// }
} catch (Exception e) {
e.printStackTrace();
}
}
}我现在用docx完全可解决我的需求,目前就是想用程序实现doc和docx之间相互转换,用户用的doc,我后台想将doc转成docx进行处理,处理完后转成doc,返回给用户。
你先想想,office2007到2003存在兼容性问题不?
一般高版本会兼容低版本,但是你想把高版本转化为低版本,会不会存在丢失数据的可能性?
之前做过在客户端上传docx,然后转换成html。
就是用的poi,非常不好搞。
字体颜色获取不到,图片在文档的缩小比例也获取不到。
最好也只好无视了
public class TestExcel {
/**
* t.xls
* ---------
* | a | b |
* ---------
*
* t2.xls
* ---------
* | a | a |
* ---------
* replace a from b.
*/
public static void main(String[] args) throws Exception {
InputStream in = new FileInputStream("c:/t.xls");
OutputStream out = new FileOutputStream("c:/t2.xls");
Workbook book2 = new HSSFWorkbook();
Workbook book = new HSSFWorkbook(in);
Sheet sheet = book.getSheetAt(0);
Sheet sheet2 = book2.createSheet(sheet.getSheetName()); for(int i = 0; i < sheet.getLastRowNum() + 1; i++) {
Row row = sheet.getRow(i); if(row != null) {
Row row2 = sheet2.createRow(i); for(int j = 0; j < row.getLastCellNum(); j++) {
Cell cell = row.getCell(j); if(cell != null) {
Cell cell2 = row2.createCell(j); if("b".equals(cell.getStringCellValue())) {
cell2.setCellValue("a");
}
else {
cell2.setCellValue(cell.getStringCellValue());
}
}
}
}
} book2.write(out);
out.close();
}
}这是excel的,world我不熟悉他的结构。你试试这样的思路吧。
POI 有两个类.一种处理07 也就是docx 以下简称 07类
一种处理03 也就是doc 以下简称 03类很久没写记不清类名了,我记得区别两个类名区别不大.
你先用03类取出数据 doc中的数据,
再把取出的数据用 07类生成 新文件 docx. 转回来则反过来.
用 07类取出docx的数据.
再用 03类 把数据放进去生成 doc.
方法比较繁琐.推荐在找不到更佳解决方案的情况下使用.
over
ps:poi 比较适合 处理excel,word还是用其他的吧