惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Security Latest
Security Latest
Recorded Future
Recorded Future
人人都是产品经理
人人都是产品经理
S
SegmentFault 最新的问题
Hacker News - Newest:
Hacker News - Newest: "LLM"
C
CXSECURITY Database RSS Feed - CXSecurity.com
博客园 - 三生石上(FineUI控件)
博客园 - 聂微东
P
Privacy & Cybersecurity Law Blog
WordPress大学
WordPress大学
Know Your Adversary
Know Your Adversary
Spread Privacy
Spread Privacy
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
量子位
L
LINUX DO - 热门话题
L
Lohrmann on Cybersecurity
博客园 - Franky
酷 壳 – CoolShell
酷 壳 – CoolShell
T
Tor Project blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
雷峰网
雷峰网
阮一峰的网络日志
阮一峰的网络日志
V
Visual Studio Blog
T
Threatpost
T
Tenable Blog
有赞技术团队
有赞技术团队
大猫的无限游戏
大猫的无限游戏
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI
C
Cisco Blogs
H
Heimdal Security Blog
Attack and Defense Labs
Attack and Defense Labs
A
About on SuperTechFans
Last Week in AI
Last Week in AI
N
News and Events Feed by Topic
T
Threat Research - Cisco Blogs
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
I
Intezer
V
V2EX
Cyberwarzone
Cyberwarzone
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
B
Blog RSS Feed
V
Vulnerabilities – Threatpost
N
Netflix TechBlog - Medium
T
The Blog of Author Tim Ferriss
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
U
Unit 42
PCI Perspectives
PCI Perspectives
P
Privacy International News Feed
D
Docker

博客园 - 神游虚空

解决 GDAL 用 C# 访问时,中文乱码问题。 学习AI编程 安装 RAGFlow 安装 KTransformer 量化投资赚的哪方面的钱? python中调用 .net 的 dll 时,报错:Exception has occurred: TypeLoadException 在python中 先调用C#的dll 返回了一个类的列表,如何把这个列表转换为 python 中的 DataFrame? vue项目服务器部属源码调试解决办法 vue3 + ts + element_plus 创建后台管理系统,学习记录 大A指数周内效应分析 两个通达信公式 如何在.netcore 上实现 Rbac 权限管理 修道是精神上的减熵过程 BPMN2.0 Specifaction 节选翻译,10.4.6 事件处理(handling Events,原文 275页) BPMN2.0 Specifaction 节选翻译,10.4 事件 Events (原文233页) 使用ef或dbcontext的时候主要注意三个问题 EFCore 中 group 分组后,只选出每组中含有最大值的数据行 BPMN2.0 Specifaction 节选翻译,10.2.8 循环特征 Loop Characteristics (原文 189页) BPMN2.0 Specifaction 节选翻译,10.2.5 子流程 Sub-Processes (原文173页) BPMN2.0 Specifaction 节选翻译,10 Process (原文145页)
使用 Open XML SDK 实现 html 富文本转换为 docx 格式示例
神游虚空 · 2023-10-12 · via 博客园 - 神游虚空

使用 Open XML SDK 实现 html 富文本转换为 docx 格式文档相对复杂。下面是一个示例。手动检测 <strong>和 <em> 标签并应用相应的文本格式。

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

class Program
{
    static void Main()
    {
        string htmlContent = "<p>This is <strong>bold</strong> and <em>italic</em> text.</p>";

        // 创建一个新的docx文档
        using (WordprocessingDocument doc = WordprocessingDocument.Create("output.docx", WordprocessingDocumentType.Document))
        {
            MainDocumentPart mainPart = doc.AddMainDocumentPart();
            mainPart.Document = new Document();
            Body body = mainPart.Document.AppendChild(new Body());

            // 解析HTML并创建docx段落
            string[] paragraphs = htmlContent.Split(new[] { "<p>", "</p>" }, StringSplitOptions.RemoveEmptyEntries);
            foreach (string paragraphContent in paragraphs)
            {
                Paragraph paragraph = new Paragraph();
                Run run = new Run();

                string[] tags = paragraphContent.Split(new[] { "<strong>", "</strong>", "<em>", "</em>" }, StringSplitOptions.None);
                foreach (string tag in tags)
                {
                    RunProperties runProperties = new RunProperties();
                    if (tag.Contains("<strong>"))
                    {
                        runProperties.Bold = new Bold();
                    }
                    if (tag.Contains("<em>"))
                    {
                        runProperties.Italic = new Italic();
                    }

                    run.Append(runProperties);
                    run.Append(new Text(tag));
                }

                paragraph.Append(run);
                body.Append(paragraph);
            }
        }

        Console.WriteLine("HTML to docx conversion complete.");
    }
}

需要根据 HTML 标记的不同来创建相应的 docx元素,例如将<p>标签映射到docx段落,将<strong>标签映射到粗体等。

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

