我使用此方法生成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文件?
答案 0 :(得分:3)
您不能只将HTML内容插入“document.xml”,此部分只需要一个WordprocessingML内容,因此您必须将该HTML转换为WordprocessingML see this。
您可以使用的另一件事是altChunk元素,您可以将它放在DOCX文件中,然后在文档中的某个特定位置引用该HTML内容see this。
最后作为替代方案,使用GemBox.Document library您可以完全按照自己的意愿完成,请参阅以下内容:
for f in data/*txt; do docker cp $f sandbox_web_1:/usr/src/app/data/; done
或者您实际上可以直接将HTML内容转换为DOCX文件:
public static void CreateDocument(string documentFileName, string text)
{
DocumentModel document = new DocumentModel();
document.Content.LoadText(text, LoadOptions.HtmlDefault);
document.Save(documentFileName);
}
答案 1 :(得分:2)
我意识到我迟到了7年。不过,对于将来的人们来说,如何将HTML转换为Word Doc,Microsoft MSDN网站上的this博客文章提供了使用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
内存流,该内存流在使用后将被丢弃。
我希望这对其他人有帮助!
答案 2 :(得分:0)
我可以使用此代码在.net Core中使用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");