Npoi XWPF Word 导出时插入图片无法显示 bug 完美解决
一、来自客户的需求
最近客户来个新需求生成一个word 标签纸,并且需要在标签纸上插入一个logo,并且将erp 中的数据取出来自动写在文档上,不由得淡淡一笑,这不难呀!
于是乎我就写下了这样的代码:
插入文字段落
XWPFParagraph m_xp = doc.CreateParagraph();
LableInfo lable = lableInfos[i];
XWPFRun xwpfRun = m_xp.CreateRun();//创建段落文本对象
xwpfRun.SetTextPosition(-10);
xwpfRun.FontSize = 15;//字体大小
xwpfRun.IsBold = false;//是否加粗
xwpfRun.SetFontFamily("黑体", FontCharRange.None);//设置字体(如:微软雅黑,华文楷体,宋体)
xwpfRun.AppendText("产品名称:");
插入图片
XWPFParagraph gp = doc.CreateParagraph();
FileStream gfs = new FileStream(@"..\..\logo.png", FileMode.Open, FileAccess.Read);
gp.SpacingAfterLines = -1;
XWPFRun gr = gp.CreateRun();
gr.AddPicture(gfs, (int)PictureType.PNG, "image1.png", 2009000, 400000);
gfs.Close();
是不是很轻松就搞定了。
没想到弹出这么个框框,眼前一黑啊!!!!!

二、解决Npio 插入图片报错问题
1、找出问题
用WinRAR打开,对比下正常情况下的数据和报错那个文件的数据有什么不同

找到document.xml 文件,对比下两个文件的差异
错误的文件

正确的文件

2、解决问题
对比发现用代码插入的图片xml 文件和手动操作word插入图片的xml 并非一样,因此我们需要更换下xml就可以解决问题了。
上代码:
public static void CreatePicture(XWPFRun run, string id, int width , int height )
{
try
{
int EMU = 9525;
width *= EMU;
height *= EMU;
CT_Inline inline = run.GetCTR().AddNewDrawing().AddNewInline();
inline.distT = inline.distB = inline.distL = inline.distR = 0;
inline.graphic = new NPOI.OpenXmlFormats.Dml.CT_GraphicalObject(); NPOI.OpenXmlFormats.Dml.CT_GraphicalObjectData graphicData = inline.graphic.AddNewGraphicData();
graphicData.uri = "http://schemas.openxmlformats.org/drawingml/2006/picture"; string picXmlstr = "";
using (StreamReader sr = new StreamReader(@"C:\001.txt", Encoding.UTF8))
{
picXmlstr = sr.ReadToEnd();
} graphicData.AddPicElement(picXmlstr); CT_PositiveSize2D extent = inline.AddNewExtent(); extent.cx = width;
extent.cy = height;
CT_EffectExtent effectExtent = new CT_EffectExtent();
effectExtent.l =(long)19050;
effectExtent.t = effectExtent.r = effectExtent.b = 0;
inline.effectExtent = effectExtent; CT_NonVisualDrawingProps docPr = inline.AddNewDocPr();
docPr.id = 6;
docPr.name = "图片" + id;
docPr.descr = "logo.png"; CT_NonVisualGraphicFrameProperties cT_Non = new CT_NonVisualGraphicFrameProperties();
NPOI.OpenXmlFormats.Dml.CT_GraphicalObjectFrameLocking cT_Graphical =new NPOI.OpenXmlFormats.Dml.CT_GraphicalObjectFrameLocking();
cT_Graphical.noChangeAspect = true;
cT_Non.graphicFrameLocks = cT_Graphical;
inline.cNvGraphicFramePr = cT_Non;
}
catch (Exception ex)
{ }
}
picXmlstr 是一个xml 文件
<pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">
<pic:nvPicPr>
<pic:cNvPr id="0" name="logo.png" />
<pic:cNvPicPr />
</pic:nvPicPr>
<pic:blipFill>
<a:blip r:embed="rId4" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" />
<a:stretch xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
<a:fillRect />
</a:stretch>
</pic:blipFill>
<pic:spPr>
<a:xfrm xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
<a:off x="0" y="0" />
<a:ext cx="1505160" cy="476317" />
</a:xfrm>
<a:prstGeom prst="rect" xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
<a:avLst />
</a:prstGeom>
</pic:spPr>
</pic:pic>
调用代码入下:
XWPFParagraph wPFParagraph = doc.CreateParagraph();
FileStream gfs = new FileStream(@"..\..\logo.png", FileMode.Open, FileAccess.Read);
var picID = doc.AddPictureData(gfs, (int)PictureType.PNG);
gfs.Close();gfs.Dispose();
CreatePicture(wPFParagraph.CreateRun(), picID, 2009000, 400000);
3、大功告成

