Ответ 1
Я могу воспроизвести ошибку "... есть проблема с контентом", используя
неполный HTML-документ в качестве содержимого части импорта альтернативного формата.
Например, если вы используете следующий фрагмент HTML <h1>HELLO</h1>
MS Word не может открыть документ.
В приведенном ниже коде показано, как добавить AlternativeFormatImportPart
в документ слова.
(Я тестировал код с MS Word 2013).
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);
}
В соответствии с спецификацией Office OpenXML действительные родительские элементы для
Элемент w:altChunk
body, comment, docPartBody, endnote, footnote, ftr, hdr and tc
.
Итак, я добавил элемент w:altChunk
в элемент body.
Для получения дополнительной информации о элементе w:altChunk
см. эту ссылку MSDN.
ИЗМЕНИТЬ
Как указано @user2945722, чтобы убедиться, что правильная версия библиотеки OpenXml интерпретирует массив байтов как UTF-8, вы должны добавить преамбулу UTF-8. Это можно сделать следующим образом:
MemoryStream ms = new MemoryStream(new UTF8Encoding(true).GetPreamble().Concat(Encoding.UTF8.GetBytes(htmlEncodedString)).ToArray()
Это предотвратит показ вашего é как à © 's, ваш ä как ä и т.д.