C#打开Excel文件并插入图片的实现过程

举报
zekelove 发表于 2021/12/24 22:02:47 2021/12/24
【摘要】 使用C#导出Excel文件并插入图片的解决方案:先将表格里的数据通过xml的形式导入到Excel文件里并保存,然后重新打开这个Excle文件,在把之前保存的图片插入到这个Excel文件里,然后客户端就可以下载这个Excel文件,并在下载完成后删除原来保存的图片和Excel文件,主要使用Office Excel的动态库。

  在做C#开发项目的时候,项目中经常需要导出Excel文件,有时候还需要插入统计图表,就学习研究了一下导出Excel的东东,整的我晕头转向。这个项目中需要把表格数据和统计分析图同时导入到一个Excel文件里,然后保存在本地。如果是简单表头是很容易导出的,由于表头比较复杂,存在多个合并单元格,这就需要通过xml形式解析,然后导入到Excel,但是导入图片这种方式行不通,只能采取其它的方法。

  经过深思熟虑和查阅多个资源,解决思路是这样的:先将表格里的数据通过xml的形式导入到Excel文件里并保存,然后重新打开这个Excle文件,在把之前保存的图片插入到这个Excel文件里,然后客户端就可以下载这个Excel文件,并在下载完成后删除原来保存的图片和Excel文件,主要使用Excel的动态库。

  在这就来实验一下打开Excel文件并插入图片的方法:

/*
* 插入图片
*/ 
public static bool insertPic(string AbosultedFilePath, string fileName, float cWidth, float cHeight)
     {
         object m_objOpt = System.Reflection.Missing.Value;
         //检查Excel文件是否存在,如果不存在,则退出
          if (!File.Exists(AbosultedFilePath + fileName + ".xls"))
             return false;
 
         //创建Excel应用程序对象,如果未创建成功则退出
          Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
         if (xlApp == null)
         {
             System.Web.HttpContext.Current.Response.Write("无法创建Excel对象,可能你的电脑未装Excel");
             return false;
         }
 
         Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks;
         Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Open(AbosultedFilePath + fileName + ".xls", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
         Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1]; //取得sheet1
         worksheet.Shapes.AddPicture(AbosultedFilePath + fileName + ".jpg", MsoTriState.msoFalse, MsoTriState.msoTrue, 5, 5, cWidth, cHeight);
 
         try
         {
             workbook.Saved = true;
             workbook.SaveAs(AbosultedFilePath + fileName + ".xls", m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange,m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);
         }
         catch (Exception ex)
         {
             System.Web.HttpContext.Current.Response.Write("导出文件时出错,文件可能正被打开!\n" + ex.ToString());
             return false;
         }
 
         workbooks.Close();
 
         if (xlApp != null)
         {
             xlApp.Workbooks.Close();
             xlApp.Quit();
 
             int generation = System.GC.GetGeneration(xlApp);
             System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
 
             xlApp = null;
             System.GC.Collect(generation);
         }
         GC.Collect(); //强行销毁
 
         #region 强行杀死最近打开的Excel进程
         System.Diagnostics.Process[] excelProc = System.Diagnostics.Process.GetProcessesByName("EXCEL");
         System.DateTime startTime = new DateTime();
         int m, killID = 0;
         for (m = 0; m < excelProc.Length; m++)
         {
             if (startTime < excelProc[m].StartTime)
             {
                 startTime = excelProc[m].StartTime;
                 killID = m;
             }
         }
         if (excelProc[killID].HasExited == false)
         {
             excelProc[killID].Kill();
         }
         #endregion
 
         if (File.Exists(AbosultedFilePath + fileName + ".jpg"))
         {
             File.Delete(AbosultedFilePath + fileName + ".jpg");
         }
 
         if (saveExcel(AbosultedFilePath + fileName + ".xls"))
         {
             File.Delete(AbosultedFilePath + fileName + ".xls");
             return true;
         }
         else
         {
             return false;
         }
     }
 /*
* 保存Excel文件
*/
     public static bool saveExcel(string FileName)
     {
         try
         {
             string FullFileName = FileName;
             //FileName--要下载的文件名 
             FileInfo DownloadFile = new FileInfo(FullFileName);
             if (DownloadFile.Exists)
             {
                 System.Web.HttpContext curContext = System.Web.HttpContext.Current;
                 curContext.Response.Clear();
                 curContext.Response.ClearHeaders();
                 curContext.Response.Buffer = false;
                 curContext.Response.ContentType = "application/octet-stream";
                 curContext.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(DownloadFile.FullName, System.Text.Encoding.ASCII));
                 curContext.Response.AppendHeader("Content-Length", DownloadFile.Length.ToString());
                 curContext.Response.WriteFile(DownloadFile.FullName);
                 curContext.Response.Flush();
                 curContext.Response.End();
                 DownloadFile.Delete();
                 return true;
             }
             else
             {
                 //文件不存在
                 return false;
             }
         }
         catch
         {
             //打开时异常了
             return false;
         }
     }

