以编程方式将Doc转换为Docx错误

时间:2014-04-11 03:19:31

标签: c# java interop docx doc

我正在尝试将服务器中的所有.doc文档转换为.docx格式,以便使用Java以编程方式修改它们。我不是很擅长C#,但我能够找到这个程序并根据我的需要进行修改。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Office.Interop.Word;
using System.IO;

namespace ConvertDOCtoDOCx
{
public class ObjectConstants
{
public static Object MissingValue = System.Reflection.Missing.Value;
public static Object True = true;
public static Object False = true;
}

class Program
{
    static void Main(string[] args)
    {
        string path = "Z:\\PREE\\";

        foreach (string letters in Directory.GetDirectories(path))
        {
            foreach (string students in Directory.GetDirectories(letters))
            {
                foreach (string file in System.IO.Directory.GetFiles(students, "*.doc"))
                {
                    Console.Write(file);
                    ConvertDocToDocx(file, Path.GetFileNameWithoutExtension(file) + ".docx");
                }
            }

        }

    }

    public static void ConvertDocToDocx(string docFilePath, string outputDocxFilePath)
    {
        var app = new Application();
        app.Visible = false;
        var doc = OpenDocument(app, docFilePath, false);
        SaveDocAsDocx(app, doc, outputDocxFilePath);
        app.Quit(ref ObjectConstants.False, ref ObjectConstants.MissingValue, ref ObjectConstants.MissingValue);
    }

    public static void SaveDocAsDocx(Application app, Document doc, object outputFilePath)
    {
        object format = WdSaveFormat.wdFormatXMLDocument;

        try
        {

            doc.SaveAs(ref outputFilePath, ref format,
            ref ObjectConstants.False, ref ObjectConstants.MissingValue,
            ref ObjectConstants.MissingValue, ref ObjectConstants.MissingValue,
            ref ObjectConstants.MissingValue, ref ObjectConstants.MissingValue,
            ref ObjectConstants.MissingValue, ref ObjectConstants.MissingValue,
            ref ObjectConstants.MissingValue, ref ObjectConstants.MissingValue,
            ref ObjectConstants.MissingValue, ref ObjectConstants.MissingValue,
            ref ObjectConstants.MissingValue, ref ObjectConstants.MissingValue);
        }
        catch (NullReferenceException)
        {
            return;
        }
    }

    public static Document OpenDocument(Application app, object filePath, bool visible)
    {
        try
        {
            var doc = (Document)app.Documents.Open(ref filePath, ref ObjectConstants.MissingValue,
            ref ObjectConstants.MissingValue, ref ObjectConstants.MissingValue,
            ref ObjectConstants.MissingValue, ref ObjectConstants.MissingValue,
            ref ObjectConstants.MissingValue, ref ObjectConstants.MissingValue,
            ref ObjectConstants.MissingValue, ref ObjectConstants.MissingValue,
            ref ObjectConstants.MissingValue, ref ObjectConstants.MissingValue,
            ref ObjectConstants.MissingValue, ref ObjectConstants.MissingValue,
            ref ObjectConstants.MissingValue, ref ObjectConstants.MissingValue);


            if (!visible)
            {
                doc.ActiveWindow.Visible = false;
            }

            return doc;
        }
        catch (System.Runtime.InteropServices.COMException e)
        {
            return null;
        }
    }
}
}

每次运行时,都不会创建新的docx文件。我能够缩小问题范围,我发现以下行是罪魁祸首:

ConvertDocToDocx(file, Path.GetFileNameWithoutExtension(file) + ".docx");

当我按原样离开时,不会创建任何内容。但是,当我手动添加它时,如下例所示:

ConvertDocToDocx("Z:\\PREE\\1-ABC\\Alan Wernick\\new.doc", "Z:\\PREE\\1-ABC\\Alan Wernick\\new.docx");

它创建文件的确切位置。为什么会这样?

1 个答案:

答案 0 :(得分:1)

Path.GetFileNameWithoutExtension()仅返回文件的名称,而不是完整路径。

您最终将值new.docx作为第二个参数传递给ConvertDocToDocx,而不是完整的文件路径。它可能将它写入磁盘某处,但是谁知道确切的位置。


使用Path.GetDirectoryName()获取完整目录:

var baseFile =
   Path.Combine(Path.GetDirectoryName(file), Path.GetFileNameWithoutExtension(file));

ConvertDocToDocx(file, string.Concat(baseFile, ".docx"));