我目前正在开发一个程序,该程序需要将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文档而不丢失对原始文件的引用?
答案 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毫秒才能渲染同一文档!