C# 导出word 插入公式问题

article/2025/8/29 1:25:07

最近遇到了一个问题,下载一个文档时需要下载word可编辑的公式。找了很久终于找到了一种解决办法。下面是以C#代码来实现在Word中插入公式的功能。

目录

  • 一、引入dll程序集文件
    • 1、通过 NuGet 引入dll(2种方法)的方法:
    • 2、手动添加dll引用的方法
  • 二、插入公式
  • 三、如何查找并替换公式
    • latex公式提取器
    • 查找并进行公式替换

一、引入dll程序集文件

1、通过 NuGet 引入dll(2种方法)的方法:

  1. 可以在Visual Studio中打开“解决方案资源管理器”,鼠标右键点击“引用”,“管理NuGet包”,然后搜索“Free Spire.Doc”,点击“安装”。等待程序安装完成。
    在这里插入图片描述

  2. 将以下内容复制到PM控制台安装:

      Install-Package FreeSpire.Doc -Version 10.2
    

2、手动添加dll引用的方法

可通过手动下载包到本地,然后解压,找到BIN文件夹下的Spire.Doc.dll。然后在Visual Studio中打开“解决方案资源管理器”,鼠标右键点击“引用”,“添加引用”,将本地路径BIN文件夹下的dll文件添加引用至程序。

二、插入公式

在编辑公式时,通过 OfficeMath.FromLatexMathCode() 方法和 OfficeMath.FromMathMLCode()方法来添加LaTeX公式及MathML公式。开发者可根据程序设计需要选择其中对应的方法来编辑公式即可。

下面是本次程序代码实现公式添加的主要代码步骤:

  1. 创建 Document类的对象,并调用 Document.AddSection()方法添加节到Word文档。
  2. 通过 Section.AddParagraph()方法添加段落。
  3. 初始化 OfficeMath类的实例。通过 OfficeMath.FromLatexMathCode(string latexMathCode)方法编辑LeTeX公式;通过 OfficeMath.FromMathMLCode(string mathMLCode)方法编辑MathML公式。
  4. 通过 DocumentObjectCollection.Add(Spire.Doc.Interface.IDocumentObject entity)方法添加公式到段落。
  5. 最后,通过 Document.SaveToFile(string fileName, FileFormat fileFormat)方法保存文档。
