NPOI生成word浮动图标

2024-05-12 08:28
文章标签 生成 浮动 图标 word npoi

本文主要是介绍NPOI生成word浮动图标,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、NPOI版本2.7.0, net框架4.8

2、安装OpenXMLSDKToolV25.msi

3、先创建一个word文档,并设置图片为浮于文字之上

4、OpenXML显示的结果

5、实际代码如下:

public class GenerateWordDemo
{public GenerateWordDemo(){}//https://blog.fileformat.com/zh/word-processing/npoi-api-for-processing-word-documents-in-net-an-overview///https://blog.csdn.net/sD7O95O/article/details/114108985//https://blog.csdn.net/qq_38544249/article/details/124923848private void SetPage(XWPFDocument doc){// 设置页面的大小CT_SectPr m_SectPr = new CT_SectPr();       //实例一个尺寸类的实例m_SectPr.pgSz.w = 11906;        //设置宽度(这里是一个ulong类型)m_SectPr.pgSz.h = 16838;        //设置高度(这里是一个ulong类型)                    //页面边距m_SectPr.pgMar.left = (ulong)80;//左边距m_SectPr.pgMar.right = (ulong)80;//右边距m_SectPr.pgMar.top = 80;//上边距m_SectPr.pgMar.bottom = 80;//下边距doc.Document.body.sectPr = m_SectPr;          //设置页面的尺寸}/// <summary>/// 加入内联二维码/// </summary>/// <param name="doc"></param>/// <param name="paragraphy"></param>private void AddInlineBarCode(XWPFDocument doc, XWPFParagraph paragraphy){string appPath = System.AppDomain.CurrentDomain.BaseDirectory;string imagePath = System.IO.Path.Combine(appPath, "Images");string imageFile = System.IO.Path.Combine(imagePath, "BarCode.jpg");// 二维码            XWPFRun run = paragraphy.CreateRun();using (FileStream picFile = new FileStream(imageFile, FileMode.Open, FileAccess.Read)){XWPFPicture pic = run.AddPicture(picFile, (int)PictureType.PNG, "barcode.png", 100 * 10857, 100 * 12857);}}private T LoadWordCT<T>(string xml, Func<XmlElement, T> act) where T : class{XmlDocument xmlDoc = new XmlDocument();try{xmlDoc.LoadXml(xml);var element = xmlDoc.DocumentElement;return act(element);                }catch (XmlException xe){return null;}}/// <summary>/// 加入二维码/// </summary>/// <param name="doc"></param>private void AddBarCode(XWPFDocument doc, XWPFParagraph paragraphy){String relationId;XWPFPictureData picData;string appPath = System.AppDomain.CurrentDomain.BaseDirectory;string imagePath = System.IO.Path.Combine(appPath, "Images");string imageFile = System.IO.Path.Combine(imagePath, "BarCode.jpg");using (FileStream picFile = new FileStream(imageFile, FileMode.Open, FileAccess.Read)){relationId = doc.AddPictureData(picFile, (int)PictureType.PNG);picData = (XWPFPictureData)doc.GetRelationById(relationId);}XWPFRun run = paragraphy.CreateRun();CT_RPr rpr = new CT_RPr();rpr.AddNewNoProof();run.GetCTR().rPr = rpr;CT_Drawing drawing = run.GetCTR().AddNewDrawing();drawing.anchor = new List<CT_Anchor>();CT_Anchor an = new CT_Anchor();            //图片距正文上(distT)、下(distB)、左(distL)、右(distR)的距离。114300EMUS=3.1mman.distT = 0;an.distB = 0;an.distL = (uint)114300;an.distR = (uint)114300;an.relativeHeight = 251658240u;an.behindDoc = false; //"0",图与文字的上下关系an.locked = false;  //"0"an.layoutInCell = true;  //"1"an.allowOverlap = true;  //"1" an.simplePos1 = false;an.simplePos1Specified = false;//CT_Point2D simplePos = new CT_Point2D();//simplePos.x = (long)0;//simplePos.y = (long)0;//an.simplePos = simplePos;// https://www.cnblogs.com/zhangliming/archive/2013/04/02/2995655.htmlstring xml = "<wp:simplePos x=\"0\" y=\"0\" xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" />";an.simplePos = LoadWordCT<CT_Point2D>(xml, x => CT_Point2D.Parse(x, null));//图左上角坐标CT_PosH posH = new CT_PosH();posH.relativeFrom = ST_RelFromH.column;posH.posOffset = -1292;   //单位:EMUS,1CM=360000EMUSan.positionH = posH;CT_PosV posV = new CT_PosV();posV.relativeFrom = ST_RelFromV.paragraph;posV.posOffset = 51661;an.positionV = posV;an.extent = new NPOI.OpenXmlFormats.Dml.WordProcessing.CT_PositiveSize2D();an.extent.cx = 1085700;an.extent.cy = 1285700;CT_EffectExtent effectExtent = new CT_EffectExtent();effectExtent.b = 0L;effectExtent.l = 0L;effectExtent.r = 0L;effectExtent.t = 0L;an.effectExtent = effectExtent;an.wrapNone = new CT_WrapNone();an.docPr = new NPOI.OpenXmlFormats.Dml.WordProcessing.CT_NonVisualDrawingProps();long id = run.Document.GetNextPicNameNumber((int)PictureType.PNG);an.docPr.id = (uint)(id);an.docPr.name = ("Drawing " + id);an.docPr.descr = "barcode.png";an.cNvGraphicFramePr = new NPOI.OpenXmlFormats.Dml.WordProcessing.CT_NonVisualGraphicFrameProperties();an.graphic = new CT_GraphicalObject();CT_GraphicalObjectData gd = new CT_GraphicalObjectData();gd.uri = "http://schemas.openxmlformats.org/drawingml/2006/picture";an.graphic.graphicData = gd;// Grab the picture objectNPOI.OpenXmlFormats.Dml.Picture.CT_Picture pic = new NPOI.OpenXmlFormats.Dml.Picture.CT_Picture();// Set it upNPOI.OpenXmlFormats.Dml.Picture.CT_PictureNonVisual nvPicPr = pic.AddNewNvPicPr();NPOI.OpenXmlFormats.Dml.CT_NonVisualDrawingProps cNvPr = nvPicPr.AddNewCNvPr();/* use "0" for the id. See ECM-576, 20.2.2.3 */cNvPr.id = (0);/* This name is not visible in Word 2010 anywhere */cNvPr.name = ("Picture " + id);cNvPr.descr = "barcode.png";CT_NonVisualPictureProperties cNvPicPr = nvPicPr.AddNewCNvPicPr();cNvPicPr.AddNewPicLocks().noChangeAspect = true;CT_BlipFillProperties blipFill = pic.AddNewBlipFill();CT_Blip blip = blipFill.AddNewBlip();blip.embed = run.Paragraph.Part.GetRelationId(picData);blipFill.AddNewStretch().AddNewFillRect();CT_ShapeProperties spPr = pic.AddNewSpPr();CT_Transform2D xfrm = spPr.AddNewXfrm();CT_Point2D off = xfrm.AddNewOff();off.x = (0);off.y = (0);NPOI.OpenXmlFormats.Dml.CT_PositiveSize2D ext = xfrm.AddNewExt();ext.cx = 100;ext.cy = 100;CT_PresetGeometry2D prstGeom = spPr.AddNewPrstGeom();prstGeom.prst = (ST_ShapeType.rect);prstGeom.AddNewAvLst();using (var ms = RecyclableMemory.GetStream()){StreamWriter sw = new StreamWriter(ms);pic.Write(sw, "pic:pic");sw.Flush();ms.Position = 0;var sr = new StreamReader(ms);var picXml = sr.ReadToEnd();gd.AddPicElement(picXml);}drawing.anchor.Add(an);}private XWPFParagraph AddParagraph(XWPFDocument doc){XWPFParagraph paragraphy = doc.CreateParagraph();CT_PPr ppr = new CT_PPr();CT_Spacing sp = ppr.AddNewSpacing();// w:spacing w:after="20" w:line="430" w:lineRule="auto" sp.after = 20;sp.line = "430";sp.lineRule = ST_LineSpacingRule.auto;CT_Ind ind = ppr.AddNewInd();ind.right = "10";CT_Jc jc = ppr.AddNewJc();// 左对齐jc.val = ST_Jc.left;CT_ParaRPr rpr = ppr.AddNewRPr();rpr.rFonts = new CT_Fonts();rpr.rFonts.ascii = "宋体";rpr.rFonts.hAnsi = "宋体";rpr.rFonts.eastAsia = "宋体";rpr.rFonts.cs = "宋体";rpr.b = new CT_OnOff();rpr.b.val = true;rpr.sz = new CT_HpsMeasure();rpr.sz.val = 32;paragraphy.GetCTP().pPr = ppr;return paragraphy;}private XWPFParagraph AddTextParagraph(XWPFDocument doc){XWPFParagraph paragraphy = doc.CreateParagraph();CT_PPr ppr = new CT_PPr();CT_Spacing sp = ppr.AddNewSpacing();sp.lineRule = ST_LineSpacingRule.auto;CT_Ind ind = ppr.AddNewInd();CT_Jc jc = ppr.AddNewJc();jc.val = ST_Jc.right;CT_ParaRPr rpr = ppr.AddNewRPr();rpr.rFonts = new CT_Fonts();rpr.rFonts.ascii = "宋体";rpr.rFonts.hAnsi = "宋体";rpr.rFonts.eastAsia = "宋体";rpr.rFonts.cs = "宋体";rpr.b = new CT_OnOff();rpr.b.val = true;rpr.sz = new CT_HpsMeasure();rpr.sz.val = 32;paragraphy.GetCTP().pPr = ppr;return paragraphy;}private XWPFRun AddTextRun(XWPFParagraph paragraphy, string text, ulong fontSize){XWPFRun run = paragraphy.CreateRun();run.IsBold = true;CT_RPr rpr = new CT_RPr();CT_Fonts ft = rpr.AddNewRFonts();ft.ascii = "宋体";ft.hAnsi = "宋体";ft.eastAsia = "宋体";ft.cs = "宋体";rpr.AddNewB();CT_HpsMeasure sz = rpr.AddNewSz();sz.val = fontSize;run.GetCTR().rPr = rpr;run.SetText(text);return run;}public bool CreateWordReport(string wordFile){try{string appPath = System.AppDomain.CurrentDomain.BaseDirectory;              string checkTime = DateTime.Now.ToString("yyyy年MM月dd日");//检查时间//TODO:使用FileStream文件流来写入数据(传入参数为:文件所在路径,对文件的操作方式,对文件内数据的操作)//通过使用文件流,创建文件流对象,向文件流中写入内容,并保存为Word文档格式using (var stream = new FileStream(wordFile, FileMode.Create, FileAccess.Write)){//创建document文档对象对象实例XWPFDocument doc = new XWPFDocument();XWPFParagraph paragraphy = AddParagraph(doc);AddBarCode(doc, paragraphy);paragraphy = AddTextParagraph(doc);AddTextRun(paragraphy, "TEST1", 32);paragraphy = AddTextParagraph(doc);AddTextRun(paragraphy, "TEST2", 32);paragraphy = AddTextParagraph(doc);AddTextRun(paragraphy, "TEST3", 32);//向文档流中写入内容,生成worddoc.Write(stream);return true;}}catch (Exception ex){return false;}}
}

这篇关于NPOI生成word浮动图标的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/982102

相关文章

springboot集成easypoi导出word换行处理过程

《springboot集成easypoi导出word换行处理过程》SpringBoot集成Easypoi导出Word时,换行符n失效显示为空格,解决方法包括生成段落或替换模板中n为回车,同时需确... 目录项目场景问题描述解决方案第一种:生成段落的方式第二种:替换模板的情况,换行符替换成回车总结项目场景s

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

使用Python实现Word文档的自动化对比方案

《使用Python实现Word文档的自动化对比方案》我们经常需要比较两个Word文档的版本差异,无论是合同修订、论文修改还是代码文档更新,人工比对不仅效率低下,还容易遗漏关键改动,下面通过一个实际案例... 目录引言一、使用python-docx库解析文档结构二、使用difflib进行差异比对三、高级对比方

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

C#高效实现Word文档内容查找与替换的6种方法

《C#高效实现Word文档内容查找与替换的6种方法》在日常文档处理工作中,尤其是面对大型Word文档时,手动查找、替换文本往往既耗时又容易出错,本文整理了C#查找与替换Word内容的6种方法,大家可以... 目录环境准备方法一:查找文本并替换为新文本方法二:使用正则表达式查找并替换文本方法三:将文本替换为图

C#使用Spire.XLS快速生成多表格Excel文件

《C#使用Spire.XLS快速生成多表格Excel文件》在日常开发中,我们经常需要将业务数据导出为结构清晰的Excel文件,本文将手把手教你使用Spire.XLS这个强大的.NET组件,只需几行C#... 目录一、Spire.XLS核心优势清单1.1 性能碾压:从3秒到0.5秒的质变1.2 批量操作的优雅

Java高效实现Word转PDF的完整指南

《Java高效实现Word转PDF的完整指南》这篇文章主要为大家详细介绍了如何用Spire.DocforJava库实现Word到PDF文档的快速转换,并解析其转换选项的灵活配置技巧,希望对大家有所帮助... 目录方法一:三步实现核心功能方法二:高级选项配置性能优化建议方法补充ASPose 实现方案Libre

Python使用python-pptx自动化操作和生成PPT

《Python使用python-pptx自动化操作和生成PPT》这篇文章主要为大家详细介绍了如何使用python-pptx库实现PPT自动化,并提供实用的代码示例和应用场景,感兴趣的小伙伴可以跟随小编... 目录使用python-pptx操作PPT文档安装python-pptx基础概念创建新的PPT文档查看