From 12f582e1d3d04a3906de2085354d75a15f40c8a6 Mon Sep 17 00:00:00 2001 From: tangt Date: Tue, 17 Mar 2026 10:18:25 +0800 Subject: [PATCH 1/2] =?UTF-8?q?html=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/MiniWord/MiniWord.Implment.cs | 81 ++++++++++++++++++++++++++++--- src/MiniWord/MiniWord.csproj | 6 ++- src/MiniWord/MiniWordHtml.cs | 10 ++++ 3 files changed, 89 insertions(+), 8 deletions(-) create mode 100644 src/MiniWord/MiniWordHtml.cs diff --git a/src/MiniWord/MiniWord.Implment.cs b/src/MiniWord/MiniWord.Implment.cs index 6e48862..3036b94 100644 --- a/src/MiniWord/MiniWord.Implment.cs +++ b/src/MiniWord/MiniWord.Implment.cs @@ -1,10 +1,11 @@ namespace MiniSoftware { using DocumentFormat.OpenXml; + using DocumentFormat.OpenXml.Drawing.Charts; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Wordprocessing; using Extensions; - using Utility; + using HtmlToOpenXml; using System; using System.Collections; using System.Collections.Generic; @@ -12,14 +13,14 @@ namespace MiniSoftware using System.Linq; using System.Text; using System.Text.RegularExpressions; + using System.Threading; + using System.Threading.Tasks; + using System.Xml; + using System.Xml.Linq; + using Utility; using A = DocumentFormat.OpenXml.Drawing; using DW = DocumentFormat.OpenXml.Drawing.Wordprocessing; using PIC = DocumentFormat.OpenXml.Drawing.Pictures; - using System.Xml; - using System.Xml.Linq; - using DocumentFormat.OpenXml.Drawing.Charts; - using System.Threading.Tasks; - using System.Threading; public static partial class MiniWord { @@ -653,6 +654,21 @@ private static void ReplaceText(Paragraph p, WordprocessingDocument docx, Dictio t.Remove(); } + else if (value is MiniWordHtml html) + { + AddHtmls(docx, run, new[] { html }); + t.Remove(); + } + else if (value is MiniWordHtml[] htmls) + { + AddHtmls(docx, run, htmls); + t.Remove(); + } + else if (value is IEnumerable htmlList) + { + AddHtmls(docx, run, htmlList.ToArray()); + t.Remove(); + } else { var newText = value is DateTime @@ -1175,5 +1191,58 @@ private static byte[] GetBytes(string path) return ms.ToArray(); } } + + #region html支持 + + /// + /// 填充htmls + /// + /// + /// + private static void AddHtmls(WordprocessingDocument docx, Run run, MiniWordHtml[] miniWordHtmls) + { + //找到当前顶级段落(body)添加,html中的表格不能直接放在run或者段落里 + Paragraph topPara = FindTopPara(run); + foreach (var miniWordHtml in miniWordHtmls) + { + try + { + //实例化转换对象 + HtmlConverter converter = new HtmlConverter(docx.MainDocumentPart); + //解析 + var paras = converter.Parse(miniWordHtml.HtmlText); + //倒排插入(因为都是插入到标记位置后面所以需要倒排) + for (var i = paras.Count - 1; i >= 0; i--) + { + var item = paras[i]; + topPara.Parent.InsertAfter(item, topPara); + } + } + catch (Exception) + { } + } + } + + /// + /// 找到当前顶级段落(body)添加 + /// + /// + /// + private static Paragraph FindTopPara(Run run) + { + Paragraph result = null; + for (var pnode = run.Parent; pnode != null;) + { + if (pnode is Paragraph para && pnode.Parent != null && pnode.Parent is Body) + { + result = para; + } + pnode = pnode.Parent; + } + return result; + } + + #endregion + } } diff --git a/src/MiniWord/MiniWord.csproj b/src/MiniWord/MiniWord.csproj index 34c6deb..46d0886 100644 --- a/src/MiniWord/MiniWord.csproj +++ b/src/MiniWord/MiniWord.csproj @@ -1,6 +1,6 @@  - net45;netstandard2.0; + net462;netstandard2.0; 0.9.1 @@ -33,6 +33,8 @@ - + + + diff --git a/src/MiniWord/MiniWordHtml.cs b/src/MiniWord/MiniWordHtml.cs new file mode 100644 index 0000000..92f13da --- /dev/null +++ b/src/MiniWord/MiniWordHtml.cs @@ -0,0 +1,10 @@ +namespace MiniSoftware +{ + /// + /// html参数对象 + /// + public class MiniWordHtml + { + public string HtmlText { get; set; } + } +} From 565874503e5598f7c6e948fee31b8fa87e2f9382 Mon Sep 17 00:00:00 2001 From: tangt Date: Tue, 17 Mar 2026 12:10:13 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=A0=B9=E6=8D=AEgithub=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/MiniWord/MiniWord.Implment.cs | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/MiniWord/MiniWord.Implment.cs b/src/MiniWord/MiniWord.Implment.cs index 3036b94..e6b0db5 100644 --- a/src/MiniWord/MiniWord.Implment.cs +++ b/src/MiniWord/MiniWord.Implment.cs @@ -659,14 +659,9 @@ private static void ReplaceText(Paragraph p, WordprocessingDocument docx, Dictio AddHtmls(docx, run, new[] { html }); t.Remove(); } - else if (value is MiniWordHtml[] htmls) - { - AddHtmls(docx, run, htmls); - t.Remove(); - } else if (value is IEnumerable htmlList) { - AddHtmls(docx, run, htmlList.ToArray()); + AddHtmls(docx, run, htmlList); t.Remove(); } else @@ -1199,10 +1194,11 @@ private static byte[] GetBytes(string path) /// /// /// - private static void AddHtmls(WordprocessingDocument docx, Run run, MiniWordHtml[] miniWordHtmls) + private static void AddHtmls(WordprocessingDocument docx, Run run, IEnumerable miniWordHtmls) { //找到当前顶级段落(body)添加,html中的表格不能直接放在run或者段落里 Paragraph topPara = FindTopPara(run); + if (topPara == null) return; foreach (var miniWordHtml in miniWordHtmls) { try @@ -1230,16 +1226,14 @@ private static void AddHtmls(WordprocessingDocument docx, Run run, MiniWordHtml[ /// private static Paragraph FindTopPara(Run run) { - Paragraph result = null; - for (var pnode = run.Parent; pnode != null;) + for (var pnode = run.Parent; pnode != null; pnode = pnode.Parent) { if (pnode is Paragraph para && pnode.Parent != null && pnode.Parent is Body) { - result = para; + return para; } - pnode = pnode.Parent; } - return result; + return null; } #endregion