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

相关文章

Python实现word文档内容智能提取以及合成

《Python实现word文档内容智能提取以及合成》这篇文章主要为大家详细介绍了如何使用Python实现从10个左右的docx文档中抽取内容,再调整语言风格后生成新的文档,感兴趣的小伙伴可以了解一下... 目录核心思路技术路径实现步骤阶段一:准备工作阶段二:内容提取 (python 脚本)阶段三:语言风格调

IDEA自动生成注释模板的配置教程

《IDEA自动生成注释模板的配置教程》本文介绍了如何在IntelliJIDEA中配置类和方法的注释模板,包括自动生成项目名称、包名、日期和时间等内容,以及如何定制参数和返回值的注释格式,需要的朋友可以... 目录项目场景配置方法类注释模板定义类开头的注释步骤类注释效果方法注释模板定义方法开头的注释步骤方法注

Python如何自动生成环境依赖包requirements

《Python如何自动生成环境依赖包requirements》:本文主要介绍Python如何自动生成环境依赖包requirements问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录生成当前 python 环境 安装的所有依赖包1、命令2、常见问题只生成当前 项目 的所有依赖包1、

MySQL中动态生成SQL语句去掉所有字段的空格的操作方法

《MySQL中动态生成SQL语句去掉所有字段的空格的操作方法》在数据库管理过程中,我们常常会遇到需要对表中字段进行清洗和整理的情况,本文将详细介绍如何在MySQL中动态生成SQL语句来去掉所有字段的空... 目录在mysql中动态生成SQL语句去掉所有字段的空格准备工作原理分析动态生成SQL语句在MySQL

Java利用docx4j+Freemarker生成word文档

《Java利用docx4j+Freemarker生成word文档》这篇文章主要为大家详细介绍了Java如何利用docx4j+Freemarker生成word文档,文中的示例代码讲解详细,感兴趣的小伙伴... 目录技术方案maven依赖创建模板文件实现代码技术方案Java 1.8 + docx4j + Fr

vue使用docxtemplater导出word

《vue使用docxtemplater导出word》docxtemplater是一种邮件合并工具,以编程方式使用并处理条件、循环,并且可以扩展以插入任何内容,下面我们来看看如何使用docxtempl... 目录docxtemplatervue使用docxtemplater导出word安装常用语法 封装导出方

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

macOS无效Launchpad图标轻松删除的4 种实用方法

《macOS无效Launchpad图标轻松删除的4种实用方法》mac中不在appstore上下载的应用经常在删除后它的图标还残留在launchpad中,并且长按图标也不会出现删除符号,下面解决这个问... 在 MACOS 上,Launchpad(也就是「启动台」)是一个便捷的 App 启动工具。但有时候,应

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为