NPOI在docx插图方法

来源:互联网 发布:周晨曦开的淘宝店 编辑:程序博客网 时间:2024/06/09 20:05

      NPOI尽管已发展到2.0,但对word的支持还不够稳定,对于如何用NPOI在docx中插图网上很少涉及。经过对docx文件中插图的xml分析,对NPOI2.0R源码进行了插图方面的修改,实现了inline和anchor两种方式的插图。

      一、docx插图方式与inline和anchor关系

      inline:内联,此种插图方式对插入的图片位置不能灵活控制,只能通过段设置,对应word的嵌入型插图。

      anchor:锚,此种插图方式对插入的图片位置能灵活控制,对应word的四周型、紧密型、穿越型等。

      二、docx文件中插图的xml分析

      docx插入图片的所有信息都包含在word文件夹中,文件夹中有document.xml文件、media和_rels文件夹,其中图片数据存储在此文件夹下的media文件夹中,在_rels文件夹中的document.xml.rels文件对插图定义了以"rId"+数字组成的标识与图片关联。document.xml文件则存储着插图等的xml信息。

      三、修改NPOI2.0R源码

      原NPOI的XWPFRun类中提供了AddPicture方法,为inline插图方式,经测试发现产生的xml不符合docx插图结构,对相关的类进行了修改,由于修改较多,在此不列举。在XWPFRun类中增加了anchor插图方式的AddPicture方法的重载。

      四、inline及anchor插图实现代码

      inline方式插图代码片段:

            gfs = new FileStream("f:\\pic\\1.jpg", FileMode.Open, FileAccess.Read);
            gp = m_Docx.CreateParagraph();
            gr = gp.CreateRun();
            gr.AddPicture(gfs, (int)PictureType.JPEG, "1.jpg", 1000000, 1000000);
            gfs.Close();
      anchor方式四周型插图代码片段:

            gfs = new FileStream("f:\\pic\\1.jpg", FileMode.Open, FileAccess.Read);
            gp = m_Docx.CreateParagraph();
            gr = gp.CreateRun();
            CT_Anchor an = new CT_Anchor();
            an.distB = (uint)(0);
             an.distL = 114300u;
             an.distR = 114300U;
             an.distT = 0U;
             an.relativeHeight = 251658240u;
             an.behindDoc = false; //"0"
             an.locked = false;  //"0"
             an.layoutInCell = true;  //"1"
             an.allowOverlap = true;  //"1"
              NPOI.OpenXmlFormats.Dml.CT_Point2D simplePos = new NPOI.OpenXmlFormats.Dml.CT_Point2D();
              simplePos.x = (long)0;
              simplePos.y = (long)0;
              CT_EffectExtent effectExtent = new CT_EffectExtent();
              effectExtent.b = 0L;
              effectExtent.l = 0L;
              effectExtent.r = 0L;
              effectExtent.t = 0L;
              CT_WrapSquare wrapSquare = new CT_WrapSquare();
              wrapSquare.wrapText = ST_WrapText.bothSides;   
              gr.AddPicture(gfs, (int)PictureType.JPEG, "1.jpg", 1000000, 1000000, 4000000, 2000000, wrapSquare, an, simplePos, ST_RelFromH.column,

             ST_RelFromV.paragraph, effectExtent);
             gfs.Close();

经过调试的例子下载:http://download.csdn.net/detail/gltide/7032725。创建的docx在word2010可以打开。

新的插图例子(更新:2014-6-2):http://download.csdn.net/detail/gltide/7436319。NPOI是tonyqus提供的2.0.9.0源码经过修改编译,创建的docx在word2007可以打开,例子所创建的docx效果图如下。


0 0
原创粉丝点击