.net创建excel文件关键代码及部分说明

要在项目中添加com引用microsoft excel 11.0 object libary


Excel.ApplicationClass ac = new Excel.ApplicationClass();//application相当于excel执行程序,就是excel.exe
             ac.DefaultFilePath = "";
             ac.SheetsInNewWorkbook = 2;//在创建excel的xls文件的时候默认有两个sheet
             ac.DisplayAlerts = false;//在执行saveas方法时候不弹出提示对话框,比如有同名文件是否覆盖,设成false会直接覆盖
            
            
             Excel.Workbook wb = ac.Workbooks.Add(Type.Missing);//Workbook相当于一个excel的xls文件
             Excel.Worksheet ws = (Excel.Worksheet)ac.Worksheets[2];//因为前面设置了有两个sheet,所以这里是取得第2个sheet, Worksheet相当于excel文件中的一个sheet,另外注意excel的索引都是从1开始的


          
             ws.Cells[1, 1] = "hello121";//往第2个sheet中的第1行第1列的格子中赋值"hello";
             ac.Cells[1, 2] = "i love u";//这是往第一个sheet赋值,当像applicationclass中添加了workbook后它的cells应该只能访问到第1个sheet中的cell


             //保存文件,Excel.XlSaveAsAccessMode是设置文件的访问方式的,其他的参数可以省略
             wb.SaveAs(@"e:\a\test.xls", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missin,Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
          
            
             //重要,关闭excel,清除掉excel.exe进程  
             ac.Workbooks.Close();//关闭所有文件
             ac.Quit();//结束excel.exe,这行必须有,没有上一行也可以,就相当于关闭了excel应用程序,其中的文件也一同关闭了
            
            //以下几行至关重要,在ASP.NET中如无这几行,会导致excel进程无法清除的情况,这样最后会导致内存被每次导出启动的excel进程撑死,只有加上以下几行,才能将进程关闭。
             int generation = GC.GetGeneration(ac);
             System.Runtime.InteropServices.Marshal.ReleaseComObject(ac);
             ac = null;
             GC.Collect(generation);



ExcelApplication.WorkBook.SaveAs(filename,FileFormat, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup, AccessMode, ConflictResolution, AddToMru, TextCodePage, TextVisualLayout ,Local)

1、Filename: Variant 类型,可选。该字符串表示要保存的文件名。可包含完整路径。如果不指定路径,Microsoft Excel 将文件保存到当前文件夹中。

2、FileFormat: Variant 类型,可选。保存文件时使用的文件格式。要得到有效选项的列表,请参阅 FileFormat 属性。对于已有文件,其默认格式是上次指定的文件格式;对于新文件,默认格式为当前使用的 Excel 版本格式 ,可选常数如下:



xlAddIn 18
xlCSV 6
xlCSVMac 22
xlCSVMSDOS 24
xlCSVWindows 23
xlCurrentPlatformText -4158
xlDBF2 7
xlDBF3 8
xlDBF4 11
xlDIF 9
xlExcel2 16
xlExcel2FarEast 27
xlExcel3 29
xlExcel4 33
xlExcel4Workbook 35
xlExcel5 39
xlExcel7 39
xlExcel9795 43
xlHtml 44
xlIntlAddIn 26
xlIntlMacro 25
xlSYLK 2
xlTemplate 17
xlTextMac 19
xlTextMSDOS 21
xlTextPrinter 36
xlTextWindows 20
xlUnicodeText 42
xlWebArchive 45
xlWJ2WD1 14
xlWJ3 40
xlWJ3FJ3 41
xlWK1 5
xlWK1ALL 31
xlWK1FMT 30
xlWK3 15
xlWK3FM3 32
xlWK4 38
xlWKS 4
xlWorkbookNormal -4143
xlWorks2FarEast 28
xlWQ1 34
xlXMLData 47
xlXMLSpreadsheet 46




3、Password :Variant 类型,可选。它是一个区分大小写的字符串(最长不超过 15 个字符),用于指定文件的保护密码。

4、WriteResPassword :Variant 类型,可选。 该字符串表示文件的写保护密码。如果文件保存时带有密码,但打开文件时不输入密码,则该文件以只读方式打开。

5、ReadOnlyRecommended : Variant 类型,可选。如果该值为 True,则在打开文件时显示一条信息,提示该文件以只读方式打开。

6、CreateBackup: Variant 类型,可选。如果该值为 True,则创建备份文件。

7、AccessMode :XlSaveAsAccessMode 类型,可选,如果省略此参数,则不会更改访问方式。如果在没有改变文件名的情况下保存共享列表,则可以忽略参数。若要改变访问方式,请使用 ExclusiveAccess 方法。 以下是可选常量:xlExclusive 3 不含方式xlNoChange 1 不更改访问方式,缺省值xlShared 2 共享列表



8、ConflictResolution : XlSaveConflictResolution 类型,如果忽略本参数,则显示****处理对话框。可选常量如下:


xlLocalSessionChanges 2 自动接受本地用户的修改
xlOtherSessionChanges 3 接受除本地用户之外的其他用户的更改
xlUserResolution 1 显示****解决方案对话框


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

10、TextCodePage :Variant 类型,可选。不在美国英语版的 Microsoft Excel 中使用。

11、TextVisualLayout :Variant 类型,可选。不在美国英语版的 Microsoft Excel 中使用。

12、Local :Variant 类型,可选。如果该值为 True,则以 Microsoft Excel(包括控制面板设置)的语言保存文件。如果该值为 False(默认值),则以 Visual Basic for Applications (VBA) 的语言保存文件,其中 Visual Basic for Applications (VBA) 为典型安装的美国英语版本,除非 VBA 项目中的 Workbooks.Open 来自旧的国际化的 XL5/95 VBA 项目



excel大致的模式应该是composition模式。
applicationclass (excel应该程序)->(包含)Workbook(excel文档)->(包含)Worksheet(文档中的sheet)->(包含)Range(cell)


关于office开发
http://msdn2.microsoft.com/en-us/library/bb241279.aspx 说明OFFICE存储格式

xlExcel8 56 才是2007中存成97-2003的格式,如果有workbook的saveas方法,要加上第2个文件格式参数才能存成97-2003格式,设置defaultsaveformat没有用对这个方法。

如果不加第2个格式参数,它会存成2007的xlsx的格式。


另外关闭excel进程还可以用强杀进程的办法

GC.Collect();//强行销毁</p>
<p>         #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();
         }

但我觉得杀进程的办法在并发环境下不可用。
原文地址:https://www.cnblogs.com/Randy0528/p/1659510.html