C#打开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。
温馨提示
文章内容如果写的存在问题欢迎留言指出,让我们共同交流,共同探讨,共同进步~~~
文章如果对你有帮助,动动你的小手点个赞,鼓励一下,给我前行的动力。
- 点赞
- 收藏
- 关注作者
评论(0)