首页 > 编程语言 >【C#】NPOI 操作 word 文档插入图片

【C#】NPOI 操作 word 文档插入图片

时间:2024-03-14 10:35:22浏览次数:25  
标签:Count par word runs C# ++ NPOI int insertpic

使用NPOI操作,word文档必须为docx格式。
NPOI对文档插入图片的操作实际分为:向段落中插入图片、向表格中插入图片。

添加NPOI包

image

实际操作

文档模板

insertpic为插入图片需要的自定义定位标签
image

//添加引用
using NPOI.XWPF.UserModel;

namespace ConsoleApp_Archive
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string Templatepath = "E:\\Sample.docx";
            string Picpath1 = "E:\\SamplePic1.png";
            string Picpath2 = "E:\\SamplePic2.png";
            string Picpath3 = "E:\\SamplePic3.png";

            using (FileStream stream = File.OpenRead(Templatepath))
            {
                XWPFDocument doc = new XWPFDocument(stream);

                //向第一个表格中插入图片
                XWPFTable table1 = doc.Tables[0];
                FileStream imgstream1 = new FileStream(Picpath1, FileMode.Open, FileAccess.Read);
                //拆分表格,划分为每行每格每段落循环查找
                for (int i = 0; i < table1.Rows.Count; i++)
                {
                    XWPFTableRow tableRow = table1.Rows[i];
                    for (int j = 0; j < tableRow.GetTableCells().Count; j++)
                    {
                        XWPFTableCell tableRowCell = tableRow.GetTableCells()[j];
                        for (int k = 0; k < tableRowCell.Paragraphs.Count; k++)
                        {
                            XWPFParagraph par = tableRowCell.Paragraphs[k];
                            var runs = par.Runs;
                            if (par.ParagraphText.Contains("insertpic"))
                            {
                                for (int l = 0; l < runs.Count; l++)
                                {
                                    if (Convert.ToString(runs[l]) == "insertpic")
                                    {
                                        //插入图片,图片格式参数与图片实际一致,添加文字任意无影响,宽高自定义,需要 * 10000
                                        par.InsertNewRun(l).AddPicture(imgstream1, (int)PictureType.PNG, "img", 100 * 10000, 50 * 10000);
                                        //替换标签文字为空
                                        par.ReplaceText("insertpic", null);
                                    }
                                }
                            }
                        }
                    }
                }

                //向第二个表格中插入图片
                XWPFTable table2 = doc.Tables[1];
                FileStream imgstream2 = new FileStream(Picpath2, FileMode.Open, FileAccess.Read);
                for (int i = 0; i < table2.Rows.Count; i++)
                {
                    XWPFTableRow tableRow = table2.Rows[i];
                    for (int j = 0; j < tableRow.GetTableCells().Count; j++)
                    {
                        XWPFTableCell tableRowCell = tableRow.GetTableCells()[j];
                        for (int k = 0; k < tableRowCell.Paragraphs.Count; k++)
                        {
                            XWPFParagraph par = tableRowCell.Paragraphs[k];
                            var runs = par.Runs;
                            if (par.ParagraphText.Contains("insertpic"))
                            {
                                for (int l = 0; l < runs.Count; l++)
                                {
                                    if (Convert.ToString(runs[l]) == "insertpic")
                                    {
                                        par.InsertNewRun(l).AddPicture(imgstream2, (int)PictureType.PNG, "img", 100 * 10000, 50 * 10000);
                                        par.ReplaceText("insertpic", null);
                                    }
                                }
                            }
                        }
                    }
                }

                //向段落中插入图片
                FileStream imgstream3 = new FileStream(Picpath3, FileMode.Open, FileAccess.Read);
                for (int i = 0; i < doc.Paragraphs.Count; i++)
                {
                    if (doc.Paragraphs[i].ParagraphText.Contains("insertpic"))
                    {
                        XWPFParagraph par = doc.Paragraphs[i];
                        var runs = par.Runs;
                        for (int j = 0; j < runs.Count; j++)
                        {
                            if (Convert.ToString(runs[j]) == "insertpic")
                            {
                                par.InsertNewRun(j).AddPicture(imgstream3, (int)PictureType.PNG, "img", 100 * 10000, 50 * 10000);
                                doc.Paragraphs[i].ReplaceText("insertpic", null);
                            }
                        }
                    }
                }

                FileStream file = new FileStream("E:\\outSample.docx", FileMode.Create, FileAccess.Write);
                doc.Write(file);
                file.Close();
            }

            Console.WriteLine("Hello, World!");
        }
    }
}

