c# 将html转化到word

c# 将html转化到word

1)HtmlToWordConverter.cs

cs 复制代码
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using HtmlAgilityPack;
using System.Collections.Generic;

namespace ConsoleApp9
{
    public class HtmlToWordConverter
    {
        public void ConvertHtmlToWord(List<string> bodyStrings, string titleString, string docxFilePath)
        {
            using (WordprocessingDocument wordDocument = WordprocessingDocument.Create(docxFilePath, WordprocessingDocumentType.Document))
            {
                MainDocumentPart mainPart = wordDocument.AddMainDocumentPart();
                mainPart.Document = new Document();
                Body body = mainPart.Document.AppendChild(new Body());

                // Add centered title
                if (!string.IsNullOrEmpty(titleString))
                {
                    Paragraph titleParagraph = new Paragraph();
                    Run titleRun = new Run(new Text(titleString));
                    titleParagraph.AppendChild(new ParagraphProperties(new Justification() { Val = JustificationValues.Center }));
                    titleParagraph.Append(titleRun);
                    body.Append(titleParagraph);
                }

                // Convert each bodyString to Word content
                foreach (string bodyString in bodyStrings)
                {
                    HtmlDocument htmlDoc = new HtmlDocument();
                    htmlDoc.LoadHtml(bodyString);

                    ConvertHtmlNodesToWord(htmlDoc.DocumentNode.ChildNodes, body);
                }
            }
        }

        private void ConvertHtmlNodesToWord(HtmlNodeCollection nodes, OpenXmlElement parent)
        {
            foreach (HtmlNode node in nodes)
            {
                switch (node.Name)
                {
                    case "p": // Paragraph
                        Paragraph para = new Paragraph();
                        Run run = new Run();
                        ConvertHtmlToRun(node.ChildNodes, run);
                        para.Append(run);
                        parent.Append(para);
                        break;

                    case "h1": // Heading 1
                    case "h2": // Heading 2
                    case "h3": // Heading 3
                    case "h4": // Heading 4
                    case "h5": // Heading 5
                    case "h6": // Heading 6
                        Paragraph heading = new Paragraph();
                        Run runHeading = new Run();
                        RunProperties runPropHeading = new RunProperties();

                        // Set heading style based on HTML heading level
                        int headingLevel = int.Parse(node.Name.Substring(1)); // Extract the number from "h1" to "1"
                        if (headingLevel >= 1 && headingLevel <= 6)
                        {
                            runPropHeading.Append(new Bold());
                            runPropHeading.Append(new FontSize() { Val = new StringValue((24 - (headingLevel - 1) * 2).ToString()) });
                            runPropHeading.Append(new DocumentFormat.OpenXml.Wordprocessing.Color() { Val = "2E74B5" }); // You can adjust the color as needed
                        }
                        runHeading.Append(runPropHeading);
                        ConvertHtmlToRun(node.ChildNodes, runHeading);
                        heading.Append(runHeading);
                        parent.Append(heading);
                        break;

                    // Add more cases for other HTML elements like tables, lists, etc. as needed

                    default:
                        break;
                }

                if (node.HasChildNodes)
                {
                    ConvertHtmlNodesToWord(node.ChildNodes, parent);
                }
            }
        }

        private void ConvertHtmlToRun(HtmlNodeCollection nodes, Run run)
        {
            foreach (HtmlNode node in nodes)
            {
                switch (node.Name)
                {
                    case "#text": // Text node
                        run.AppendChild(new Text(node.InnerText));
                        break;

                    case "strong": // Strong (bold) text
                        RunProperties runPropStrong = new RunProperties(new Bold());
                        run.AppendChild(runPropStrong);
                        ConvertHtmlToRun(node.ChildNodes, run);
                        break;

                    case "em": // Emphasized (italic) text
                        RunProperties runPropEm = new RunProperties(new Italic());
                        run.AppendChild(runPropEm);
                        ConvertHtmlToRun(node.ChildNodes, run);
                        break;

                    // Add more cases for other HTML formatting elements as needed

                    default:
                        ConvertHtmlToRun(node.ChildNodes, run);
                        break;
                }
            }
        }
    }
}

2)Program.cs

cs 复制代码
using System;
using System.Collections.Generic;

namespace ConsoleApp9
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> bodyStrings = new List<string>{
            @"<h1>内容1</h1>
            <p>第一段内容</p>
            <p>第二段内容</p>",
            @"<h1>内容2</h1>
            <p>第一段内容</p>
            <p>第二段内容</p>"};

            string titleString = "HTML测试";
            string docxFilePath = AppDomain.CurrentDomain.BaseDirectory + "tests.docx";

            HtmlToWordConverter converter = new HtmlToWordConverter();
            converter.ConvertHtmlToWord(bodyStrings, titleString, docxFilePath);

            Console.WriteLine("生成word成功");
        }
    }
}
相关推荐
小羊没烦恼!6 分钟前
【译】利用Asp.net MVC处理文件的上传下载
开发语言·缓存·c#·word·powerpoint·.net
波力海苔夹心脆67529 分钟前
C# 海康威视摄像头二次开发入门:HCNetSDK 登录、实时预览、云台控制、录像与抓图(WinForms 实战)
开发语言·windows·经验分享·tcp/ip·c#
resh_people36 分钟前
开源鸿蒙平台 KMP_CMP 三方库「kotlinx.html」适配全流程
开源·html·harmonyos
hasty44 分钟前
HTML 已经转义,为何仍有 XSS?Sharp srcdoc 漏洞中的第二次解析
前端·html·xss
淡海水1 小时前
16-03-C#数据结构源码-附录C-参考资源
unity·c#·游戏引擎·il2cpp
IMPYLH1 小时前
HTML 的 <tfoot> 元素
前端·javascript·html
asdzx672 小时前
Excel 水印方案对比:页眉图片 vs 背景图片(附 C# 实现)
c#·excel
影寂ldy2 小时前
C# TCP转串口Modbus网关终极完整版笔记(队列防抖+一问一答+帧解析+双客户端轮询)
笔记·tcp/ip·c#
吴声子夜歌2 小时前
HTML——富媒体资源元素(音视频)
html·音视频·媒体
蓝悦无人机2 小时前
CesiumJS 初始化、资源加载与避坑
html·cesium maps sdk