将Word文档转换为HTML而不丢失原始文档

时间:2018-08-09 08:39:43

标签: c# ms-word office-interop

我目前正在开发一个程序,该程序需要将Word文档显示为HTML,但是要跟踪HTML和原始文件的位置。

为此,在最初加载Word文档时,会为文档中的每个元素生成ID。

foreach (Table t in document.Tables)
{
    t.ID = GUID();

    Range range = t.Range;
    foreach (Cell c in range.Cells)
    {
        c.ID = t.ID + TableIDSeparator + GUID();
    }
}

foreach (Paragraph p in document.Paragraphs)
{
    p.ID = GUID();
}

然后我可以通过以下方式将文档另存为HTML:

document.SaveAs2(tempFileName, WdSaveFormat.wdFormatFilteredHTML);

但是随后document对象成为HTML文档,而不是原始Word文档(就像从Word菜单中使用“另存为”时一样,当前窗口显示的是新保存的文档,而不是原始文档)。

>

因此,我尝试通过以下方式将文档保存为HTML:

Document temp = new Document();
string x = document.Range().XML;
temp.Range().InsertXML(x);
temp.SaveAs2(fn, WdSaveFormat.wdFormatFilteredHTML);
temp.Close(false);

但是现在新的temp文档丢失了我在原始文档中创建的所有ID,因此我无法根据原始文档找到HTML文件中的内容。

我是否错过了重要的内容,或者有某种方法可以另存为Word文档而不丢失对原始文件的引用?

2 个答案:

答案 0 :(得分:0)

由于文档结果相同,因此我使用以下方法将ID复制到新文档中。

请注意段落/表格/等。数组从元素索引1开始,而不是0。

        string fn = Path.GetTempPath() + TmpPrefix +GUID() + ".html";

        Document temp = new Document();

        // Copy whole old document to new document
        temp.Range().InsertXML(doc.Range().XML);

        // copy IDs assuming the documents are identical and have same amount of elements
        for (int i = 1; i <= temp.Tables.Count; i++) {
            temp.Tables[i].ID = doc.Tables[i].ID;

            Range sRange = doc.Tables[i].Range;
            Range tRange = temp.Tables[i].Range;
            for(int j = 1; j <= tRange.Cells.Count; j++)
            {
                tRange.Cells[j].ID = sRange.Cells[j].ID;
            }
        }

        for(int i=1; i <= temp.Paragraphs.Count; i++)
        {
            temp.Paragraphs[i].ID = doc.Paragraphs[i].ID;
        }
        // Save new temp document as HTML
        temp.SaveAs2(fn, WdSaveFormat.wdFormatFilteredHTML);
        temp.Close();

        return fn;

由于我不需要即将到来的DOCX文件中的ID(我仅使用ID来跟踪内存中加载的DOCX文件与应用程序中显示的HTML表示形式之间的联系),因此这对于我的情况非常有用。

答案 1 :(得分:0)

尽管在大型文档上,上述方法非常慢,所以我不得不采取其他措施:

    public static string RenderHTMLFile(Document doc)
    {
        string fn = Path.GetTempPath() + TmpPrefix +GUID() + ".html";

        var vba = doc.VBProject;
        var module = vba.VBComponents.Add(Microsoft.Vbe.Interop.vbext_ComponentType.vbext_ct_StdModule);

        var code = Properties.Resources.HTMLRenderer;
        module.CodeModule.AddFromString(code);

        var dataMacro = Word.Run("renderHTMLCopy", fn); 

        return fn;
    }

Properties.Resources.HTMLRenderer是具有以下VB代码的txt文件:

Sub renderHTMLCopy(ByVal path As String)
'
' renderHTMLCopy Macro
'
'
Selection.WholeStory
Selection.Copy
Documents.Add
Selection.PasteAndFormat wdPasteDefault
ActiveDocument.SaveAs2 path, WdSaveFormat.wdFormatFilteredHTML
ActiveDocument.Close False

End Sub

上一个版本的一个小文档大约需要1500毫秒,而这个版本大约需要400毫秒才能渲染同一文档!