Npoi XWPF Word 导出时插入图片无法显示 bug 完美解决的更多相关文章
- 在word中粘贴的图片为什么显示不完整
一.背景 整理系统测试说明文档,截得图片粘贴到word中显示不完整. 二.错误问题 问题:在word中粘贴的图片为什么显示不完整,如图所示: 三.分析问题: 原因是原来设置的行间距是固定值,图片也作一 ...
- 2.4.5 用NPOI操作EXCEL--插入图片
我们知道,在Excel中是可以插入图片的.操作菜单是“插入->图片”,然后选择要插入图片,可以很容易地在Excel插入图片.同样,在NPOI中,利用代码也可以实现同样的效果.在NPOI中插入图片 ...
- Word批量调整插入图片大小
做标书,word中需要插入大量图片,实为一些证书.文件的扫描文件.但插入后,大小不是想要的,太小了,打印出来看不清.需要调整,需要批量调整. 这是一个不错的方法: 选中第一张图片,按页面调整大小到适合 ...
- swiper.js在隐藏/显示切换时,轮播出现bug的解决办法
swiper在 swiper-container正常状态下显示,轮播是没有问题,但是当 swiper-container由隐藏切换至显示时(比如做图片查看时)会出现滑动bug,滑动卡顿而且最后一张可以 ...
- XML-20100: (Fatal Error) Expected ';'. xml转word 导出时异常
因为数据中包含特殊字符.需要进行转译. < < 小于号 > > 大于号 & & 和 ' ’ 单引号 " " 双引号 XML ...
- C#.net中当地址有中文时,图片无法显示解决方法
原文发布时间为:2008-11-05 -- 来源于本人的百度文章 [由搬家工具导入] 搞了半天都无法正常显示图片, string path = Server.MapPath("." ...
- web页面上展示图片时,图片不显示,报错:ERR_CONTENT_LENGTH_MISMATCH
问题描述 前端页面加载css,和js文件的时候,经常出现ERR_CONTENT_LENGTH_MISMATCH的报错情况. 查找问题 在单独打开hearder中css,js的网络地址是能打开的 ...
- IOS下图片不能显示问题的解决办法
最近遇到这样一个问题,在HTML5手机页面中,直接给<img>标签设置宽高,即便图片路径正常,在IOS真机下也是无法显示的,而在安卓以及浏览器的模拟真机上都是正常显示的,这是为什么呢? h ...
- 关于django配置好静态文件后打开相关图片页显示404的解决方法
在url里设置以上代码即可,即可解决图片显示异常(出现此问题的根本原因是django版本)django3后需要加以上代码)
随机推荐
- CQUT校园通知网消息爬虫+Server酱微信推送
上了大三之后发现很多学校的通知都不会发送到班群里面,导致自己会错过很多重要信息,故想写一个爬虫来获取从当前时间之后的新的通知标题,并推送到微信上. PS:推送到微信上这个想法来源是,很多时候都需要将消 ...
- Linux使用inode(i节点号)删除文件
今天学习Linux的时候遇到的知识点,想起了以前一次线下AWD攻防赛的时候的不死马,记录一下 在Linux里面,有的时候我们会遇到奇奇怪怪的文件名,以至于我们删除不了,比如说我们创建了一个叫做&quo ...
- espcms代码审计第一弹
以前的代码审计都是在CTF比赛题里面进行对于某一段代码的审计,对于后端php整体代码和后端整体架构了解的却很少,所以有空我都会学习php的代码审计,以提高自己 环境就直接用的是phpstudy,学习的 ...
- 【题解】G.Graph(2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest)
题目链接G题 题意 序列 \(a_1,a_2,⋯,a_n\) 是一个排列, 当且仅当它含有 1 到 n 的所有整数. 排列 \(a_1,a_2,⋯,a_n\) 是一个有向图的拓扑排序,当且仅当对于每条 ...
- 2020/12月最新WinSpy/WinSpy++下载exe
>>>下载地址 https://wws.lanzous.com/iFUsVj931xa 密码:5hp7 解压密码:yunmuq 夹带私货:在这里希望大家分享文件别再用百度云了,不用百 ...
- MySQL技术内幕InnoDB存储引擎(六)——锁
什么是数据库的锁? 锁是数据库系统区别于文件系统的一个关键特性.锁机制用于管理对共享资源的并发访问.让数据库事务满足隔离性的要求. InnoDB 中锁的作用 不仅用于对数据进行并发访问,还还包括了缓冲 ...
- spring入门学习
开发步骤: 1.导入Spring开发的基本坐标 2.编写接口和实现类 3.创建Spring核心配置文件 4.在Spring核心配置文件中配置实现类 5.使用Spring的API获得Bean实例Bean ...
- Vue-router hash模式微信登录授权验证,#号处理
微信授权登录验证会把网址中的#号去掉,这样在跳转的时候Vue拿不到Code.所以做了以下处理 let href = window.location.href; if (href.includes(&q ...
- Spring @Scheduled Annotation
1.Overview 这里我们将会学习Spring @Scheduled 标签,了解它是如何配置,如何设置定时任务. 关于它的使用,有两点简单的规则需要记住: ※它的方法应该是一个void返回值类型 ...
- 牛客练习赛 73 D
题目链接 离别 离线算法+线段树 容易发现当我们枚举右端点r时,符合条件的左端点是一段连续的区间 我们可以用队列来维护这个连续区间的左右端点 当枚举到端点\(i\)时,将下标\(i\)插入到队列\(q ...