C# 将HTML字符串添加到OpenXML(*.docx)文档
我正在尝试使用Microsoft的OpenXML 2.5库来创建OpenXML文档。在我尝试在文档中插入HTML字符串之前,一切都很顺利。我已经浏览了网络,以下是我到目前为止得出的结论(仅限于我遇到问题的部分): 显然,在这个例子中,我并没有实际添加altChunk,但我已经尝试在任何地方添加它——在run、段落、body等中。在任何情况下,我都无法在Word 2010中打开docx文件 这让我有点发疯,因为它看起来应该是直截了当的(我承认我没有完全理解AltChunk的“东西”)。非常感谢您的帮助 旁注:我确实发现了一件有趣的事情,我不知道这是否真的是一个问题,那就是当从MemoryStream工作时,AltChunk会破坏文件。有人能确认这是/不是真的吗?我可以通过使用复制错误“…内容有问题” 作为替代格式导入部分内容的不完整HTML文档。 例如,如果您使用以下HTML代码段C# 将HTML字符串添加到OpenXML(*.docx)文档,c#,openxml,openxml-sdk,C#,Openxml,Openxml Sdk,我正在尝试使用Microsoft的OpenXML 2.5库来创建OpenXML文档。在我尝试在文档中插入HTML字符串之前,一切都很顺利。我已经浏览了网络,以下是我到目前为止得出的结论(仅限于我遇到问题的部分): 显然,在这个例子中,我并没有实际添加altChunk,但我已经尝试在任何地方添加它——在run、段落、body等中。在任何情况下,我都无法在Word 2010中打开docx文件 这让我有点发疯,因为它看起来应该是直截了当的(我承认我没有完全理解AltChunk的“东西”)。非常感谢您的
HELLO
MS Word无法打开该文档
下面的代码显示了如何将AlternativeFormatImportPart
添加到word文档中。
(我已经用MS Word 2013测试了代码)
这将防止您的é被呈现为Ã的,您的ä被呈现为Ã的,等等。这里有同样的问题,但原因完全不同。如果接受的解决方案没有帮助,那么值得一试。保存后尝试关闭文件。在我的例子中,这恰好是损坏的docx文件和干净的docx文件之间的区别。奇怪的是,大多数其他操作只使用Save()和程序出口
String cid = "chunkid";
WordprocessingDocument document = WordprocessingDocument.Open("somefile.docx", true);
Body body = document.MainDocumentPart.Document.Body;
MemoryStream ms = new MemoryStream(System.Text.Encoding.UTF8.GetBytes("<html><head></head><body>hi</body></html>"));
AlternativeFormatImportPart formatImportPart = document.MainDocumentPart.AddAlternativeFormatImportPart(AlternativeFormatImportPartType.Html, cid);
formatImportPart.FeedData(ms);
AltChunk altChunk = new AltChunk();
altChunk.Id = cid;
document.MainDocumentPart.Document.Body.Append(altChunk);
document.MainDocumentPart.Document.Save();
// here's the magic!
document.Close();
String cid=“chunkid”;
WordprocessingDocument=WordprocessingDocument.Open(“somefile.docx”,true);
Body Body=document.main documentpart.document.Body;
MemoryStream ms=新的MemoryStream(System.Text.Encoding.UTF8.GetBytes(“hi”);
AlternativeFormatImportPart formatImportPart=document.MainDocumentPart.AddAlternativeFormatImportPart(AlternativeFormatImportPartType.Html,cid);
formatImportPart.FeedData(毫秒);
AltChunk AltChunk=新的AltChunk();
altChunk.Id=cid;
document.maincumentpart.document.Body.Append(altChunk);
document.MainDocumentPart.document.Save();
//这就是魔法!
document.Close();
在Word 2010中尝试打开生成的docx文件时,是否会收到错误消息?我会。我得到了一个“文件名无法打开,因为内容有问题。”我在inspector中查看了内容,但我没有看到任何明显的错误信息。“…使用不完整的HTML文档…”-这正是问题所在。这么简单的事情,对我来说却很不明显。感谢您的帮助。您应该考虑将UTF8 BOM添加到字节数组中,然后将其传递给内存流。这有助于解决docx文件无法正确显示某些UTF8字符的问题。类似这样的内容-byte[]utf8Bom=newutf8encoding(true).GetPreamble()代码>然后将其前置到“GetBytes”result@user2945722谢谢这是我的问题的正确答案。答案中应该包括它。如何在页眉和页脚中插入html?有人能解释为什么需要alt块上的ID吗?不太有帮助;它简单地将其描述为“与部件的关系”。我试图写入MemoryStream(使用WordprocessingDocument.Create而不是WordprocessingDocument.Open),而document.Close()的“魔力”正是我需要的,如果我试图从using语句中返回,我需要得到一个干净的内存流来返回(或者没有使用using语句)。在using语句之外返回并不需要这种魔力。我怀疑using语句在处理对象时有效地执行了与document.Close()相同的任务。
using (WordprocessingDocument doc = WordprocessingDocument.Open(@"test.docx", true))
{
string altChunkId = "myId";
MainDocumentPart mainDocPart = doc.MainDocumentPart;
var run = new Run(new Text("test"));
var p = new Paragraph(new ParagraphProperties(
new Justification() { Val = JustificationValues.Center }),
run);
var body = mainDocPart.Document.Body;
body.Append(p);
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes("<html><head></head><body><h1>HELLO</h1></body></html>"));
// Uncomment the following line to create an invalid word document.
// MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes("<h1>HELLO</h1>"));
// Create alternative format import part.
AlternativeFormatImportPart formatImportPart =
mainDocPart.AddAlternativeFormatImportPart(
AlternativeFormatImportPartType.Html, altChunkId);
//ms.Seek(0, SeekOrigin.Begin);
// Feed HTML data into format import part (chunk).
formatImportPart.FeedData(ms);
AltChunk altChunk = new AltChunk();
altChunk.Id = altChunkId;
mainDocPart.Document.Body.Append(altChunk);
}
MemoryStream ms = new MemoryStream(new UTF8Encoding(true).GetPreamble().Concat(Encoding.UTF8.GetBytes(htmlEncodedString)).ToArray()
String cid = "chunkid";
WordprocessingDocument document = WordprocessingDocument.Open("somefile.docx", true);
Body body = document.MainDocumentPart.Document.Body;
MemoryStream ms = new MemoryStream(System.Text.Encoding.UTF8.GetBytes("<html><head></head><body>hi</body></html>"));
AlternativeFormatImportPart formatImportPart = document.MainDocumentPart.AddAlternativeFormatImportPart(AlternativeFormatImportPartType.Html, cid);
formatImportPart.FeedData(ms);
AltChunk altChunk = new AltChunk();
altChunk.Id = cid;
document.MainDocumentPart.Document.Body.Append(altChunk);
document.MainDocumentPart.Document.Save();
// here's the magic!
document.Close();