Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将HTML字符串添加到OpenXML(*.docx)文档_C#_Openxml_Openxml Sdk - Fatal编程技术网

C# 将HTML字符串添加到OpenXML(*.docx)文档

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的“东西”)。非常感谢您的

我正在尝试使用Microsoft的OpenXML 2.5库来创建OpenXML文档。在我尝试在文档中插入HTML字符串之前,一切都很顺利。我已经浏览了网络,以下是我到目前为止得出的结论(仅限于我遇到问题的部分):

显然,在这个例子中,我并没有实际添加altChunk,但我已经尝试在任何地方添加它——在run、段落、body等中。在任何情况下,我都无法在Word 2010中打开docx文件

这让我有点发疯,因为它看起来应该是直截了当的(我承认我没有完全理解AltChunk的“东西”)。非常感谢您的帮助

旁注:我确实发现了一件有趣的事情,我不知道这是否真的是一个问题,那就是当从MemoryStream工作时,AltChunk会破坏文件。有人能确认这是/不是真的吗?

我可以通过使用复制错误“…内容有问题” 作为替代格式导入部分内容的不完整HTML文档。 例如,如果您使用以下HTML代码段
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();