将以编程方式创建的openXML word文档转换为带有null的HTML错误

时间:2013-07-30 11:40:50

标签: openxml

我正在使用openxml创建WordProcessingDocuments(工作正常,生成的单词doc正是我想要的),现在我正在尝试使用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创建一个单词doc,然后手动将内容复制到一个新的word文件中,保存它,然后将其传递给转换代码,这也将起作用。所以我认为它必须与我最初在openxml中创建单词doc的方式有关。也许我没有在所需的文件中添加一部分。

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

从我发布的错误中,是否有人对问题可能出现的地方有任何想法,即什么是null?我可以发布单词doc的创建代码,但它非常广泛,可能会让人们更加困惑。

2 个答案:

答案 0 :(得分: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) 

返回正确或错误

所以我更改了以下行

 .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"))

现在按预期工作

答案 1 :(得分:0)

在将reportbuilder报告保存到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 && //添加的衬纸