C# 导出word 插入公式问题

news2025/6/2 6:16:39

最近遇到了一个问题,下载一个文档时需要下载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();
  
            //添加一个section
            Section 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.coloradmin.cn/o/2393566.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mac安装配置InfluxDB,InfluxDB快速入门,Java集成InfluxDB

1. 与MySQL的比较 InfluxDBMySQL解释BucketDatabase数据库MeasurementTable表TagIndexed Column索引列FieldColumn普通列PointRow每行数据 2. 安装FluxDB brew update默认安装 2.x的版本 brew install influxdb查看influxdb版本 influxd version # InfluxDB 2.7.11 (git: …

手撕Java+硅基流动实现MCP服务器教程

手撕Java硅基流动实现MCP服务器教程 一、MCP协议核心概念 MCP是什么 MCP 是 Anthropic (Claude) 主导发布的一个开放的、通用的、有共识的协议标准。 ● MCP 是一个标准协议&#xff0c;就像给 AI 大模型装了一个 “万能接口”&#xff0c;让 AI 模型能够与不同的数据源和工…

EasyRTC嵌入式音视频通信SDK助力1v1实时音视频通话全场景应用

一、方案概述​ 在数字化通信需求日益增长的今天&#xff0c;EasyRTC作为一款全平台互通的实时视频通话方案&#xff0c;实现了设备与平台间的跨端连接。它支持微信小程序、APP、PC客户端等多端协同&#xff0c;开发者通过该方案可快速搭建1v1实时音视频通信系统&#xff0c;适…

Prometheus学习之pushgateway和altermanager组件

[rootnode-exporter41 /usr/local/alertmanager-0.28.1.linux-amd64]# pwd /usr/local/alertmanager-0.28.1.linux-amd64[rootnode-exporter41 /usr/local/alertmanager-0.28.1.linux-amd64]# cat alertmanager.yml # 通用配置 global:resolve_timeout: 5msmtp_from: 914XXXXX…

01 redis 的环境搭建

前言 这一系列文章主要包含的内容主要是 各种常用软件的调试环境的搭建 主要的目的是 搭建一个可打断点的一个调试环境 c 系列 主要是基于 clion 调试, java 系列主要是基于 idea 调试, js 系列主要是基于 webstorm 调试 需要有一定的 c, c, java, js 相关基础 基于的…

《操作系统真相还原》——加载器

显存 将上一章的中断输出&#xff0c;变为显存输出 加载器 使用mbr引导程序从磁盘中加载loader程序。 MBR %include "boot.inc" SECTION MBR vstart0x7c00 mov ax,cs mov ds,axmov es,axmov ss,axmov fs,axmov sp,0x7c00mov ax,0xb800mov gs,ax;cl…

HJ25 数据分类处理【牛客网】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码 零、原题链接 HJ25 数据分类处理 一、题目描述 二、测试用例 三、解题思路 基本思路&#xff1a;   首先理解题目&#xff0c;题目要求对规则集先进行排序&#xff0c;然后去重&#xff0c;这一步我…

FART 自动化脱壳框架一些 bug 修复记录

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ open() 判断不严谨 https://github.com/CYRUS-STUDIO/FART/blob/master/fart10/art/runtime/art_method.cc 比如&#xff1a; int dexfilefp open(dex_pat…

基于Flask实现豆瓣Top250电影可视化

项目截图 概述 该项目旨在对豆瓣Top 250电影进行全面的数据分析&#xff0c;使用了Python爬虫、Flask框架进行开发&#xff0c;并采用了Echarts进行数据可视化以及WordCloud进行词云分析。应用展示了多个功能&#xff0c;如电影列表、评分分布、词频统计和团队信息。 主要功能…

More SQL(Focus Subqueries、Join)

目录 Subqueries Subqueries That Return One Tuple Subqueries and Self Connection The IN Operator The Exists Operator The Operator ANY The Operator ALL Union, Intersection, and Difference&#xff08;交并差&#xff09; Bag Semantics Controlling Dupl…

从图像处理到深度学习:直播美颜SDK的人脸美型算法详解

