我正在使用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的创建代码,但它非常广泛,可能会让人们更加困惑。
答案 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 &&
//添加的衬纸