打开时更新现有的Excel文件

我读了很多关于如何从C#到Excel的沟通,看到了一些很好的参考。

事情是我正在寻找一种简单的方法来更新现有的Excel文件,而它仍然是开放的,使用最先进的方式(例如linq)而不是OLEDB。

这应该是几行代码描述如何读取当前单元格,更新他的价值,并考虑到文件可能不存在,但如果它确实存在和打开,它只会更新文件,而不通知文件是已经存在。 如果该文件不存在,则会创build一个新文件。

SO:1.连接到一个excel文件,检查是否存在,如果没有创build一个
2.从单元格中读取
3.更新单元格
4.这样做,而excel表可以仍然开放野生。

我已经去过以下地方了:

http://social.msdn.microsoft.com/Forums/vstudio/en-US/ef11a193-54f3-407b-9374-9f5770fd9fd7/writing-to-excel-using-c

以编程方式更新Excel文档

使用oledb更新excel文件的特定单元格

我使用了下面的代码:

if (File.Exists(@"C:\\temp\\test.xls")) { Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application(); Microsoft.Office.Interop.Excel.Workbooks workBooks = excelApp.Workbooks; Microsoft.Office.Interop.Excel.Workbook workBook = workBooks.Open(@"C:\\temp\\test.xls"); Microsoft.Office.Interop.Excel.Worksheet workSheet = workBook.Worksheets.get_Item(1); int nColumns = workSheet.UsedRange.Columns.Count; int nRows = workSheet.UsedRange.Rows.Count; for (int i = 2; i < nRows; i++) { workSheet.Columns["1","A"] = "test"; } workBook.Save(); workBook.Close(); } 

所以我使用VSTO Contrib来帮助COM Interop和内存pipe理,这就是为什么你会看到.WithComCleanup()

打开电子表格:

 try { using (var xlApp = new Microsoft.Office.Interop.Excel.Application().WithComCleanup()) using (var wrkbooks = xlApp.Resource.Workbooks.WithComCleanup()) using (var wrkbook = wrkbooks.Resource.Open(filePath, false, true).WithComCleanup()) { 

如果excel文件已经打开,那么绕过只读按照这个技巧 :

 wrkbooks.Resource.Open(filePath, false, FALSE).WithComCleanup()) 

以下是我如何迭代表单(请注意,某些Excel工作表是ChartSheets):

 foreach (object possibleSheet in xlApp.Resource.Sheets) { Microsoft.Office.Interop.Excel.Worksheet aSheet = possibleSheet as Microsoft.Office.Interop.Excel.Worksheet; if (aSheet == null) continue; 

以下是获取您感兴趣的工作表的一个快速方法:

 activeSheet = wrkbook.Resource.Sheets[sheetToImport]; 

您可以按照您的指示阅读和写入单元格:

 for (int i = 2; i < nRows; i++) { activeSheet.Columns["1","A"] = "test"; } 

这里是我如何closuresExcel:

 MathematicaAPI.XlHelper.CloseExcel((Worksheet)activeSheet, (Workbook)wrkbook.Resource , (Workbooks)wrkbooks.Resource); public static void CloseExcel(Worksheet activeSheet, Workbook wrkbook, Workbooks wrkbooks) { //http://support.microsoft.com/kb/317109 -> excel just wont close for some reason if (activeSheet != null) { Marshal.FinalReleaseComObject(activeSheet); activeSheet = null; } if (wrkbook != null) { wrkbook.Saved = true; wrkbook.Close(Microsoft.Office.Interop.Excel.XlSaveAction.xlDoNotSaveChanges); } if (wrkbooks != null) { wrkbooks.Close(); } GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); GC.WaitForPendingFinalizers(); } 

有时Excel不会closures,你必须杀死它(当然试图closures它之后) – 我不推荐这个,但是如果你不能追踪未处理的内存,一切都失败了…

 if (xlApp != null) { ExcelDataSourceHelper.GetWindowThreadProcessId(new IntPtr(xlApp.Resource.Hwnd), ref excelProcessId); } if (excelProcessId > 0) { XlHelper.KillProcess(excelProcessId); } public static void KillProcess(int excelProcessId) { if (excelProcessId > 0) { System.Diagnostics.Process ExcelProc = null; try { ExcelProc = System.Diagnostics.Process.GetProcessById(excelProcessId); if (ExcelProc != null) { ExcelProc.Kill(); } } catch { } } } 

注意:我通过使用VSTO Contrib来降低需要杀死Excel的机会。

好的,谢谢大家试图解决问题的解决scheme是使用Excel 2011/2013插件可以沟通excel作为一个插件

为Microsoft Office Excel创build一个应用程序级加载项。 您在这种解决scheme中创build的function可供应用程序本身使用,无论哪些工作簿已打开。

你可以访问MSDN