2013-06-11 4 views
3

Я знаю, что есть уже вопросы, подобные этому, и предложил Open XML и все.Преобразование HTML в Word Docx со стилем нетронутым

Я использую Open XMl, но он работает только с встроенным стилем.

есть ли какое-либо решение этого или любой другой лучший способ конвертировать html в docx, отличный от Open XML.

Спасибо!

ответ

4

Вы можете встроить файл 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.

+0

Это аварийно завершает работу с элементами 'Elements () .Last()', если ранее не были вставлены абзацы, поскольку 'Last()' не может быть найден. Используйте 'mainPart.Document.Body.InsertAfterSelf (altChunk); вместо этого –

Смежные вопросы