class Program
{
    static void Main()
    {
        string htmlContent = "<p>This is <strong>bold</strong> and <em>italic</em> text.</p>";

        // 创建一个新的docx文档
        using (WordprocessingDocument doc = WordprocessingDocument.Create("output.docx", WordprocessingDocumentType.Document))
        {
            MainDocumentPart mainPart = doc.AddMainDocumentPart();
            mainPart.Document = new Document();
            Body body = mainPart.Document.AppendChild(new Body());

            // 解析HTML内容并创建相应的docx元素
            ProcessHtmlContent(htmlContent, body);

            doc.Save();
        }

        Console.WriteLine("HTML to docx conversion complete.");
    }

    static void ProcessHtmlContent(string htmlContent, OpenXmlElement parentElement)
    {
        // 解析HTML内容并将其映射到docx元素
        // 这里需要根据HTML标记的不同来创建相应的docx元素
        // 例如,<p>标签可以映射到段落,<strong>可以映射到粗体文本等

        // 示例:将HTML段落转换为docx段落
        if (htmlContent.StartsWith("<p>") && htmlContent.EndsWith("</p>"))
        {
            string paragraphText = htmlContent.Substring(3, htmlContent.Length - 7);
            Paragraph paragraph = new Paragraph(new Run(new Text(paragraphText)));
            parentElement.Append(paragraph);
        }

        // 添加更多的HTML标记处理逻辑以满足你的需求
    }
}

下例使用 Html2OpenXml 将 html 转 docx

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

class Program
{
    static void Main()
    {
        string htmlContent = "<p>This is <strong>bold</strong> and <em>italic</em> text.</p>";

        // 创建一个新的docx文档
        using (WordprocessingDocument doc = WordprocessingDocument.Create("output.docx", WordprocessingDocumentType.Document))
        {
            MainDocumentPart mainPart = doc.AddMainDocumentPart();
            mainPart.Document = new Document();
            Body body = mainPart.Document.AppendChild(new Body());

            // 使用Html2OpenXml将HTML内容转换为docx元素
            var converter = new HtmlConverter(mainPart);
            converter.ImageProcessing = ImageProcessing.AutomaticDownload;
            var paragraphs = converter.Parse(htmlContent);
            
            foreach (var paragraph in paragraphs)
            {
                body.Append(paragraph);
            }

            doc.Save();
        }

        Console.WriteLine("HTML to docx conversion complete.");
    }
}

带内联式 css 样式。

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

class Program
{
    static void Main()
    {
        string htmlContent = "<p style=\"color: blue; font-size: 14px;\">This is <strong>bold</strong> and <em>italic</em> text.</p>";

        // 创建一个新的docx文档
        using (WordprocessingDocument doc = WordprocessingDocument.Create("output.docx", WordprocessingDocumentType.Document))
        {
            MainDocumentPart mainPart = doc.AddMainDocumentPart();
            mainPart.Document = new Document();
            Body body = mainPart.Document.AppendChild(new Body());

            // 使用Html2OpenXml将HTML内容转换为docx元素
            var converter = new HtmlConverter(mainPart);
            converter.ImageProcessing = ImageProcessing.AutomaticDownload;
            var paragraphs = converter.Parse(htmlContent);

            foreach (var paragraph in paragraphs)
            {
                body.Append(paragraph);
            }

            doc.Save();
        }

        Console.WriteLine("HTML to docx conversion complete.");
    }
}

带 css 样式应用

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

class Program
{
    static void Main()
    {
        string htmlContent = "<p class=\"my-paragraph\">This is <strong>bold</strong> and <em>italic</em> text.</p>";
        string externalCss = ".my-paragraph { color: blue; font-size: 14px; }";

        // 创建一个新的docx文档
        using (WordprocessingDocument doc = WordprocessingDocument.Create("output.docx", WordprocessingDocumentType.Document))
        {
            MainDocumentPart mainPart = doc.AddMainDocumentPart();
            mainPart.Document = new Document();
            Body body = mainPart.Document.AppendChild(new Body());

            // 将外部CSS样式转化为内联样式
            htmlContent = ApplyExternalCssToHtml(htmlContent, externalCss);

            // 使用Html2OpenXml将HTML内容转换为docx元素
            var converter = new HtmlConverter(mainPart);
            converter.ImageProcessing = ImageProcessing.AutomaticDownload;
            var paragraphs = converter.Parse(htmlContent);

            foreach (var paragraph in paragraphs)
            {
                body.Append(paragraph);
            }

            doc.Save();
        }

        Console.WriteLine("HTML to docx conversion complete.");
    }

    static string ApplyExternalCssToHtml(string htmlContent, string externalCss)
    {
        // 解析外部CSS文件并将其应用于HTML内容
        // 这里需要将CSS规则应用到HTML标记的内联样式中
        // 在此示例中,我们简单地将CSS类名替换为内联样式
        // 你可能需要更复杂的CSS处理逻辑,取决于外部CSS文件的内容和结构

        // 将样式规则拆分为每个类
        var cssRules = externalCss.Split('}');

        foreach (var rule in cssRules)
        {
            if (!string.IsNullOrWhiteSpace(rule))
            {
                // 提取类名和样式属性
                var parts = rule.Split('{');
                var className = parts[0].Trim();
                var style = parts[1].Trim();

                // 将类名替换为内联样式
                htmlContent = htmlContent.Replace($"class=\"{className}\"", $"style=\"{style}\"");
            }
        }

        return htmlContent;
    }
}