在C#中将Word范围转换为Html

时间:2015-05-08 07:19:38

标签: c# ms-word

我正在尝试将Word范围转换为Html。我知道如何转换Word文档,但是如何只转换word文档中的Range?

转换完整Word文档的代码如下所示:

private string GetHtmlFromRange(Range range)
{
  XElement html;

  byte[] byteArray = File.ReadAllBytes(@"C:\test.docx");
  using (MemoryStream memoryStream = new MemoryStream())
  {
    memoryStream.Write(byteArray, 0, byteArray.Length);
    using (WordprocessingDocument doc = WordprocessingDocument.Open(memoryStream, true))
    {
      HtmlConverterSettings settings = new HtmlConverterSettings()
      {
        PageTitle = "My Page Title"
      };
      html = HtmlConverter.ConvertToHtml(doc, settings);

      File.WriteAllText("Test.html", html.ToStringNewLineOnAttributes());
    }
  }

  return html.ToStringNewLineOnAttributes();
}

1 个答案:

答案 0 :(得分:0)

我有类似的问题。如果您使用PowerTools for OpenXML中的HtmlConverter,则无法直接从MemoryStream执行转换。要转换范围,首先需要解析原始文档并创建仅包含所需范围的新文档,或指定要包含在新文档中而不是范围内的段落对象。在任何一种情况下,转换都会在定义新文档后发生。这是因为对象模型不使用范围;字符范围是呈现文档的属性。

因此,您的选项是A)首先解析您渲染的文档,以便您使用所需的范围(使用DocumentBuilder方法)或B)解析转换后的html以选择与您对应的元素期望的范围使用类似HtmlAgilityPack的内容。

对于我的解决方案,我意识到每个用例都要求用户已经安装了MS Office,所以我只使用了Microsoft.Office.Interop.Word

1)定义您想要选择的范围(例如,从位置5到位置100,包括非打印字符),

        var doc = Globals.ThisAddIn.Application.ActiveDocument;
        object start = 5;
        object end = 100;
        var originalText = doc.ActiveWindow.Selection;

2)将范围复制到新文档

        var newDocument = new Word.Document();
        newDocument.Range().FormattedText = doc.Range(start, end).FormattedText;

3)保存新文件

        object nullParameter = System.Reflection.Missing.Value;
        object outputFileName = @"D:\converted.html";
        object fileFormat = Word.WdSaveFormat.wdFormatFilteredHTML;
        newDocument.SaveAs(ref outputFileName, ref fileFormat);
        newDocument.Close(ref nullParameter, ref nullParameter, ref nullParameter);

4)使用System.IO访问输出文件并对内容执行任何操作,并在完成后将其删除。

它并不优雅,但如果你还是使用互操作,那么优雅可能不是必需的。