使用c#写入现有Excel文件

我试图打开(或创建一个新的xls)Excel文件并为其写一些值。 虽然,如果我只是创建一个新的xls文件,下面的程序工作得很好,我遇到了一些问题

**mWorkBook = oXL.Workbooks.Open (path, 0, false, 5, "", "", false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);** 

这是错误:无法访问“LOG.xls”。 该文件可能已损坏,位于未响应的服务器上或只读。 它不是只读的,它没有被破坏(因为有时文件是在运行时创建的)。 那有什么问题呢?

 private static Microsoft.Office.Interop.Excel.Workbook mWorkBook; private static Microsoft.Office.Interop.Excel.Sheets mWorkSheets; private static Microsoft.Office.Interop.Excel.Worksheet mWSheet1; private static Microsoft.Office.Interop.Excel.Application oXL; private void btnSignIn_Click ( object sender, EventArgs e ) { string path = "D:\\LOG.xls"; if(!File.Exists(path)) { File.Create (path); } oXL = new Microsoft.Office.Interop.Excel.Application (); oXL.Visible = true; oXL.DisplayAlerts = false; //error on this line mWorkBook = oXL.Workbooks.Open (path, 0, false, 5, "", "", false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false); //Get all the sheets in the workbook mWorkSheets = mWorkBook.Worksheets; //Get the allready exists sheet mWSheet1 = (Microsoft.Office.Interop.Excel.Worksheet)mWorkSheets.get_Item ("Sheet1"); Microsoft.Office.Interop.Excel.Range range = mWSheet1.UsedRange; int colCount = range.Columns.Count; int rowCount = range.Rows.Count; for ( int index = 1; index < 15; index++ ) { mWSheet1.Cells [rowCount + index, 1] = rowCount + index; mWSheet1.Cells [rowCount + index, 2] = "New Item" + index; } mWorkBook.SaveAs (path, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); mWorkBook.Close (Missing.Value, Missing.Value, Missing.Value); mWSheet1 = null; mWorkBook = null; oXL.Quit (); GC.WaitForPendingFinalizers (); GC.Collect (); GC.WaitForPendingFinalizers (); GC.Collect (); } 

File.Create的使用在这里不合适。 它返回一个(空白) FileStream ,而不是Excel文件( 使用.xls定义路径不会创建Excel文件… )。

并且由于您没有关闭并处理它,当您尝试打开它时会有一个例外,因为它已经在使用中(即使您发布它也会有任何exception,因为您还没有创建Excel文件在这个阶段 )。

因此,如果工作簿存在,您可以使用oXL.Workbooks.Open打开它。 如果工作簿不存在, 必须使用: oXL.Workbooks.Add( )创建它,然后调用mWorkBook.SaveAs(...)方法来真正创建它。

 oXL = new Microsoft.Office.Interop.Excel.Application(); oXL.Visible = true; oXL.DisplayAlerts = false; string path = "D:\\LOG.xls"; if (!File.Exists(path)) { mWorkBook = oXL.Workbooks.Add; } else { mWorkBook = oXL.Workbooks.Open(path, 0, false, 5, "", "", false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false); } 

(希望VB => C#是正确的!)

在您的SaveAs方法中,如果要创建特定版本的Excel文件, 则必须设置正确的FileFormat (再次在路径中设置.xls是不够的……)

可选对象。 保存文件时使用的文件格式。 有关有效选项的列表,请参阅FileFormat属性。 对于现有文件,默认格式是指定的最后一种文件格式; 对于新文件,默认值是所使用的Excel版本的格式

希望这可以帮助。

如果工作簿不存在,创建工作簿的更好方法是:

 Excel.Workbook newWorkbook = excelApplication.Workbooks.Add(); 

File.Create()返回FileStream的实例,如果要访问该文件,则需要关闭该实例。 你可以改变..

  if(!File.Exists(path)) { File.Create (path); } 

  if(!File.Exists(path)) { File.Create (path).Close(); }