运行得到outSample.docx

image

标签:Count,par,word,runs,C#,++,NPOI,int,insertpic
From: https://www.cnblogs.com/Nov-11/p/18072281

相关文章

  • socket 反复连接
       importsocketdefstart_server():#创建一个TCP/IP套接字server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#绑定到地址和端口server_address=('localhost',12345)print(f'Startingupon{se......
  • vscode常用快捷键
    一、vscode的常用快捷键1、注释:a)单行注释:[ctrl+k,ctrl+c]或ctrl+/b)取消单行注释:[ctrl+k,ctrl+u](按下ctrl不放,再按k+u)c)多行注释:[alt+shift+A]d)多行注释:/**2、移动行:alt+up/down3、显示/隐藏左侧目录栏 ctrl+b4、复制当前行:shift+alt......
  • 手把手教你利用 Scrapy 编写一个完整的爬虫
    提到爬虫框架,这里不得不提Scrapy,它是一款非常强大的分布式异步爬虫框架,更加适用于企业级的爬虫!项目地址:https://github.com/scrapy/scrapy本篇文章将借助一个简单实例来聊聊使用Scrapy编写爬虫的完整流程实战目标对象:aHR0cHMlM0EvL2dvLmNxbW1nby5jb20vZm9ydW0tMjMz......
  • 高颜值且好用的自助发卡网站(idatariver.com)
    iDataRiver平台https://idatariver.com/zh-cn可支持商户无门槛入驻,可上架数字商品与API项目,本文介绍其数字商品的上架流程。感兴趣可直接前往官方文档术语解释数字商品数字商品是指可以自动交付的虚拟商品,例如:礼品卡、会员卡、授权/兑换码等等。数据项在实际操作中,......
  • Elasticsearch:调整搜索速度
    在我之前的文章“Elasticsearch:如何提高查询性能”及“Elasticsearch:提升Elasticsearch性能”里,我详细描述了如何提高搜索的性能。在今天的文章里,我从另外一个视角来描述如何调整搜索的速度。希望对大家有所帮助!为文件系统缓存提供内存Elasticsearch严重依赖文件系......
  • Observability:使用 Elastic AI Assistant 和 APM 分析 OpenTelemetry 应用程序
    作者:来自Elastic BahubaliShettiOpenTelemetry正在迅速成为云原生计算基金会(CNCF)内最广泛的项目,拥有与Kubernetes一样多的提交,并获得了客户的广泛支持。许多公司正在采用OpenTelemetry并将其集成到他们的应用程序中。Elastic®提供了有关为应用程序实施OpenT......
  • 有趣的css - 暗黑模式切换开关
    大家好,我是Just,这里是「设计师工作日常」,今天分享的是用css打造一个切换界面暗黑模式的按钮开关,通过点击来切换太阳和月亮的图标。《有趣的css》系列最新实例通过公众号「设计师工作日常」发布。目录整体效果核心代码html代码css部分代码完整代码如下html页面c......
  • C语言项目--**客户信息管理系统
    C语言项目–客户信息管理系统实现一个客户信息管理系统,功能包括添加客户、修改客户、删除客户、显示客户列表。1.1需求说明1.1.1主菜单进入系统,展示主菜单,输入各功能对应的数字编号选择要进行的操作,如下图:1.1.2添加客户输入1,进入“添加客户”界面,需要填写姓名、性......
  • IDEA启动报错 Internal error.Please refer to http://jb.ge/ide/critical-startup-er
    1.问题描述启动IDEA遇到报错Internalerror.Pleaserefertohttp://jb.ge/ide/critical-startup-errors2.问题原因java.net.BindException:地址已在使用中:也就是idea启动时需要占用一些端口,但是已经被其它打开的软件占用了。IDE正在本地主机上启动服务器,它将尝试在6942和......
  • ata1.00: exception Emask 0x0 SAct 0x8000000 SErr 0x0 action 0x6 frozen 硬盘问题
    测试发现嵌入式linuxvfat文件系统的sata固态硬盘偶然启动时出现异常打印如下:ata1.00:exceptionEmask0x0SAct0x8000000SErr0x0action0x6frozenata1.00:failedcommand:READFPDMAQUEUEData1.00:cmd60/08:d8:00:00:00/00:00:00:00:00/40tag27ncq4096in......