C#向Excel报表中插入图片的2种方法

2023-05-16

这几天做向Excel插入数据,其中有插入图片的需求,经试验,下面2种方法都可以插入图片,但各有不同的用处。现将这2种方法共享出来, 希望需要的朋友进行参考,代码中已经有详细注释了。

注意:使用之前需要引用COM:Microsoft Office 11.0 Object Library
如果引用列表中没有,需要自行添加 C:/Program Files/Microsoft Office/OFFICE11/EXCEL.EXE

调用方法:

 

MengXianhui.Utility.ExcelReport.InsertPictureToExcel ipt  =   new  MengXianhui.Utility.ExcelReport.InsertPictureToExcel();
ipt.Open();
ipt.InsertPicture(
" B2 " @" C:/Excellogo.gif " );
ipt.InsertPicture(
" B8 " @" C:/Excellogo.gif " , 120 , 80 );
ipt.SaveFile(
@" C:/ExcelTest.xls " );
ipt.Dispose();

 

简单包装的类:

 

using  System;
using  System.Windows.Forms;
using  Excel  =  Microsoft.Office.Interop.Excel;

namespace  MengXianhui.Utility.ExcelReport
{
  
class  InsertPictureToExcel
  {
    
///   <summary>
    
///  打开没有模板的操作。
    
///   </summary>
     public   void  Open( )
    {
      
this .Open(String.Empty);
    }

    
///   <summary>
    
///  功能:实现Excel应用程序的打开
    
///   </summary>
    
///   <param name="TemplateFilePath"> 模板文件物理路径 </param>
     public   void  Open(  string  TemplateFilePath )
    {
      
// 打开对象
      m_objExcel  =   new  Excel.Application();
      m_objExcel.Visible 
=   false ;
      m_objExcel.DisplayAlerts 
=   false ;

      
if  (m_objExcel.Version  !=   " 11.0 " )
      {
        MessageBox.Show(
" 您的 Excel 版本不是 11.0 (Office 2003),操作可能会出现问题。 " );
        m_objExcel.Quit();
        
return ;
      }

      m_objBooks 
=  (Excel.Workbooks)m_objExcel.Workbooks;
      
if  (TemplateFilePath.Equals(String.Empty))
      {
        m_objBook 
=  (Excel._Workbook)(m_objBooks.Add(m_objOpt));
      }
      
else
      {
        m_objBook 
=  m_objBooks.Open(TemplateFilePath, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);
      }
      m_objSheets 
=  (Excel.Sheets)m_objBook.Worksheets;
      m_objSheet 
=  (Excel._Worksheet)(m_objSheets.get_Item( 1 ));
      m_objExcel.WorkbookBeforeClose 
+=   new  Excel.AppEvents_WorkbookBeforeCloseEventHandler(m_objExcel_WorkbookBeforeClose);
    }

    
private   void  m_objExcel_WorkbookBeforeClose( Excel.Workbook m_objBooks,  ref   bool  _Cancel )
    {
      MessageBox.Show(
" 保存完毕! " );
    }

    
///   <summary>
    
///  将图片插入到指定的单元格位置。
    
///  注意:图片必须是绝对物理路径
    
///   </summary>
    
///   <param name="RangeName"> 单元格名称,例如:B4 </param>
    
///   <param name="PicturePath"> 要插入图片的绝对路径。 </param>
     public   void  InsertPicture(  string  RangeName,  string  PicturePath )
    {
      m_objRange 
=  m_objSheet.get_Range(RangeName, m_objOpt);
      m_objRange.Select();
      Excel.Pictures pics 
=  (Excel.Pictures)m_objSheet.Pictures(m_objOpt);
      pics.Insert(PicturePath, m_objOpt);
    }

    
///   <summary>
    
///  将图片插入到指定的单元格位置,并设置图片的宽度和高度。
    
///  注意:图片必须是绝对物理路径
    
///   </summary>
    
///   <param name="RangeName"> 单元格名称,例如:B4 </param>
    
///   <param name="PicturePath"> 要插入图片的绝对路径。 </param>
    
///   <param name="PictuteWidth"> 插入后,图片在Excel中显示的宽度。 </param>
    
///   <param name="PictureHeight"> 插入后,图片在Excel中显示的高度。 </param>
     public   void  InsertPicture(  string  RangeName,  string  PicturePath,  float  PictuteWidth,  float  PictureHeight )
    {
      m_objRange 
=  m_objSheet.get_Range(RangeName, m_objOpt);
      m_objRange.Select();
      
float  PicLeft, PicTop;
      PicLeft 
=  Convert.ToSingle(m_objRange.Left);
      PicTop 
=  Convert.ToSingle(m_objRange.Top);
      
// 参数含义:
      
// 图片路径
      
// 是否链接到文件
      
// 图片插入时是否随文档一起保存
      
// 图片在文档中的坐标位置(单位:points)
      
// 图片显示的宽度和高度(单位:points)
      
// 参数详细信息参见: http://msdn2.microsoft.com/zh-cn/library/aa221765 (office.11).aspx
      m_objSheet.Shapes.AddPicture(PicturePath, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoTrue, PicLeft, PicTop, PictuteWidth, PictureHeight);
    }

    
///   <summary>
    
///  将Excel文件保存到指定的目录,目录必须事先存在,文件名称不一定要存在。
    
///   </summary>
    
///   <param name="OutputFilePath"> 要保存成的文件的全路径。 </param>
     public   void  SaveFile(  string  OutputFilePath )
    {
      m_objBook.SaveAs(OutputFilePath, m_objOpt, m_objOpt,
        m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange,
        m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);

      
this .Close();
    }
    
///   <summary>
    
///  关闭应用程序
    
///   </summary>
     private   void  Close( )
    {
      m_objBook.Close(
false , m_objOpt, m_objOpt);
      m_objExcel.Quit();
    }

    
///   <summary>
    
///  释放所引用的COM对象。注意:这个过程一定要执行。
    
///   </summary>
     public   void  Dispose( )
    {
      ReleaseObj(m_objSheets);
      ReleaseObj(m_objBook);
      ReleaseObj(m_objBooks);
      ReleaseObj(m_objExcel);
      System.GC.Collect();
      System.GC.WaitForPendingFinalizers();
    }
    
///   <summary>
    
///  释放对象,内部调用
    
///   </summary>
    
///   <param name="o"></param>
     private   void  ReleaseObj(  object  o )
    {
      
try
      {
        System.Runtime.InteropServices.Marshal.ReleaseComObject(o);
      }
      
catch  { }
      
finally  { o  =   null ; }
    }

    
private  Excel.Application m_objExcel  =   null ;
    
private  Excel.Workbooks m_objBooks  =   null ;
    
private  Excel._Workbook m_objBook  =   null ;
    
private  Excel.Sheets m_objSheets  =   null ;
    
private  Excel._Worksheet m_objSheet  =   null ;
    
private  Excel.Range m_objRange  =   null ;
    
private   object  m_objOpt  =  System.Reflection.Missing.Value;
  }
}

 

