【问题标题】:Converting programmatically created openXML word documents to HTML errors with nulls将以编程方式创建的 openXML word 文档转换为带有空值的 HTML 错误
【发布时间】:2013-07-30 11:40:50
【问题描述】:

我正在使用 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 这个词的创建代码,但它非常广泛,可能只会让人们更加困惑。

【问题讨论】:

    标签: openxml


    【解决方案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"))
    

    现在按预期工作

    【讨论】:

    • 你能详细说明一下吗?我面临同样的问题。您在哪里更改了这行代码?
    【解决方案2】:

    我在将报表生成器报告保存到 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 &amp;&amp; // 添加的衬里

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-10
      • 1970-01-01
      • 1970-01-01
      • 2012-07-11
      • 2022-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多