首页 > 其他分享 >.NET 8 使用官方OpenXml SDK,替换Word中的文字和图片

.NET 8 使用官方OpenXml SDK,替换Word中的文字和图片

时间:2024-05-22 15:52:18浏览次数:19  
标签:MainDocumentPart Word string request using new NET OpenXml

安装好DocumentFormat.OpenXml后,准备好一个docx文件

using DocumentFormat.OpenXml.Drawing.Wordprocessing;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using System.Text.RegularExpressions;
using A = DocumentFormat.OpenXml.Drawing;

namespace Test02
{
    internal class Program
    {
        static void Main(string[] args)
        {
            ReplaceTextRequest textRequest = new ReplaceTextRequest
            {
                FileFullPath = "D:\\test-app\\test.docx",
                TextPlaceholderName = "占位符",
                Text = "恐怖如斯丶吴彦祖"
            };
            ReplaceText(textRequest);

            var imageRequest = new ReplaceImageRequest
            {
                FileFullPath = "D:\\test-app\\test.docx",
                ImagePlaceholderName = "Picture 1",
                ImageFullPath = "C:\\Users\\xudashan\\Pictures\\高达\\1.png"
            };
            ReplaceImage(imageRequest);

            Console.WriteLine("OK");
        }

        static void ReplaceText(ReplaceTextRequest request)
        {
            using WordprocessingDocument wordDoc = WordprocessingDocument.Open(request.FileFullPath, true);

            if (wordDoc.MainDocumentPart == null)
            {
                throw new Exception("文档为空");
            }

            string docText = string.Empty;
            using (StreamReader sr = new StreamReader(wordDoc.MainDocumentPart.GetStream()))
            {
                docText = sr.ReadToEnd();
            }

            Regex regexText = new Regex(request.TextPlaceholderName);
            docText = regexText.Replace(docText, request.Text);

            using (StreamWriter sw = new StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create)))
            {
                sw.WriteLine(docText);
            }
        }

        static void ReplaceImage(ReplaceImageRequest request)
        {
            using WordprocessingDocument document = WordprocessingDocument.Open(request.FileFullPath, true);

            if (document.MainDocumentPart == null)
            {
                throw new Exception("文档为空");
            }

            IEnumerable<Inline> imageElements = from run in document.MainDocumentPart.Document.Descendants<Run>()
                                                where run.Descendants<Inline>().First() != null
                                                select run.Descendants<Inline>().First();

            Inline selectedImage = (from image in imageElements
                                    where (image.DocProperties != null &&
                                           image.DocProperties.Name == request.ImagePlaceholderName)
                                    select image).First();

            A.Blip blipElement = selectedImage.Descendants<A.Blip>().First();
            if (blipElement.Embed == null || blipElement.Embed.Value == null)
            {
                throw new Exception("错误的模板标签");
            }
            var imageId = blipElement.Embed.Value;

            ImagePart imagePart = (ImagePart)document.MainDocumentPart.GetPartById(imageId);
            byte[] imageBytes = File.ReadAllBytes(request.ImageFullPath);

            using BinaryWriter writer = new BinaryWriter(imagePart.GetStream());
            writer.Write(imageBytes);
        }
    }

    class ReplaceImageRequest
    {
        /// <summary>
        /// docx 文件地址
        /// </summary>
        public string FileFullPath { get; set; }

        /// <summary>
        /// 图片占位的Name
        /// </summary>
        public string ImagePlaceholderName { get; set; }

        /// <summary>
        /// 待替换的图片文件
        /// </summary>
        public string ImageFullPath { get; set; }
    }

    class ReplaceTextRequest
    {
        /// <summary>
        /// docx 文件地址
        /// </summary>
        public string FileFullPath { get; set; }

        /// <summary>
        /// 文字占位的Name
        /// </summary>
        public string TextPlaceholderName { get; set; }

        /// <summary>
        /// 待替换的文字
        /// </summary>
        public string Text { get; set; }
    }
}