运行结果:

 

运行结果

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#向Excel报表中插入图片的2种方法 的相关文章

  • freemarker实现word文档模板动态生成

    携手创作 xff0c 共同成长 xff01 这是我参与 掘金日新计划 8 月更文挑战 的第29天 xff0c 点击查看活动详情 1 写在前面 很多时候 xff0c 我们可能需要根据一个word模板 xff0c 动态生成 xff0c 我们所需
  • 生信学习——R语言练习题-初级(附详细答案解读)

    题目目录 1 打开 Rstudio 告诉我它的工作目录 2 新建6个向量 xff0c 基于不同的数据类型 xff08 重点是字符串 xff0c 数值 xff0c 逻辑值 xff09 3 告诉我在你打开的rstudio里面 getwd 代码运
  • 生信学习——GEO数据挖掘

    步骤 STEP1 xff1a 表达矩阵ID转换STEP2 xff1a 差异分析STEP3 xff1a KEGG数据库注释完整代码 写在前面 按照生信技能树的学习路线 xff0c 学完R语言就该学习GEO数据挖掘了 有人说GEO数据挖掘可以快
  • 机器学习——基于python的鸢尾花SVM练习(包含超参数批量筛选、交叉验证)

    目录 1 最普通的SVM2 交叉验证 筛选超参数法一 xff1a cross val score法二 xff1a GridSearchCV xff08 推荐 xff09 3 完整代码 写在前面 虽然本人一直对机器学习感兴趣 xff0c 但是
  • python学习——tsv文件批量转为csv文件、csv文件列合并

    写在前面 近日在处理数据的时候发现有的文件为csv文件 xff0c 有的为tsv文件 xff0c 大概搜了一下了解到 xff1a TSV是用制表符 xff08 t xff09 作为字段值的分隔符 xff1b CSV是用半角逗号 xff08
  • PPI网络的构建与美化(String+Cytoscape)

    目录 写在前面一 使用string分析数据二 使用Cytoscape构建网络1 导入TSV文件2 Analyze Network3 Generate Style4 CytoNCA计算Betweenness 三 美化网络1 根据Between
  • 生信刷题之ROSALIND——Part 2

    目录 1 Counting Point MutationsProblemSample DatasetSample OutputCodeOutput 2 Mendel 39 s First LawProblemSample DatasetSa
  • 生信刷题之ROSALIND——Part 3

    目录 1 Mortal Fibonacci RabbitsProblemSample DatasetSample OutputCodeOutput 2 Overlap GraphsProblemSample DatasetSample Ou
  • 生信刷题之ROSALIND——Part 4 (MPRT, MRNA, ORF)

    目录 写在前面1 Finding a Protein MotifProblemSample DatasetSample OutputCodeOutput 2 Inferring mRNA from ProteinProblemSample
  • Pandas第三次作业20200907

    练习1 读取北向 csv 指定trade date为行索引 查看数据的基本信息 有无缺失值 对其缺失值进行处理 删除缺失值所在行 查看数据的基本信息 查看数据是否清洗完毕 index列没啥用 将index列删除 观察数据是否有重复行 将重复
  • Linux设置开机默认进入命令行或者图形界面

    开机默认进入命令行模式 xff1a sudo systemctl set default multi user target 开机默认进入图形用户界面 xff1a sudo systemctl set default graphical t
  • 美团后端笔试

    文章目录 整场笔试下来 xff0c 整体难度一般 xff0c 只不过在第三题扑克牌游戏的时候进行的不是很顺利 xff0c 附加题难度一般 xff0c 不知道有没有小伙伴和我一样时间耗费在第三题上面的 1 魔法外卖 题目描述 xff1a 炸鸡
  • 【JokerのZYNQ7020】QSPI启动。

    软件环境 xff1a vivado 2017 4 硬件平台 xff1a XC7Z020 通常来说 xff0c 系统做好以后是放SD卡里 xff0c 上电以后 xff0c 根据boot引脚的配置 xff0c 从SD卡引导系统启动 如果你像我一
  • 【JokerのZYNQ7020】SDK程序从QSPI启动。

    软件环境 xff1a vivado 2017 4 硬件平台 xff1a XC7Z020 之前写的QSPI启动是对ZYNQ的PS装Linux系统的 xff0c 如果不想搞那么麻烦或者功能要求单一 xff0c 调试又想方便一些 xff0c 直接
  • 【JokerのZYNQ7020】Vxworks 6.9。

    软件环境 xff1a vivado 2017 4 硬件平台 xff1a XC7Z020 基本全程参考的官方xapp1158 zynq 7000 vxworks bsp pdf xff0c 但我感觉主要难度不在移植上 xff0c 因为pdf里
  • 【JokerのZYNQ7020】ubuntu启动后跳过验证登录。

    之前分享过一篇debian系统启动后如何自动加载用户应用的例程 xff0c 今天在这里继续分享一个非常实用的小技巧 xff0c 如何让嵌入式板卡的ubuntu系统启动后 xff0c 跳过用户名密码验证 xff0c 直接以root身份进入系统
  • 2013年终总结

    2013年即将过去 xff0c 回顾这一年 xff0c 有得有失 xff0c 有喜有悲 xff0c 些许记忆碎片留在脑海中 简单做个总结 xff0c 也算划上一个完美的句号 xff0c 再迎接充满挑战的2014 xff01 项目 一年过来
  • 用FSL进行VBM统计分析

    用FSL进行VBM统计分析 总体步骤概览1 准备数据1 1 T1数据格式1 2 Template list查看数据 2 剥头皮 xff1a fslvbm 1 bet3 数据分割 43 生成模板 xff1a fslvbm 2 template
  • 程序员的生活,其实苦不堪言

    前一天 A 下班前把这个代码发给我 B 好的 xff01 第二天 A 都他妈中午了 xff0c 代码怎么还没发过来 xff1f B 我他妈还没下班呢 xff01 程序猿的真实写照 曾经刚参加工作 xff0c 接手一个项目的维护 xff0c
  • 文件后缀大全

    file extensions with related program associations a unix library unix ada program a01 arj multi volume compressed archiv