在直播的镜头前&#xff0c;每一位主播都希望自己“光彩照人”。但在高清摄像头无死角的审视下&#xff0c;哪怕是天生丽质&#xff0c;也难免需要一点技术加持。于是&#xff0c;美颜SDK应运而生&#xff0c;成为直播平台提升用户粘性和视觉体验的重要工具。 尤其是在“人脸美…

zTasker一款Windows自动化软件,提升效率:大小仅有10MB,免费无广告

一、zTasker是什么&#xff1f; zTasker是一款发布于2023年9月的免费无广告工具&#xff0c;专为Windows用户打造。它以仅8MB的轻量体积、极低资源占用&#xff08;内存消耗不足10MB&#xff09;和秒级启动速度脱颖而出&#xff0c;堪称“任务计划程序的终极强化版”。无论是定…

最大流-Ford-Fulkerson增广路径算法py/cpp/Java三语言实现

最大流-Ford-Fulkerson增广路径算法py/cpp/Java三语言实现 一、网络流问题与相关概念1.1 网络流问题定义1.2 关键概念 二、Ford-Fulkerson算法原理2.1 核心思想2.2 算法步骤 三、Ford-Fulkerson算法的代码实现3.1 Python实现3.2 C实现3.3 Java实现 四、Ford-Fulkerson算法的时间…

【测试】Bug和用例

软件测试贯穿于软件的整个⽣命周期 软件测试的⽣命周期是指测试流程&#xff0c;这个流程是按照⼀定顺序执⾏的⼀系列特定的步骤&#xff0c;去保证产品质量符合需求。在软件测试⽣命周期流程中&#xff0c;每个活动都按照计划的系统的执⾏。每个阶段有不同的⽬标和交付产物 Bu…

鸿蒙OS的5.0.1.120版本体验怎么样?

点击上方关注 “终端研发部” 设为“星标”&#xff0c;和你一起掌握更多数据库知识 越来越是好用了&#xff0c;之前是凑合能用&#xff0c;现在是大多能用。 我朋友的mate30PRO和PuraX一起用&#xff0c;新系统确实满足我90%以上的需求 一个系统适配一款机型&#xff0c;是要…

使用ssh-audit扫描ssh过期加密算法配置

使用ssh-audit扫描ssh过期加密算法配置 安装检查ssh的加密算法配置修改ssh的加密算法配置 安装 # pip3安装ssh-audit pip3 instal ssh-audit检查ssh的加密算法配置 # 检查ssh的配置 ssh-audit 192.168.50.149修改ssh的加密算法配置 # 查看ssh加密配置文件是否存在 ls /etc/c…

Java+Playwright自动化-2-环境准备与搭建-基于Maven

1.简介 上一章中已经讲如何通过引入jar包来搭建JavaPlaywright自动化测试环境&#xff0c;这一种是比较老的方法&#xff0c;说白了就是过时的老古董&#xff0c;但是我们必须了解和知道&#xff0c;其实maven搭建无非也就是下载引入相关的jar包&#xff0c;只不过相比之下是简…

由sigmod权重曲线存在锯齿的探索

深度学习的知识点&#xff0c;一般按照执行流程&#xff0c;有 网络层类型&#xff0c;归一化&#xff0c;激活函数&#xff0c;学习率&#xff0c;损失函数&#xff0c;优化器。如果是研究生上课学的应该系统一点&#xff0c;自学的话知识点一开始有点乱。 一、激活函数Sigmod…

二、OpenCV图像处理-图像处理

目录 1、连通性 2、形态学操作 2.1腐蚀和膨胀 2.2开闭运算 2.3礼帽和黑帽 2.4总结 3、图像平滑 3.1图像噪声 3.2均值滤波 3.3高斯滤波 3.4中值滤波 3.5总结 4、直方图 4.1直方图的原理与显示 4.2掩膜的应用 4.3直方图均衡化 4.4自适应均衡化 4.5总结 5、边缘…

UPS的工作原理和UPS系统中旁路的作用

UPS&#xff08;不间断电源&#xff09;根据工作原理和适用场景的不同&#xff0c;主要分为以下三种类型&#xff0c;每种类型的特点和适用场景如下&#xff1a; 1. 后备式UPS&#xff08;Offline/Standby UPS&#xff09; 工作原理&#xff1a; 正常供电时&#xff0c;负载直接…