近来在一直研究导出Excel的东东,整的我晕头转向,项目中需要把表格数据和图片同时导入到一个Excel文件里,然后保存在本地。如果是简单的表头是很容易导出的,由于表头包含复杂的,就需要通过xml形式解析,然后导入到Excel,然而导入图片这种方式行不通,只能才去其它的形式。
本人思路是这样的:先将表格里的数据通过xml的形式导入到Excel文件里并保存,然后打开重新打开这个Excle文件,在把之前保存的图片插入到这个Excel文件里,客户端就可以下载这个Excel文件,记得下载后删除原来保存的图片和Excel文件。
在这就主要讲一下打开Excel文件和插入图片:
2 {
3 object m_objOpt = System.Reflection.Missing.Value;
4 // 检查Excel文件是否存在,如果不存在,则退出
5 if ( ! File.Exists(AbosultedFilePath + fileName + " .xls " ))
6 return false ;
7
8 // 创建Excel应用程序对象,如果未创建成功则退出
9 Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
10 if (xlApp == null )
11 {
12 System.Web.HttpContext.Current.Response.Write( " 无法创建Excel对象,可能你的电脑未装Excel " );
13 return false ;
14 }
15
16 Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks;
17 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);
18 Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[ 1 ]; // 取得sheet1
19 worksheet.Shapes.AddPicture(AbosultedFilePath + fileName + " .jpg " , MsoTriState.msoFalse, MsoTriState.msoTrue, 5 , 5 , cWidth, cHeight);
20
21 try
22 {
23 workbook.Saved = true ;
24 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);
25 }
26 catch (Exception ex)
27 {
28 System.Web.HttpContext.Current.Response.Write( " 导出文件时出错,文件可能正被打开!\n " + ex.ToString());
29 return false ;
30 }
31
32 workbooks.Close();
33
34 if (xlApp != null )
35 {
36 xlApp.Workbooks.Close();
37 xlApp.Quit();
38
39 int generation = System.GC.GetGeneration(xlApp);
40 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
41
42 xlApp = null ;
43 System.GC.Collect(generation);
44 }
45 GC.Collect(); // 强行销毁
46
47 #region 强行杀死最近打开的Excel进程
48 System.Diagnostics.Process[] excelProc = System.Diagnostics.Process.GetProcessesByName( " EXCEL " );
49 System.DateTime startTime = new DateTime();
50 int m, killID = 0 ;
51 for (m = 0 ; m < excelProc.Length; m ++ )
52 {
53 if (startTime < excelProc[m].StartTime)
54 {
55 startTime = excelProc[m].StartTime;
56 killID = m;
57 }
58 }
59 if (excelProc[killID].HasExited == false )
60 {
61 excelProc[killID].Kill();
62 }
63 #endregion
64
65 if (File.Exists(AbosultedFilePath + fileName + " .jpg " ))
66 {
67 File.Delete(AbosultedFilePath + fileName + " .jpg " );
68 }
69
70 if (saveExcel(AbosultedFilePath + fileName + " .xls " ))
71 {
72 File.Delete(AbosultedFilePath + fileName + " .xls " );
73 return true ;
74 }
75 else
76 {
77 return false ;
78 }
79 }
80
81 public static bool saveExcel( string FileName)
82 {
83 try
84 {
85 string FullFileName = FileName;
86 // FileName--要下载的文件名
87 FileInfo DownloadFile = new FileInfo(FullFileName);
88 if (DownloadFile.Exists)
89 {
90 System.Web.HttpContext curContext = System.Web.HttpContext.Current;
91 curContext.Response.Clear();
92 curContext.Response.ClearHeaders();
93 curContext.Response.Buffer = false ;
94 curContext.Response.ContentType = " application/octet-stream " ;
95 curContext.Response.AppendHeader( " Content-Disposition " , " attachment;filename= " + HttpUtility.UrlEncode(DownloadFile.FullName, System.Text.Encoding.ASCII));
96 curContext.Response.AppendHeader( " Content-Length " , DownloadFile.Length.ToString());
97 curContext.Response.WriteFile(DownloadFile.FullName);
98 curContext.Response.Flush();
99 curContext.Response.End();
100 DownloadFile.Delete();
101 return true ;
102 }
103 else
104 {
105 // 文件不存在
106 return false ;
107 }
108 }
109 catch
110 {
111 // 打开时异常了
112 return false ;
113 }
114 }
下面说一下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)
参数说明:
xlApp.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。
如果大家还有其它好的方法,或者文章中有错误,请提出指正。