npoi插入图片 解决无法打开word的问题

19 篇文章 0 订阅

转载 https://www.cnblogs.com/zhangliming/archive/2013/04/02/2995655.html

我需要重复操作的word 根据对应人物名称插入的不同位置的 单元格,一次只能插入一张图片

        /// <summary>
        /// 导出word
        /// </summary>
        /// <param name="fileName">原文件名</param>
        /// <param name="outPath">输出路径</param>
        /// <param name="record">要输入数据信息</param>
        /// <returns></returns>
        public static bool ExportMeetingRecord(string fileName, string outPath, NpoiTransmitData record)
        {
            XWPFDocument doc = null;
            using (FileStream file = new FileStream(fileName, FileMode.Open, FileAccess.Read))
            {
                doc = new XWPFDocument(file);
            }
            try
            {
                //遍历表格     
                var tables = doc.Tables;
                if (tables == null || tables.Count == 0)
                {

                }
                else
                {
                    var table = doc.Tables[doc.Tables.Count - 1];
                    foreach (var row in table.Rows)
                    {
                        List<XWPFTableCell> cells = row.GetTableCells();
                        for (int i = 0; i < cells.Count; i = i + 2)
                        {
                            XWPFTableCell cell = cells[i];
                            string text = cell.GetText();
                            if (!text.Trim().Equals(record.name)) continue;
                            string imagePath = record.value;
                            if (string.IsNullOrEmpty(imagePath)) continue;
                            string picId = string.Empty;
                            using (FileStream imageFileStream = new FileStream(imagePath, FileMode.Open))
                            {
                                picId = doc.AddPictureData(imageFileStream, (int)NPOI.XWPF.UserModel.PictureType.JPEG);
                            }
                            if (string.IsNullOrEmpty(picId)) continue;
                            //cells[i + 1].SetVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
                            string imageName = Path.GetFileNameWithoutExtension(imagePath);
                            CreatePicture(cells[i + 1], picId, (uint)i, 64, 64);
                            //CreatePicture2(cells[i + 1], picId, 64, 64);
                            //setCellImage(cells[i + 1], 3 * 256, 6 * 256, imagePath, NPOI.XWPF.UserModel.PictureType.JPEG);
                        }
                    }
                }

                FileStream file = new FileStream(outPath, FileMode.Create, FileAccess.Write);
                doc.Write(file);
                file.Close();
                file.Dispose();
                return true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
 

注意
$"<pic:cNvPr id="{id + 1}" name=“图片 {id + 1}”/>"

docPr.id = id+1;
docPr.name = "图片 " + (id + 1);
尽量保持一致,以免出现 插入一次图片后 word 文件无法读取的问题。

        /// <summary>
        /// 创建图片
        /// </summary>
        /// <param name="cell">插入的单元格</param>
        /// <param name="imageId">插入word时生成的image的ID</param>
        /// <param name="id">id索引(如1,2等)区别 不同图片</param>
        /// <param name="width">要插入的图片宽度</param>
        /// <param name="height">要插入的图片高度</param>
        public static void CreatePicture(XWPFTableCell cell, string imageId, uint id, int width, int height)
        {
            int EMU = 9525;
            width *= EMU;
            height *= EMU;

            string picXml = "<pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">"
    + "<pic:nvPicPr>"
         + $"<pic:cNvPr id=\"{id + 1}\" name=\"图片 {id + 1}\"/>"
         + "<pic:cNvPicPr/>"
     + "</pic:nvPicPr>"
     + "<pic:blipFill>"
         + $"<a:blip r:embed=\"{imageId}\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">"//cstate=\"print\"
                                                                                                                            //             + "<a:extLst>"
                                                                                                                            //                 + "<a:ext uri=\"\">"//{ 28A0092B-C50C-407E-A947-70E740481C1C}
                                                                                                                            //+ "<a14:useLocalDpi xmlns:a14=\"http://schemas.microsoft.com/office/drawing/2006/main\" val=\"0\"/>"
                                                                                                                            //            + "</a:ext>"
                                                                                                                            //        + "</a:extLst>"
         + "</a:blip>"
         + "<a:stretch>"
             + "<a:fillRect/>"
         + "</a:stretch>"
     + "</pic:blipFill>"
     + "<pic:spPr>"
         + "<a:xfrm>"
             + "<a:off x=\"0\" y=\"0\"/>"
             + $"<a:ext cx=\"{width}\" cy=\"{height}\"/>"
         + "</a:xfrm>"
         + "<a:prstGeom prst=\"rect\">"
             + "<a:avLst/>"
         + "</a:prstGeom>"
     + "</pic:spPr>"
 + "</pic:pic>";

            //var run = doc.CreateParagraph().CreateRun();
            XWPFParagraph newPara = cell.AddParagraph();
            newPara.Alignment = ParagraphAlignment.CENTER;
            XWPFRun imageCellRunn = newPara.CreateRun();
            CT_Inline inline = imageCellRunn.GetCTR().AddNewDrawing().AddNewInline();

            inline.graphic = new CT_GraphicalObject();
            inline.graphic.graphicData = new CT_GraphicalObjectData();
            inline.graphic.graphicData.uri = "http://schemas.openxmlformats.org/drawingml/2006/picture";
            try
            {
                inline.graphic.graphicData.AddPicElement(picXml);
            }
            catch (XmlException xe)
            {

            }

            NPOI.OpenXmlFormats.Dml.WordProcessing.CT_PositiveSize2D extent = inline.AddNewExtent();
            extent.cx = width;
            extent.cy = height;

            NPOI.OpenXmlFormats.Dml.WordProcessing.CT_NonVisualDrawingProps docPr = inline.AddNewDocPr();
            docPr.id = id+1;
            docPr.name = "图片 " + (id + 1);
        }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值