当前位置:  编程技术>.net/c#/asp.net

C#采用OpenXml给word里面插入图片

    来源: 互联网  发布时间:2014-11-04

    本文导语:  本文实例讲述了C#采用OpenXml给word里面插入图片的方法,分享给大家供大家参考。具体分析如下: 首先需要指出的是在MSDN官网有完整的OpenXML教程,虽然是全英文的不过还是很有帮助的。 注,原来摘抄代码里面没有模板,在copy...

本文实例讲述了C#采用OpenXml给word里面插入图片的方法,分享给大家供大家参考。具体分析如下:

首先需要指出的是在MSDN官网有完整的OpenXML教程,虽然是全英文的不过还是很有帮助的。

注,原来摘抄代码里面没有模板,在copy过来发现插入word中的图片大小不一样,我们如何查找设置图片大小带代码的那一块,建议自己用在word里面插入一张图片,通过OpenXml Tools 反编译出C#代码,然后改变图片的大小,再次反编译。

使用byeond compare 【http://www.scootersoftware.com/ 下载地址】比较C#代码,就会发现是因为new DW.Extent() { Cx = 990000L, Cy = 792000L}  是因为这段设置造成的。以后其实很多地方都可以借助OpenXml Tools反编译来进行对比。查看设置样式的属性位置。

MSDN openxml学习链接:  http://msdn.microsoft.com/en-us/library/office/bb491088(v=office.15).aspx。感兴趣的朋友可以查看一下。

示例代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using System.IO;
using DW = DocumentFormat.OpenXml.Drawing.Wordprocessing;
using PIC = DocumentFormat.OpenXml.Drawing.Pictures;
using A = DocumentFormat.OpenXml.Drawing;

namespace AddPictureIntoWord
{
  public class Program
  {
    public static void Main(string[] args)
    {
      string picPath = "u=639047729,3872612606&fm=11&gp=0.bmp";
      string filePath = "Test.docx";
      AddPictureIntoWord(filePath, picPath);
    }

    public static void AddPictureIntoWord(string filePath, string picturePath)
    {
      using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
      {
        string picType = picturePath.Split('.').Last();
        ImagePartType imagePartType;
        ImagePart imagePart = null;
        // 通过后缀名判断图片类型, true 表示忽视大小写
        if (Enum.TryParse(picType, true, out imagePartType))
        {
          imagePart = doc.MainDocumentPart.AddImagePart(imagePartType);
        }

        imagePart.FeedData(File.Open(picturePath, FileMode.Open)); // 读取图片二进制流
        AddImageToBody(doc, doc.MainDocumentPart.GetIdOfPart(imagePart));
      }
    }

    // 摘抄自http://msdn.microsoft.com/EN-US/library/office/bb497430(v=office.15).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-5    
   private static void AddImageToBody(WordprocessingDocument wordDoc, string relationshipId)
    {
      // Define the reference of the image.
      var element =
         new Drawing(
           new DW.Inline(
             new DW.Extent() { Cx = 990000L, Cy = 792000L }, // 调节图片大小
             new DW.EffectExtent()
             {
               LeftEdge = 0L,
               TopEdge = 0L,
               RightEdge = 0L,
               BottomEdge = 0L
             },
             new DW.DocProperties()
             {
               Id = (UInt32Value)1U,
               Name = "Picture 1"
             },
             new DW.NonVisualGraphicFrameDrawingProperties(
               new A.GraphicFrameLocks() { NoChangeAspect = true }),
             new A.Graphic(
               new A.GraphicData(
                 new PIC.Picture(
                   new PIC.NonVisualPictureProperties(
                     new PIC.NonVisualDrawingProperties()
                     {
                       Id = (UInt32Value)0U,
                       Name = "New Bitmap Image.jpg"
                     },
                     new PIC.NonVisualPictureDrawingProperties()),
                   new PIC.BlipFill(
                     new A.Blip(
                       new A.BlipExtensionList(
                         new A.BlipExtension()
                         {
                           Uri =
                            "{28A0092B-C50C-407E-A947-70E740481C1C}"
                         })
                     )
                     {
                       Embed = relationshipId,
                       CompressionState =
                       A.BlipCompressionValues.Print
                     },
                     new A.Stretch(
                       new A.FillRectangle())),
                   new PIC.ShapeProperties(
                     new A.Transform2D(
                       new A.Offset() { X = 0L, Y = 0L },
                       new A.Extents() { Cx = 990000L, Cy = 792000L }), //与上面的对准
                     new A.PresetGeometry(
                       new A.AdjustValueList()
                     ) { Preset = A.ShapeTypeValues.Rectangle }))
               ) { Uri = "http://schemas.openxmlformats.org/drawingml/2006/picture" })
           )
           {
             DistanceFromTop = (UInt32Value)0U,
             DistanceFromBottom = (UInt32Value)0U,
             DistanceFromLeft = (UInt32Value)0U,
             DistanceFromRight = (UInt32Value)0U,
             EditId = "50D07946"
           });

      // Append the reference to body, the element should be in a Run.
      wordDoc.MainDocumentPart.Document.Body.AppendChild(new Paragraph(new Run(element)));
    }
  }
}

本文示例运行效果如下图所示:

希望本文所述对大家的C#程序设计有所帮助。


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 采用Linux/Unix作为服务器和采用windows系列有什么优缺点呢?
  • 作CRM现在使用什么开发工具比较方便?采用什么结构?
  • 采用Flash的嵌入式系统中是否难以应用数据库?
  • 请教有没有谁在 LINUX下实现对DVD光盘采用UDF格式刻录的?
  • 如果CSDN采用JSP技术,访问速度会不会加快
  • 请问应用服务器本身也是采用多层结构吗?疑惑中。
  • 论坛 iis7站长之家
  • 在调用pthread_testcancel时要采用这样的方式???
  • YC2440开发板采用什么串口线?
  • 消息队列一般是怎么使用的,是采用While的方式进行轮询么
  • 采用UDP对ARM系统远程监测
  • 一个可以自动排序、频繁增删的队列,采用哪种数据结构比较好?
  • 关于采用NT Loader引导redhat7.2的问题。
  • linux系统下,采用 ADSL 路由方式上网,如何设置网络端口interface的值?
  • 各位高手:servlet如何接收采用http上传(如同Email的附件)的文件?
  • linux 可以采用crypt来加密口令,不知道有什么解密方法没有?
  • 采用XML时候大家用DTD还是SCHEMA。
  • HP-UX 11.0 采用的是unix操作系统吗?
  • 怎么样去除浏览器中的滚动条,而采用内部的滚动条!
  • Primitive 与 String 之间的转换必须采用封装类吗?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3