核心方法 Workbooks.Open 说明

方法

Open()  打开一个Excel工作簿。

语法

Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application(); 
xlApp.Workbooks.Open(FileName,   UpdateLinks,   ReadOnly,   Format,   Password,   WriteResPassword,   IgnoreReadOnlyRecommended,   Origin,   Delimiter,   Editable,   Notify,   Converter,   AddToMRU);

参数说明

Workbooks:必选。该表达式返回一个   Workbooks   对象或   RecentFile   对象。   

FileName:String 类型,必选。要打开的Excel工作簿文件名称。   

UpdateLinks:Variant  类型,可选。指定文件中的链接的更新方式。如果省略本参数,则提示用户选择链接的更新方式。否则,该参数的取值应为下表的某个值。

取值 说明
0 不更新任何引用。
1 更新外部引用,但不更新远程引用。 
2 更新外部引用,但不更新外部引用。     
3 更新所有远程引用和外部引用。

    如果 Microsoft Excel 正在打开以 WKS、WK1 或 WK3 格式存储的文件并且 UpdateLinks 参数设为 2,则 Microsoft Excel 根据与该文件关联的图形创建图表。如果该参数设为 0,则不创建任何图表。   
ReadOnly:Variant 类型,可选。如果为 True 则以只读模式打开工作簿。   
Format:Variant 类型,可选。如果 Microsoft Excel 正在打开一个文本文件,则该参数用于指定分隔字符,如下表所示。如果省略本参数,则使用当前的分隔字符。  

取值 说明
1 制表符
2 逗号
3 空格     
4 分号
5 没有分隔符
6 自定义字符(参阅 Delimiter 参数)

Password:Variant 类型,可选。该字符串为用于打开一个受保护工作簿的密码。如果省略该参数并且指定工作簿已设置密码,则提示用户输入密。

WriteResPassword: Variant 类型,可选。该字符串为一个写保护工作簿的写入权密码。如果省略该参数并且指定工作簿已设置密码,则提示用户输入密码。   

IgnoreReadOnlyRecommended:Variant  类型,可选。如果为 True 则设置 Microsoft Excel 不显示建议只读消息(如果该工作簿以“建议只读”选项保存)。   

Origin:Variant 类型,可选。如果该文件为文本文件,则该参数用于指示该文件的来源于何种操作系统(以便对代码页和回车/换行(CR/LF)进行正确映射)。可为下列 XlPlatform 常量之一:   xlMacintosh、xlWindows 或 xlMSDOS。如果省略本参数,则使用当前操作系统。   

Delimiter:Variant  类型,可选。如果该文件为文本文件并且 Format 参数设为 6,则此参数用于指定用作分隔符的字符。例如,可使用 Chr(9) 代表制表符,使用“,”代表逗号,使用“;”代表分号或者使用自定义字符。如果该参数为字符串,则只使用该字符串的第一个字符。   

Editable:Variant 类型,可选。如果该文件为 Microsoft Excel 4.0 加载宏,则该参数为 True 时可在可见窗口中打开该加载宏。如果该参数设为 False 或者省略该参数,则该加载宏以隐藏方式打开,并且不能设为可见。本选项不能应用于由 Microsoft Excel 5.0 或更高版本的 Microsoft Excel 创建的加载宏。如果该文件是 Excel   模板,则参数为 True 时,会打开指定模板进行编辑。参数为 False 时,可根据指定模板打开新的工作簿。默认值为 False。   

Notify:Variant 类型,可选。如果该文件不能以可读写模式打开,则若该参数设为 True 可将该文件添加到文件通知列表。Microsoft Excel 将以只读模式打开该文件并轮询文件通知列表,当文件通知列表中的该文件可用时则通知用户。如果该参数设为   False,或者省略该参数,则不请求任何通知,并且不能打开任何不可用的文件。

Converter :Variant 类型,可选。打开文件时试用的第一个文件转换器的索引号。首先使用的是指定的文件转换器;如果该转换器不能识别此文件,则试用所有的转换器。转换器索引号由   FileConverters   方法所返回的转换器行号组成。     

AddToMru:Variant 类型,可选。如果为 True 则将该工作簿添加到最近使用文件列表中。默认值为 False。  

温馨提示

文章内容如果写的存在问题欢迎留言指出,让我们共同交流,共同探讨,共同进步~~~

文章如果对你有帮助,动动你的小手点个赞,鼓励一下,给我前行的动力。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。