Вы можете встроить файл CSS с помощью инструмента, подобного описанному here.
Затем, чтобы выполнить преобразование (адаптировано из Eric White's blog):
using (WordprocessingDocument myDoc =
WordprocessingDocument.Open("ConvertedDocument.docx", true))
{
string altChunkId = "AltChunkId1";
MainDocumentPart mainPart = myDoc.MainDocumentPart;
var chunk = mainPart.AddAlternativeFormatImportPart(
AlternativeFormatImportPartType.Html, altChunkId);
using (FileStream fileStream = File.Open("YourHtmlDocument.html", FileMode.Open))
{
chunk.FeedData(fileStream);
}
AltChunk altChunk = new AltChunk() {Id = altChunkId};
mainPart.Document.Body.InsertAfter(
altChunk, mainPart.Document.Body.Elements<Paragraph>().Last());
mainPart.Document.Save();
}
Это не совсем преобразования HTML в DOCX. Он добавляет YourHtmlDocument.html
в ConvertedDocument.docx
. Если ConvertedDocument.docx
изначально пуст, этот подход является эффективным преобразованием.
Всякий раз, когда вы используете AltChunk
для создания документа, ваш HTML встроен в документ до следующего раза, когда документ открывается в Word. В этот момент HTML преобразуется в разметку WordProcessingML
. Это действительно проблема только в том случае, если документ не будет открыт в MS Word. Если вы загружаете документы Google, открывая OpenOffice или используя COM для преобразования в PDF, OpenXML будет недостаточным. В этом случае вам, вероятно, придется обратиться к платному инструменту, например Aspose.Words.
Это аварийно завершает работу с элементами 'Elements() .Last()', если ранее не были вставлены абзацы, поскольку 'Last()' не может быть найден. Используйте 'mainPart.Document.Body.InsertAfterSelf (altChunk); вместо этого –