java实现doc互转docx

jacod

  • 使用原因
    • 为什么doc无法解析 docx可以解析
    • 还有其他方法可以将doc转换为docx吗?
  • 具体使用方法
    • 引入依赖或手动下载
    • 代码

使用原因

word中使用poi读取文章内容不能正确读取目录,使用docx可以正确读取,所以先将doc转换为docx,再进行解析
注意:还没有尝试使用iText进行word文档的读取

为什么doc无法解析 docx可以解析

https://www.cnblogs.com/ct-csu/p/8178932.html
这篇文章讲的非常好,一定要去看,详细讲解了doc和docx的区别(也就是docx实质上是压缩包)、
doc和docx的细节、poi中关于这两种文档的不同处理

还有其他方法可以将doc转换为docx吗?

  1. 找到能正确解析复杂word文档的doc版本的插件或相关依赖,直接使用这个进行处理
  2. 先用office2003或者2007编辑好word的样式,然后另存为xml,将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出Doc。经测试这样方式生成的word文档完全符合office标准,样式、内容控制非常便利,打印也不会变形,生成的文档和office中编辑文档完全一样。

第二个方法来源于网址https://www.cnblogs.com/cage666/p/7295391.html

  1. poi已经有成熟的api进行doc文档转换为docx进行操作
  2. 文档中的复杂表格、图片、公式等操作动能通过docx记性解析

参考:
POI官网:https://poi.apache.org/
Apache POI Word - 快速指南 :https://www.w3cschool.cn/apache_poi_word/apache_poi_word_quick_guide.html

具体使用方法

引入依赖或手动下载

电脑内java是1.8版本,对应jacod刚好是9版本

  1. 下载 ,解压缩并复制
    下载网址
    官网
    页面
    java实现doc互转docx_第1张图片
    复制
    java实现doc互转docx_第2张图片
    在这里插入图片描述
  2. 将依赖手动引入手动加入依赖步骤
  3. 注意事项,不能使用Linux系统,如果你的项目环境是Linux,那么千万不要用,使用这个插件还要求一定有Office07版本,版本不正确或者是安装不正确的话也会出现问题,在新建相关文档之前应该首先判断文件是否已经新建但是当时没有成功

代码

package com.czy.demo;


import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
import java.io.File;



// 格式大全:前缀对应以下方法的fmt值
// 0:Microsoft Word 97 - 2003 文档 (.doc)
// 1:Microsoft Word 97 - 2003 模板 (.dot)
// 2:文本文档 (.txt)
// 3:文本文档 (.txt)
// 4:文本文档 (.txt)
// 5:文本文档 (.txt)
// 6:RTF 格式 (.rtf)
// 7:文本文档 (.txt)
// 8:HTML 文档 (.htm)(带文件夹)
// 9:MHTML 文档 (.mht)(单文件)
// 10:MHTML 文档 (.mht)(单文件)
// 11:XML 文档 (.xml)
// 12:Microsoft Word 文档 (.docx)
// 13:Microsoft Word 启用宏的文档 (.docm)
// 14:Microsoft Word 模板 (.dotx)
// 15:Microsoft Word 启用宏的模板 (.dotm)
// 16:Microsoft Word 文档 (.docx)
// 17:PDF 文件 (.pdf)
// 18:XPS 文档 (.xps)
// 19:XML 文档 (.xml)
// 20:XML 文档 (.xml)
// 21:XML 文档 (.xml)
// 22:XML 文档 (.xml)
// 23:OpenDocument 文本 (.odt)
// 24:WTF 文件 (.wtf)
/**
 * @author czy
 * @date 2019/11/22 - 19:51
 * @Classname jacob
 * @Description
 */

public class DocFmtConvert {
    /**
     * doc格式
     */
    private static final int DOC_FMT = 0;
    /**
     * docx格式
     */
    private static final int DOCX_FMT = 12;
    /**
     * 描述 The entry point of application.
     *
     * @param args
     * the input arguments
     * @author Harley Hong
     * @created 2017 /08/09 16:14:44
     */
    public static void main(String[] args) {
        DocFmtConvert dfc = new DocFmtConvert();
        String srcDocPath = "";
        String descDocPath = "";
        try {
            dfc.convertDocFmt(srcDocPath, descDocPath, DOC_FMT);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 根据格式类型转换doc文件
     *
     * @param srcPaththe doc path 源文件
     * @param descPath the docx path 目标文件
     * @param fmtthe fmt 所转格式
     * @return the file
     * @throws Exception the exception
     * @author Harley Hong
     * @created 2017 /08/09 16:14:07 Convert docx 2 doc file.
     */
    public File convertDocFmt(String srcPath, String descPath, int fmt) throws Exception {
        // 实例化ComThread线程与ActiveXComponent
        ComThread.InitSTA();
        ActiveXComponent app = new ActiveXComponent("Word.Application");
        try {
// 文档隐藏时进行应用操作
            app.setProperty("Visible", new Variant(false));
// 实例化模板Document对象
            Dispatch document = app.getProperty("Documents").toDispatch();
// 打开Document进行另存为操作
            Dispatch doc = Dispatch.invoke(document, "Open", Dispatch.Method,
                    new Object[] { srcPath, new Variant(true), new Variant(true) }, new int[1]).toDispatch();
            Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] { descPath, new Variant(fmt) }, new int[1]);
            Dispatch.call(doc, "Close", new Variant(false));
            return new File(descPath);
        } catch (Exception e) {
            throw e;
        } finally {
// 释放线程与ActiveXComponent
            app.invoke("Quit", new Variant[] {});
            ComThread.Release();
        }
    }
}


重点代码

        // 实例化ComThread线程与ActiveXComponent
        ComThread.InitSTA();
        ActiveXComponent app = new ActiveXComponent("Word.Application");
        try {
// 文档隐藏时进行应用操作
            app.setProperty("Visible", new Variant(false));
// 实例化模板Document对象
            Dispatch document = app.getProperty("Documents").toDispatch();
// 打开Document进行另存为操作
            Dispatch doc = Dispatch.invoke(document, "Open", Dispatch.Method,
                    new Object[] { srcPath, new Variant(true), new Variant(true) }, new int[1]).toDispatch();
            Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] { descPath, new Variant(fmt) }, new int[1]);
            Dispatch.call(doc, "Close", new Variant(false));
            return new File(descPath);
        } ca

你可能感兴趣的:(word)