替换后

ps: 高达原图

标签:MainDocumentPart,Word,string,request,using,new,NET,OpenXml
From: https://www.cnblogs.com/xuxuzhaozhao/p/18206436

相关文章

  • ASP.NET Web应用程序创建的webservice接口如何在postman里测试调用
    ASMX中的方法 启动项目浏览器展示的页面如下 点击ReceiveOrder,展示该方法的请求和响应示例 在postman中输入以下信息 选择raw--xml,粘贴浏览器中的SOAP1.1或者SOAP1.2中的请求示例 点击Send按钮发生请求 SOAP1.1以下是SOAP1.1请求和响应示例。所显示的占位......
  • Netty ChannelHandler的生命周期
    ChannelHandler方法的执行是有顺序的,而这个执行顺序可以被称为ChannelHandler的生命周期。 LifeCyCleTestHandlerimportio.netty.channel.ChannelInboundHandlerAdapter;importio.netty.channel.ChannelHandlerContext;publicclassLifeCyCleTestHandlerextendsChan......
  • Asp-Net-Core开发笔记:使用原生的接口限流功能
    前言之前介绍过使用AspNetCoreRateLimit组件来实现接口限流从.Net7开始,AspNetCore开始内置限流组件,当时我们的项目还在.Net6所以只能用第三方的现在都升级到.Net8了,当然是得来试试这个原生组件体验后:配置使用都比较简单,不过功能也没有AspNetCoreRateLimit那么灵活......
  • 使用poi向word中插入文字或图片
    参考自https://blog.csdn.net/weixin_50638065/article/details/133958393依赖包最下面的两个包肯定需要的,其他的有几个不需要的,自己试着删一下,用不了这么多<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.2</v......
  • word替换快捷操作
    Sub替换词语()DimdocAsDocumentDimfindTextAsStringDimreplaceTextAsString'设置第一个要查找和替换的文本findText="机构管理"replaceText="部门管理"'获取当前活动文档Setdoc=ActiveDocument'开始第一个查找和替换......
  • .net webapi 处理前端请求跨域问题
    1.打开 Program.cs文件,在 varapp=builder.Build();语句前添加如下代码builder.Services.AddCors(o=>o.AddPolicy("any",p=>p.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod()));2.在varapp=builder.Build();语句后添加 app.UseCors();app.UseCors();......
  • ​一款开源的.NET程序集反编译、编辑和调试神器----dnSpyEx
    思维导航前言dnSpyEx主要功能工具源代码工具下载安装运行创建测试项目并编译成dll程序集使用工具调试程序集中的代码使用工具编辑程序集中的代码使用工具编辑程序集中的IL指令项目源码地址优秀项目和框架精选DotNetGuide技术社区交流群前言说到.NET相关的反编......
  • Netty 客户端与服务端收发消息demo
    客户端与服务端收发消息,要实现的具体功能是:在控制台输入一条消息之后按回车键,校验完客户端的登录状态之后,把消息发送到服务端;服务端收到消息之后打印,并向客户端发送一条消息,客户端收到消息之后打印。 客户端NettyClientimportcom.xc.xcspringboot.x_netty.client.handler.*;......
  • 在VB.NET项目中使用C#编写的代码
    前言VB.NET,全名VisualBasic.NET,是Microsoft.NET框架的一部分,是一种面向对象的编程语言。它继承了VisualBasic的易用性,同时增加了对面向对象编程的支持。VB.NET提供了大量的内置函数,使得开发者可以更容易地处理字符串、数学计算、文件和目录访问等任务。它还提供了对WindowsF......
  • EDP .Net开发框架--自动化日志
    平台下载地址:https://gitee.com/alwaysinsist/edp自动化日志不需要额外调用日志相关功能即可无感实现程序集方法调用的日志记录。创建业务逻辑处理类publicclassStudentBLL:BusinessLogicBase<StudentBLL>继承基类BusinessLogicBase<T>定义业务逻辑方法点击查看代......