9

Npoi XWPF Word 导出时插入图片无法显示 bug 完美解决

 3 years ago
source link: http://www.cnblogs.com/htt4242/p/14255113.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

一、来自客户的需求

最近客户来个新需求生成一个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();

是不是很轻松就搞定了。

没想到弹出这么个框框,眼前一黑啊!!!!!

3MjEFzI.png!mobile

二、解决Npio 插入图片报错问题

1、找出问题

用WinRAR打开,对比下正常情况下的数据和报错那个文件的数据有什么不同

Jz6Jjqz.png!mobile

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

错误的文件

EfqQrm.png!mobile

正确的文件

JzUvAfE.png!mobile

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、大功告成

6v2Efu2.png!mobile


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK