5

ファイルを生成するためにこの方法を使用していdocxます:

public static void CreateDocument(string documentFileName, string text)
{
    using (WordprocessingDocument wordDoc =
        WordprocessingDocument.Create(documentFileName, WordprocessingDocumentType.Document))
    {
        MainDocumentPart mainPart = wordDoc.AddMainDocumentPart();

        string docXml =
                    @"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?>
                 <w:document xmlns:w=""http://schemas.openxmlformats.org/wordprocessingml/2006/main"">
                 <w:body><w:p><w:r><w:t>#REPLACE#</w:t></w:r></w:p></w:body>
                 </w:document>";

        docXml = docXml.Replace("#REPLACE#", text);

        using (Stream stream = mainPart.GetStream())
        {
            byte[] buf = (new UTF8Encoding()).GetBytes(docXml);
            stream.Write(buf, 0, buf.Length);
        }
    }
}

それは魅力のように機能します:

CreateDocument("test.docx", "Hello");

しかし、代わりに HTML コンテンツを配置したい場合はどうすればよいHelloでしょうか? 例えば:

CreateDocument("test.docx", @"<html><head></head>
                              <body>
                                    <h1>Hello</h1>
                              </body>
                        </html>");

またはこのようなもの:

CreateDocument("test.docx", @"Hello<BR>
                                    This is a simple text<BR>
                                    Third paragraph<BR>
                                    Sign
                        ");

どちらの場合も、 に対して無効な構造が作成されdocument.xmlます。何か案が?HTML コンテンツから docx ファイルを生成するにはどうすればよいですか?

4

3 に答える 3

10

ここでゲームに7年遅れていることに気づきました。それでも、今後 HTML から Word Doc に変換する方法を探している人のために、Microsoft MSDN サイトに投稿されたこのブログは、OpenXML を使用してこれを行うために必要な要素のほとんどを提供します。投稿自体が紛らわしいと思いましたが、彼が含めたソースコードですべてが明確になりました。

欠けていた唯一の部分は、彼の例が示すように既存のファイルにマージする方法ではなく、ゼロから Docx ファイルを作成する方法でした。私はここからその一口を見つけました。

残念ながら、これを使用したプロジェクトは vb.net で書かれています。そのため、最初に vb.net コードを共有し、次にその自動化された C# 変換を共有します。これは正確である場合とそうでない場合があります。

vb.net コード:

Imports DocumentFormat.OpenXml
Imports DocumentFormat.OpenXml.Packaging
Imports DocumentFormat.OpenXml.Wordprocessing
Imports System.IO

Dim ms As IO.MemoryStream
Dim mainPart As MainDocumentPart
Dim b As Body
Dim d As Document
Dim chunk As AlternativeFormatImportPart
Dim altChunk As AltChunk

Const altChunkID As String = "AltChunkId1"

ms = New MemoryStream()

Using myDoc = WordprocessingDocument.Create(ms,WordprocessingDocumentType.Document)
    mainPart = myDoc.MainDocumentPart

    If mainPart Is Nothing Then
        mainPart = myDoc.AddMainDocumentPart()

        b = New Body()
        d = New Document(b)
        d.Save(mainPart)
    End If

    chunk = mainPart.AddAlternativeFormatImportPart(AlternativeFormatImportPartType.Xhtml, altChunkID)

    Using chunkStream As Stream = chunk.GetStream(FileMode.Create, FileAccess.Write)
        Using stringStream As StreamWriter = New StreamWriter(chunkStream)
            stringStream.Write("YOUR HTML HERE")
        End Using
    End Using

    altChunk = New AltChunk()
    altChunk.Id = altChunkID
    mainPart.Document.Body.InsertAt(Of AltChunk)(altChunk, 0)
    mainPart.Document.Save()
End Using

c# コード:

using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using System.IO;

IO.MemoryStream ms;
MainDocumentPart mainPart;
Body b;
Document d;
AlternativeFormatImportPart chunk;
AltChunk altChunk;

string altChunkID = "AltChunkId1";

ms = new MemoryStream();

Using (myDoc = WordprocessingDocument.Create(ms, WordprocessingDocumentType.Document))
{
    mainPart = myDoc.MainDocumentPart;

    if (mainPart == null) 
    {
         mainPart = myDoc.AddMainDocumentPart();
         b = new Body();
         d = new Document(b);
         d.Save(mainPart);
    }

    chunk = mainPart.AddAlternativeFormatImportPart(AlternativeFormatImportPartType.Xhtml, altChunkID);

    Using (Stream chunkStream = chunk.GetStream(FileMode.Create, FileAccess.Write)
    {
         Using (StreamWriter stringStream = new StreamWriter(chunkStream))         
         {
              stringStream.Write("YOUR HTML HERE");
         }
    }    

    altChunk = new AltChunk();
    altChunk.Id = altChunkID;
    mainPart.Document.Body.InsertAt(Of, AltChunk)[altChunk, 0];
    mainPart.Document.Save();
}

ms別のルーチンでメモリ ストリームを使用していることに注意してください。このルーチンは、使用後に破棄されます。

これが他の誰かに役立つことを願っています!

于 2018-07-05T23:45:51.143 に答える
6

HTML コンテンツを「document.xml」に挿入することはできません。この部分は WordprocessingML コンテンツのみを想定しているため、その HTML を WordprocessingML に変換する必要があります。これを参照してください

使用できるもう 1 つの要素は altChunk 要素です。これを使用すると、HTML ファイルを DOCX ファイル内に配置し、ドキュメント内の特定の場所でその HTML コンテンツを参照できます。これを参照してください

最後に、GemBox.Document ライブラリを使用すると、目的を正確に達成できます。以下を参照してください。

public static void CreateDocument(string documentFileName, string text)
{
    DocumentModel document = new DocumentModel();
    document.Content.LoadText(text, LoadOptions.HtmlDefault);
    document.Save(documentFileName);
}

または、HTML コンテンツを直接 DOCX ファイルに変換することもできます。

public static void Convert(string documentFileName, string htmlText)
{
    HtmlLoadOptions options = LoadOptions.HtmlDefault;
    using (var htmlStream = new MemoryStream(options.Encoding.GetBytes(htmlText)))
        DocumentModel.Load(htmlStream, options)
                     .Save(documentFileName);
}
于 2016-05-11T06:44:25.563 に答える
2

このコードを使用して、.netコアでOpenXMLを使用してHTMLコンテンツをdocxファイルに正常に変換できました

string html = "<strong>Hello</strong> World";
using (MemoryStream generatedDocument = new MemoryStream()){
   using (WordprocessingDocument package = 
                  WordprocessingDocument.Create(generatedDocument,
                  WordprocessingDocumentType.Document)){
   MainDocumentPart mainPart = package.MainDocumentPart;
   if (mainPart == null){
    mainPart = package.AddMainDocumentPart();
    new Document(new Body()).Save(mainPart);
}
HtmlConverter converter = new HtmlConverter(mainPart);
converter.ParseHtml(html);
mainPart.Document.Save();
}

ディスクに保存するには

System.IO.File.WriteAllBytes("filename.docx", generatedDocument.ToArray());

net core mvc でダウンロードするファイルを返すには、次を使用します。

return File(generatedDocument.ToArray(), 
          "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
          "filename.docx");
于 2020-12-17T15:08:06.117 に答える