我正在尝试将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();
}
答案 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访问输出文件并对内容执行任何操作,并在完成后将其删除。
它并不优雅,但如果你还是使用互操作,那么优雅可能不是必需的。