一、来自客户的需求

最近客户来个新需求生成一个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 完美解决的更多相关文章

  1. 在word中粘贴的图片为什么显示不完整

    一.背景 整理系统测试说明文档,截得图片粘贴到word中显示不完整. 二.错误问题 问题:在word中粘贴的图片为什么显示不完整,如图所示: 三.分析问题: 原因是原来设置的行间距是固定值,图片也作一 ...

  2. 2.4.5 用NPOI操作EXCEL--插入图片

    我们知道,在Excel中是可以插入图片的.操作菜单是“插入->图片”,然后选择要插入图片,可以很容易地在Excel插入图片.同样,在NPOI中,利用代码也可以实现同样的效果.在NPOI中插入图片 ...

  3. Word批量调整插入图片大小

    做标书,word中需要插入大量图片,实为一些证书.文件的扫描文件.但插入后,大小不是想要的,太小了,打印出来看不清.需要调整,需要批量调整. 这是一个不错的方法: 选中第一张图片,按页面调整大小到适合 ...

  4. swiper.js在隐藏/显示切换时,轮播出现bug的解决办法

    swiper在 swiper-container正常状态下显示,轮播是没有问题,但是当 swiper-container由隐藏切换至显示时(比如做图片查看时)会出现滑动bug,滑动卡顿而且最后一张可以 ...

  5. XML-20100: (Fatal Error) Expected ';'. xml转word 导出时异常

    因为数据中包含特殊字符.需要进行转译. < < 小于号 > > 大于号 & & 和 &apos; ’ 单引号 " " 双引号 XML ...

  6. C#.net中当地址有中文时,图片无法显示解决方法

    原文发布时间为:2008-11-05 -- 来源于本人的百度文章 [由搬家工具导入] 搞了半天都无法正常显示图片, string path = Server.MapPath("." ...

  7. web页面上展示图片时,图片不显示,报错:ERR_CONTENT_LENGTH_MISMATCH

      问题描述 前端页面加载css,和js文件的时候,经常出现ERR_CONTENT_LENGTH_MISMATCH的报错情况.   查找问题 在单独打开hearder中css,js的网络地址是能打开的 ...

  8. IOS下图片不能显示问题的解决办法

    最近遇到这样一个问题,在HTML5手机页面中,直接给<img>标签设置宽高,即便图片路径正常,在IOS真机下也是无法显示的,而在安卓以及浏览器的模拟真机上都是正常显示的,这是为什么呢? h ...

  9. 关于django配置好静态文件后打开相关图片页显示404的解决方法

    在url里设置以上代码即可,即可解决图片显示异常(出现此问题的根本原因是django版本)django3后需要加以上代码)

随机推荐

  1. PyCharm中怎么将非当前工程文件的目录的文件加到当前工程中

    在PyCharm已经建立工程文件的情况下,如果要将一个其他目录的文件导入到已有的工程中,唯一的方法如下: 通过File->Settings->Project->Project Str ...

  2. java课堂作业--异常处理

    一. 运行结果: 二. 结果: ArrayIndexOutOfBoundsException/内层try-catch 发生ArithmeticException 三. 结果: ArrayIndexOu ...

  3. python接口自动化测试框架(post提交添加变量)

    1.python接口测试框架包含哪几部分 数据源-> GET/POST 发送请求->接收返回结果->断言测试结果->生成测试报告(html报告)->网页报告 2.pyth ...

  4. CommandLineRunner 可能会导致你的应用宕机停止,我劝你耗子尾汁

    hello,大家好,我是小黑,又和大家见面啦~~ 如果你去某度搜索关键词 CommandLineRunner 初始化资源 ,截止小黑同学写这篇推文之前,大概能收到 1,030,000 个结果. 网上大 ...

  5. 最简单的Go Dockerfile编写姿势,没有之一!

    1. Dockerfile一些额外注意点 选择最简单的镜像 比如alpine,整个镜像5M左右 设置镜像时区 RUN apk add --no-cache tzdata ENV TZ Asia/Sha ...

  6. 题解-JSOI2011 分特产

    题面 JSOI2011 分特产 有 \(n\) 个不同的盒子和 \(m\) 种不同的球,第 \(i\) 种球有 \(a_i\) 个,用光所有球,求使每个盒子不空的方案数. 数据范围:\(1\le n, ...

  7. html标签学习2

    input 系列 <form enctype="multipart/form-data"> <input type="text" name=& ...

  8. 确定Linux系统位数

    1:getconf LONG_BIT 2:uname -a 3:uname -r 4:cat /proc/version

  9. 基于 Source Generators 做个 AOP 静态编织小实验

    0. 前言 上接:用 Roslyn 做个 JIT 的 AOP 作为第二篇,我们基于Source Generators做个AOP静态编织小实验. 内容安排如下: source generators 是什 ...

  10. vue第十八单元(单向数据流 vuex状态管理)

    第十八单元(单向数据流 vuex状态管理) #课程目标 1.理解什么是数据管理模式 2.什么是vuex 3.什么时候使用vuex 4.vuex安装及工作原理 5.vuex语法 #知识点 1.首先来看下 ...