开门见山,直接上问题:
客户端:window xp系统,装的office03,
服务端:linux系统,
需求:客户在客户端上传doc文件,服务端接收并转成docx,然后对docx进行解析,在将解析完的docx转成doc,发给客户端,让客户看。
为什么这么麻烦,非要绕一圈(doc->docx->doc),是因为业务复杂,只能这么干,现在需要解决docx与doc之间相互转换,用java语言实现,代码在linux上运行的!我弄了几天了,网上扒了好久,没什么进展啊!!
恳求大侠们答疑解惑!!!!SOS!!!

解决方案 »

  1.   

    这么恶心的业务啊?  我只做过在后台将doc文档转成pdf的,用官方的包转的。你的后台必须转成docx吗??不可以转成其它如xml等格式的吗?
      

  2.   

    apache的POI,有两种API 一种是处理doc,一种是处理docx,然后,你懂的。。我只知道这么多了
      

  3.   

    答1楼,2楼,其实具体是这样的,我需要对word(doc)进行业务上的读写,例如(替换文字:将${name}替换成Tom ; 替换图片:将 图片1 替换成 图片2 ; 最后在保存到doc,返回给用户)。
    我开始的时候用POI尝试如上的读写操作,最后失败了(我无法替换图片,替换了文字写不回去,相当于没替换),网上找了M多代码,也没少看API,没研究出来什么结果。后来,我发现docx可以满足我的需求,我能对docx进行文字和图片的替换,因此,我现在遇到的问题的是docx如何转到doc,因为客户那边的机器都装的office03只认doc。
    大家有什么好的思路尽管提出来,也可能我对POI没有深入的理解,我真的山穷水尽了!!!SOS!!!
      

  4.   

    LZ北大的呢 = =我觉得 doc->docx 的难度在 你继续研究直到解决问题 之上
      

  5.   


    用poi吧,很简单的,他支持office2003和office2007。
    实在不行,楼主可以让用户安装个office版本转换插件,具体参考http://support.microsoft.com/kb/936011/zh-cn
      

  6.   

    我不是北大的,以前考研想考北大来着,大一的时候的头像。
    正题:我不是那种一遇到问题就去问的懒人,我一直都在google答案,qq群里面也问过好多,我真的想不出来什么办法了,才来这发帖的。
    我研究过POI,POI是支持office03和07,我也写过demo去完成我的需求,但是修改完doc之后,我能打印出来,但我无法将修改保存到doc中,因此我才想着去用office07,对office07我完全可以完成我的需求,但客户他们用office03,没法看docx,我现在的问题就是转换,问题的解决思路最好是在服务端用java程序实现。
    对了,我写了好多代码,太多,贴出来太占地方,如果大侠们需要看,Q我739801097。我真的很想解决这个问题,此时此刻,我仍在google答案ing。希望大侠来帮忙!谢谢!
      

  7.   

    http://support.microsoft.com/kb/936011/zh-cn这个不行吗?
      

  8.   

    楼上,我需要java程序来实现自动的转换啊,怎么办啊??
      

  9.   

    就是能把我所做的修改打印到控制台,但不能将这些修改写到文件中。比如:我把test.doc中的${Ryan}改成了Tom,修改后在控制台中能打印出来(意思就是打印的内容中,所有的${Ryan}都变成了Tom,但我无法将它写到文件中,输出的文件中仍然和以前一样)
    我给你看看代码吧: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,返回给用户。
      

  10.   

    我一会找找poi试试.
    你先想想,office2007到2003存在兼容性问题不?
    一般高版本会兼容低版本,但是你想把高版本转化为低版本,会不会存在丢失数据的可能性?
      

  11.   

    估计很不好搞吧。
    之前做过在客户端上传docx,然后转换成html。
    就是用的poi,非常不好搞。
    字体颜色获取不到,图片在文档的缩小比例也获取不到。
    最好也只好无视了
      

  12.   


    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我不熟悉他的结构。你试试这样的思路吧。
      

  13.   

    POI对word的支持太弱了,目前我只发现了读写文本,对表格,对图片,根本无能为力。你写的excel的,我也写过,excel结构更好一些,而且POI对excel的开发更多一些,POI现在属于无人开发状态。所以,我后来放弃了POI来实现功能,改用了docx,但至今docx到doc转换我还是没解决!!!转换方法,有木有!有木有!
      

  14.   

    poi做不到,我估计没人能做了,因为office系列软件都是加密的,都是用16进制写进去的。doc的另外一种形式是rtf,不过不好控制。实在不行就调查下用微软的兼容包在你服务器上自动转换。
      

  15.   

    利用POI 最笨的方法.. 
     POI 有两个类.一种处理07 也就是docx 以下简称 07类
                 一种处理03 也就是doc  以下简称 03类很久没写记不清类名了,我记得区别两个类名区别不大.
      你先用03类取出数据 doc中的数据,
      再把取出的数据用 07类生成 新文件 docx.  转回来则反过来.
      用 07类取出docx的数据.
      再用 03类 把数据放进去生成 doc.
      方法比较繁琐.推荐在找不到更佳解决方案的情况下使用.
    over
    ps:poi 比较适合 处理excel,word还是用其他的吧 
      

  16.   

    这些方法我都想过了,也试过了,方法说起来简单,可写起来的时候发现POI根本干不了这个,放弃,这是个死胡同,走不出雨巷就该转弯。不过还是感谢大家的热心相助!再次感谢!继续工作啦!O(∩_∩)O~
      

  17.   

    近期我也在找处理WORD的,对于你这个问题我有一个解决方式:使用freeer进行替换就可以了,不必要进行转换!