随机推荐

  • Android Studio 安装Kotlin插件

    1 打开Android Studio 的File gt Settings xff0c 选择左侧Plugins显示已安装插件列表 搜索框输入kotlin xff0c 若无搜索结果 xff0c 可以点击 Search in repositori
  • Python读取文件的多种方式

    在Python编程中 xff0c 读取文件是非常常见的操作 Python提供了多种读取文件的方式 xff0c 本文将介绍其中的几种方式 1 使用open函数读取文件 使用Python内置函数open 可以打开一个文件 xff0c 并返回一个
  • 阿里Java面试题剖析:关于系统拆分,为什么要进行系统拆分?

    外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直接上传 img Xz97Uqx1 1663815474530 https upload images jianshu io upload images 16535373 f09e8
  • 关于完全二叉树高度h与结点个数n的推导

    推导1 xff1a 具有n个 n gt 0 结点的完全二叉树的高度h为 xff1a log2 n 43 1 由于高度h的满二叉树共有2h 1个结点 高度为h 1的满二叉树有2h 1 1个结点 可得2h 1 1 lt n lt 61 2h 1
  • Android 采用fastboot刷system.img boot.img recovery.img

    手机正常启动后 xff0c 命令行模式下输入 adb reboot bootloader 该命令会自动进入fastboot模式 接着 xff1a fastboot devices 查看是否有设备 erase 擦除的意思 xff0c 你懂得
  • ButterKnife与BindView使用详解

    ButterKnife与BindView使用详解 ButterKnife的优势 具有强大的view绑定和click事件处理能力 方便处理Adapter里的viewHolder绑定问题 运行时不会影响app效率 xff0c 配置方便 代码清晰
  • libpcap的安装

    最近参加了一个实训项目 xff0c 是把一个WireShark抓到的pcapng文件用libpcap库还原成原始的TS流 xff0c 需求分析弄了一天 xff0c 安装环境用了一天 xff0c 接下来再开始写代码 xff0c 让我们一起完成
  • 【手把手教你】使用Python玩转金融时间序列模型

    01 引言 上一篇推文 Python量化基础 时间序列的自相关性与平稳性着重介绍了时间序列的一些基础概念 xff0c 包括自相关性 偏自相关性 白噪声和平稳性 xff0c 以及Python的简单实现 本文在此基础上 xff0c 以沪深300
  • Java 解决 java.lang.IllegalStateException 异常错误

    今天运行项目时出现的这个问题 xff0c 有错误提示可以看出 xff0c 大概意思是这个项目已经停止 xff0c 不能重新加载 也就是说只需重新部署基本就可以啦 网上有人说可以将项目从tomcat中先移除再部署上去 xff0c 实在不行就把
  • 学习笔记3 hive数据分析(实例)

    目的 xff1a 分析企业新闻舆情的正负面性与该公司是否有非法集资风险的关系 思路 xff1a 将两张表连接成一张新表 xff1b 根据 id 企业唯一标识 positive negtive 新闻正负面性 public date 发布日期
  • Gradle sync failed: Could not find com.android.tools.build:gradle:4.1.3解决方法

    Gradle sync failed Could not find com android tools build gradle 4 1 3解决方法 升级安卓4 1 3后导入其他项目显示如下错误 原因是软件无法更新Gradle sync x
  • AlertDialog对话框弹出后,旋转屏幕,对话框消失,造成leak window

    看log信息 按字面了解 xff0c Window Leaked大概就是说一个窗体泄漏了 xff0c 也就是我们常说的内存泄漏 xff0c 为什么窗体会泄漏呢 xff1f 我们知道Android的每一个Activity都有个WindowMa
  • 如何高效地阅读技术类书籍与博客

    原文地址 xff1a http www nowamagic net librarys veda detail 2050 如何高效地阅读技术类书籍与博客 影像阅读法 阅读是自我提升的一个有效方法 xff0c 阅读书籍 阅读博客都是我们技术提升
  • Java进阶面试题:如何设计一个高并发系统?

    面试原题 如何设计一个高并发系统 xff1f 面试官心理分析 说实话 xff0c 如果面试官问你这个题目 xff0c 那么你必须要使出全身吃奶劲了 为啥 xff1f 因为你没看到现在很多公司招聘的 JD 里都是说啥 xff0c 有高并发就经
  • 微擎按照UID获取用户绑定手机号

    按照UID获取用户信息 users 61 pdo fetch 34 select from 34 tablename 39 users 39 34 where uid 61 W 39 uid 39 34 按照UID获取用户绑定手机号 thi
  • AD-----间距、线宽、阻焊、铺铜规则设置

    1 间距规则 快捷键 D 43 R xff0c 出现如下界面 xff0c 在Clearance 中 即可设置对应的规则 Track 走线 SMD Pad 贴片式焊盘 TH Pad 通孔焊盘 Via xff1a 过孔 Copper xff1a
  • 【Python】程序员情人节搞事情的程序

    程序员情人节搞事情的程序 效果展示源码备注1 这段代码用 python 实现2 用 pyinstaller 打包成exe3 没有 pyinstaller 的话 xff0c 可以直接用 pip 安装 效果展示 源码 import pygame
  • Maven项目在编译及导入Eclipse时出现的错误汇总处理

    Maven项目在编译及导入Eclipse时出现的错误处理汇总 Maven在构建项目时确实是比较强大 xff0c 而且也越来越流行 xff0c 目前不但越来越多的开源项目 xff0c 甚至越来越多的商业项目都在使用Maven 但是不得不说Ma
  • AS导入项目报错:Plugin with id ‘com.android.application‘ not found

    转自 xff1a https www cnblogs com cuichen16 p 10785951 html 从github或第三方Demo中获取的项目导入到AndroidStudio中报错Plugin with id com andr
  • C#向Excel报表中插入图片的2种方法

    这几天做向Excel插入数据 xff0c 其中有插入图片的需求 xff0c 经试验 xff0c 下面2种方法都可以插入图片 xff0c 但各有不同的用处 现将这2种方法共享出来 xff0c 希望需要的朋友进行参考 xff0c 代码中已经有详