using Spire.Doc;
using Spire.Doc.Documents;
using Spire.Doc.Fields.OMath;namespace InsertFormula
{class Program{static void Main(string[] args){//新建word实例Document doc = new Document();//添加一个sectionSection section = doc.AddSection();//添加一个段落 Paragraph paragraph = section.AddParagraph();//在第一段添加Latex公式OfficeMath officeMath = new OfficeMath(doc);officeMath.FromLatexMathCode("x^{2}+\\sqrt{x^{2}+1}=2");paragraph.Items.Add(officeMath);//添加MathML公式到第四段Paragraph paragraph1 = section.AddParagraph();OfficeMath officeMath1 = new OfficeMath(doc);            officeMath1.FromMathMLCode("<mml:math xmlns:mml=\"http://www.w3.org/1998/Math/MathML\" xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\"><mml:msup><mml:mrow><mml:mi>x</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msup><mml:mo>+</mml:mo><mml:msqrt><mml:msup><mml:mrow><mml:mi>x</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msup><mml:mo>+</mml:mo><mml:mn>1</mml:mn></mml:msqrt><mml:mo>+</mml:mo><mml:mn>1</mml:mn></mml:math>");paragraph1.Items.Add(officeMath1);//这里可以进行自己的操作添加数据。。。//保存文档       doc.SaveToFile("InsertFormulas.docx", FileFormat.Docx);}}
}

结果:
在这里插入图片描述

三、如何查找并替换公式

有时候我们并不是直接插入公式,公式存在于文本值中,这个时候我们就需要在文本中替换公式部分。
结果如下:
在这里插入图片描述

latex公式提取器

using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace TEST;/// <summary>
/// Latex公式提取器
/// </summary>
public class LatexFormulaExtractor
{// 正则表达式模式组合:匹配所有可能的 LaTeX 公式形式private static readonly Regex LaTeXPattern = new Regex(// 匹配 LaTeX 环境(如 \begin{equation}...\end{equation})@"\\begin\{([a-zA-Z]+\*?)\}.*?\\end\{\1\}" + "|" +// 匹配 $$...$$ 或 \[...\]@"\${2}(.*?)\${2}|\\\[(.*?)\\\]" + "|" +// 匹配 $...$(需排除转义的 \$)@"(?<!\\)\$((?:[^$\\]|\\.)*?)(?<!\\)\$",RegexOptions.Singleline | RegexOptions.IgnoreCase);/// <summary>/// 从文本中提取所有 LaTeX 公式/// </summary>public static List<string> ExtractLatexFormulas(string input){var formulas = new List<string>();if (string.IsNullOrWhiteSpace(input)) return formulas;// 遍历所有匹配项foreach (Match match in LaTeXPattern.Matches(input)){if (match.Success){// 提取匹配的公式内容(处理不同捕获组)string formula = match.Groups[0].Value;formulas.Add(formula);}}return formulas;}
}

查找并进行公式替换

 var formulas = LatexFormulaExtractor.ExtractLatexFormulas(htmlContent);foreach (var formula in formulas){// 添加Office Math公式OfficeMath math = new OfficeMath(doc);// 确保OfficeMath对象正确初始化if (math != null){math.FromLatexMathCode(formula); // 使用LaTeX语法插入公式}//查找文档中的指定文本内容TextSelection[] selections = doc.FindAllString(@formula, true, true);int tindex = 0;TextRange range = null;//遍历文档,移除文本内容,插入公式if (selections != null){foreach (TextSelection selection in selections){range = selection.GetAsOneRange();tindex = range.OwnerParagraph.ChildObjects.IndexOf(range);range.OwnerParagraph.ChildObjects.Insert(tindex, math);range.OwnerParagraph.ChildObjects.Remove(range);}}}

http://www.hkcw.cn/article/xaoCrcDpRE.shtml

相关文章

GitHub 汉化插件,GitHub 中文化界面安装全教程

概述 GitHub作为全球最大的代码托管平台&#xff0c;拥有庞大的用户群体。对于中文用户来说&#xff0c;如果能将GitHub界面汉化&#xff0c;将大大提高使用体验和工作效率。本文将详细介绍如何通过安装汉化插件&#xff0c;实现GitHub界面的中文化。 感谢maboloshi作者的无私奉…

红 黑 树

AVL树是严格平衡的。 红⿊树是⼀棵⼆叉搜索树。 通过对任何⼀条从根到叶⼦的路径上各个结点的颜⾊进⾏约束&#xff0c;红⿊树确保没有⼀条路径会⽐其他路径⻓出2倍&#xff0c;因⽽是接近平衡的。即最长路径<最短路径的2倍。 红黑树规则&#xff1a; 1. 每个结点不是红⾊…

[ Qt ] | Qlabel使用

目录 属性 setTextFormat 插入图片 设置图片根据窗口大小实时变化 边框和对其方式 ​编辑 设置缩进 设置伙伴 Qlabel可以用来显式图片和文字 属性 text textFormat Qlabel独有的机制&#xff1a;buddy setTextFormat 插入图片 设置图片根据窗口大小实时变化 Qt中表…

智能座舱产品安全标准

目录 一、导览 二、意向 一、导览 国内近几年的电动汽车发展迅速&#xff0c;2024年4月16日&#xff0c;工信部装备工业一司组织主要汽车生产企业、部装备工业发展中心等近60名代表召开专题会议&#xff0c;重点落实《关于进一步加强智能网联汽车产品准入、召回及软件在线升级…

责任链模式:构建灵活可扩展的请求处理体系(Java 实现详解)

一、责任链模式核心概念解析 &#xff08;一&#xff09;模式定义与本质 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;其核心思想是将多个处理者对象连成一条链&#xff0c;并沿着这条链传递请求&#xff0c;直到有某…

Sentieon项目文章 | 社区努力识别和纠正蛋白质基因组研究中标签错误的样本

关键词&#xff1a;多组学&#xff1b;蛋白质&#xff1b;错误标记&#xff1b; 引言 在日常生活中&#xff0c;会经常遇到物品与标签错误的问题&#xff0c;比如超市商品标价错误、图书馆书籍分类错误等。都会造成一些后果。在生物医学研究领域中&#xff0c;蛋白质样本标记错…

git reset --hard HEAD~1与git reset --hard origin/xxx

git reset --hard HEAD~1与git reset --hard origin/xxx git reset --hard origin/xxx有时候会太长&#xff0c;手工输入略微繁琐&#xff0c;可以考虑&#xff1a; git reset --hard HEAD~1 替代。 或者使用这种方式 git reset撤销当前分支所有修改&#xff0c;恢复到最近一…

Kotlin委托机制使用方式和原理

目录 类委托属性委托简单的实现属性委托Kotlin标准库中提供的几个委托延迟属性LazyLazy委托参数可观察属性Observable委托vetoable委托属性储存在Map中 实践方式双击back退出Fragment/Activity传参ViewBinding和委托 类委托 类委托有点类似于Java中的代理模式 interface Base…

2025年能源科学与农业发展国际会议:共创可持续农业未来

会议简介 第二届能源环境科学与农业发展国际会议即将在武汉盛大召开。此次盛会定于武汉这一中部地区的中心城市举办&#xff0c;旨在汇聚国内外能源环境科学与农业发展的专家学者、企业家及各界精英&#xff0c;共同探讨能源资源的高效利用、环境保护的科技创新以及农业可持续发…

MongoDB(七) - MongoDB副本集安装与配置

文章目录 前言一、下载MongoDB1. 下载MongoDB2. 上传安装包3. 创建相关目录 二、安装配置MongoDB1. 解压MongoDB安装包2. 重命名MongoDB文件夹名称3. 修改配置文件4. 分发MongoDB文件夹5. 配置环境变量6. 启动副本集7. 进入MongoDB客户端8. 初始化副本集8.1 初始化副本集8.2 添…

未来楼宇自控系统升级优化,为绿色建筑发展注入更强动力支撑

在全球积极应对气候变化、大力推进节能减排的时代背景下&#xff0c;建筑行业作为能源消耗和碳排放的重点领域&#xff0c;其绿色转型迫在眉睫。绿色建筑旨在减少对环境的负面影响&#xff0c;实现资源高效利用&#xff0c;而楼宇自控系统作为建筑智能化的核心组成部分&#xf…

【SQL Server Management Studio 连接时遇到的一个错误】

第一次用SQL Server Management Studio启动之后第一步就是要建立连接 但是不知道Server Name要填什么&#xff0c;看了网上的教程说是要找到下面这个注册表中对应的实例名称填上去&#xff0c;或者前面加localhost 但是好像都没有用&#xff0c;一直遇到报错如下&#xff1a;…

华为云Flexus+DeepSeek征文 | 初探华为云ModelArts Studio:部署DeepSeek-V3/R1商用服务的详细步骤

华为云FlexusDeepSeek征文 | 初探华为云ModelArts Studio&#xff1a;部署DeepSeek-V3/R1商用服务的详细步骤 前言一、华为云ModelArts Studio平台介绍1.1 ModelArts Studio介绍1.2 ModelArts Studio主要特点1.3 ModelArts Studio使用场景1.4 ModelArts Studio产品架构 二、访问…

【Redis】string 类型

string 一. string 类型介绍二. string 命令set、getmget、msetsetnx、setex、psetexincr、incrby、decr、decrby、incrbyfloatappend、getrange、setrange、strlen 三. string 命令小结四. string 内部编码方式五. string 的应用场景缓存功能计数功能共享会话手机验证码 六. 什…

字体查看器

为了快速找到0不带点、斜杠的等宽字体&#xff0c;我做了个软件&#xff01; sonichy/HTYFontViewer

Java与Python优劣分析及两者联姻收奇功

Python 和 Java 作为两种广泛使用的编程语言&#xff0c;在大多数场景下都能实现相似的功能。但由于语言设计初衷、生态系统以及社区偏好的不同&#xff0c;Python 在某些特定领域确实具有 Java 难以比拟的天然优势。 一、以下是几个典型场景优劣分析 1. 快速原型开发与脚本化…

6.OpenFeign服务接口调用

目录 OpenFeign服务接口调用 一、openFeign简介 二、、OpenFeign 通用步骤 接口注解 流程步骤 1. 建Module 2. 添加POM依赖 3. 编写YML文件 4. 主启动(修改类名为MainOpenFeign80) 5.OpenFeign业务类编写 测试&#xff08;远程调用&#xff09; 三、OpenFeign高级特…

新能源汽车电控系统的精准守护者PKDV5355高压差分探头

在新能源汽车的"心脏"——电控系统中&#xff0c;每一次电流的精准切换都关乎车辆的性能与安全。PRBTEK PKDV5355高压差分探头就像一位经验丰富的"汽车医生"&#xff0c;帮助工程师们精准捕捉IGBT模块的每一次"心跳"&#xff0c;确保电驱系统健康…

资产生命周期管理:动态监控 + 精准管理

在数字化高度发展的当下&#xff0c;企业资产的范畴早已突破传统固定资产的局限&#xff0c;网络设备、服务器、软件系统等数字化资产在企业的日常运营与战略布局中扮演着越来越重要的角色。高效的资产管理体系对于优化资源配置、降低运营成本、确保业务不间断运行至关重要。 北…

MonoPCC:用于内窥镜图像单目深度估计的光度不变循环约束|文献速递-深度学习医疗AI最新文献

Title 题目 MonoPCC: Photometric-invariant cycle constraint for monocular depth estimation of endoscopic images MonoPCC&#xff1a;用于内窥镜图像单目深度估计的光度不变循环约束 01 文献速递介绍 单目内窥镜是胃肠诊断和手术的关键医学成像工具&#xff0c;但其…