gpt4 book ai didi

c# - 使用 OpenXML 从 HTML 文件生成 docx 文件

转载 作者:行者123 更新时间:2023-11-30 19:37:39 25 4
gpt4 key购买 nike

我正在使用此方法生成 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 文件?

最佳答案

我意识到我迟到了 7 年。尽管如此,对于 future 搜索如何从 HTML 转换为 Word Doc 的人来说,this Microsoft MSDN 站点上的博客文章提供了使用 OpenXML 执行此操作所需的大部分要素。我发现帖子本身令人困惑,但是 source他包含的代码为我澄清了这一切。

唯一缺少的部分是如何从头开始构建 Docx 文件,而不是如他的示例所示如何合并到现有文件中。我从 here 找到了那个花絮.

不幸的是,我使用它的项目是用 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 内存流,这是它在使用后被丢弃的地方。

我希望这对其他人有帮助!

关于c# - 使用 OpenXML 从 HTML 文件生成 docx 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37154495/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com