3

我正在使用 openxml 创建 WordProcessingDocuments(效果很好,并且生成的 word 文档正是我想要的),现在我正在尝试使用 openxml Powertools 将这些新创建的文档转换为 HTML。我是新手,所以我希望那是我错过的一些愚蠢的事情,但希望有人能用我收到的这些可空错误指出我正确的方向。

这是确切的错误...

System.NullReferenceException: Object reference not set to an instance of an object.
at OpenXmlPowerTools.HtmlConverter.ConvertToHtmlTransform(WordprocessingDocument wordDoc, HtmlConverterSettings settings, XNode node, Func2 imageHandler)
at OpenXmlPowerTools.HtmlConverter.<>c__DisplayClass37.<ConvertToHtmlTransform>b__1d(XElement e)
at System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext()
at System.Xml.Linq.XContainer.AddContentSkipNotify(Object content)
at System.Xml.Linq.XElement..ctor(XName name, Object content)
at OpenXmlPowerTools.HtmlConverter.ConvertToHtmlTransform(WordprocessingDocument wordDoc, HtmlConverterSettings settings, XNode node, Func2 imageHandler)
at OpenXmlPowerTools.HtmlConverter.<>c__DisplayClass37.<ConvertToHtmlTransform>b__1c(XElement e)
at System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext()
at System.Xml.Linq.XContainer.AddContentSkipNotify(Object content)
at System.Xml.Linq.XContainer.AddContentSkipNotify(Object content)
at System.Xml.Linq.XElement..ctor(XName name, Object[] content)
at OpenXmlPowerTools.HtmlConverter.ConvertToHtmlTransform(WordprocessingDocument wordDoc, HtmlConverterSettings settings, XNode node, Func`2 imageHandler)

我使用的代码与您在Eric Whites博客上可以找到的代码完全相同。

public static void PrintHTML(string file)
{
    byte[] byteArray = File.ReadAllBytes(file);
    using (MemoryStream memoryStream = new MemoryStream())
    {
        memoryStream.Write(byteArray, 0, byteArray.Length);
        using (WordprocessingDocument doc =
            WordprocessingDocument.Open(memoryStream, true))
        {

            HtmlConverterSettings settings = new HtmlConverterSettings()
            {
                //PageTitle = "some title"
            };
            XElement html = HtmlConverter.ConvertToHtml(doc, settings);

            File.WriteAllText(@"C:\\Temp\Test.html", html.ToStringNewLineOnAttributes());
        }
    }
}

我知道代码可以工作,因为如果我将它传递给我没有创建的普通 worddoc,它可以正常工作并转换为 html。如果我使用 openxml 创建一个 word doc,然后手动将内容复制到一个新的 word 文件中,保存它,然后通过转换代码传递它,那也可以。所以我认为这一定与我最初在 openxml 中创建单词 doc 的方式有关。也许我没有在所需的文件中添加一部分。

使用 openxml sdk 我比较了一个工作和非工作文件,它们似乎具有相同的组件/部件。

从我发布的错误中,有没有人知道问题可能出在哪里,即什么是空?我可以发布 doc 这个词的创建代码,但它非常广泛,它可能只会让人们更加困惑。

4

2 回答 2

1

我终于明白了这一点。我不得不在openxmlpower工具中挖掘出HtmlConverter的源代码,经过一些调试后我发现代码中的这一行出错了......

第 371 行

styleId = (string)wordDoc.MainDocumentPart.StyleDefinitionsPart
          .GetXDocument().Root.Elements(W.style)
          .Where(e => (string)e.Attribute(W.type) == "paragraph" &&
          (string)e.Attribute(W._default) == "1")
          .FirstOrDefault().Attributes(W.styleId).FirstOrDefault();

基本上在我的调试中

(string)e.Attribute(W._default) 

以 True 或 False 的形式返回

所以我更改了以下行

 .Where(e => (string)e.Attribute(W.type) == "paragraph" &&
          (string)e.Attribute(W._default) == "1")

.Where(e => (string)e.Attribute(W.type) == "paragraph" && (
          (string)e.Attribute(W._default) == "1" || (string)e.Attribute(W._default) == "true"))

现在按预期工作

于 2013-07-30T15:29:21.873 回答
0

有同样的问题,我将报告生成器报告保存到 OpenWordXML 并且无法将字节转换为 html。

必须添加以下代码行才能使其与版本 2.8.1.0 一起正常工作


private static IEnumerable<XElement> ParaStyleParaPropsStack(XDocument stylesXDoc,    
     string paraStyleName, XElement para)
    {
        if (stylesXDoc == null)
            yield break;
        var localParaStyleName = paraStyleName;
        while (localParaStyleName != null)
        {
            XElement paraStyle = stylesXDoc.Root.Elements(W.style).FirstOrDefault(s 
               =>
                **s.Attribute(W.type) != null &&**
                s.Attribute(W.type).Value == "paragraph" && 
                s.Attribute(W.styleId).Value == localParaStyleName);

s.Attribute(W.type) != null && // 添加的衬里

于 2019-08-05T09:01:53.123 回答