在现有 Excel 文件打开时对其进行更新
本文关键字:更新 Excel 文件 | 更新日期: 2023-09-27 18:30:41
我读了很多关于如何从C#到Excel进行通信的文章,并看到了一些很好的参考资料。
问题是我正在寻找一种简单的方法来更新现有的 excel 文件,同时它仍然打开,使用最先进的方法(例如 LINQ),而不是 OLEDB。
这应该是几行代码,描述如何读取当前单元格,更新他的值并考虑到文件可能不存在,但如果它确实存在并打开,它只会更新文件而不通知文件已经存在。如果该文件不存在,它将创建一个新文件。
所以:1.连接到Excel文件,检查它是否存在,如果没有,则创建一个
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 互操作和内存管理,这就是您看到.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 工作表是图表工作表):
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";
}
以下是我关闭 Excel 的方法:
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 就是无法关闭,您必须杀死它(当然是在尝试正确关闭它之后) - 我不建议这样做,但如果您无法追踪未释放的内存并且所有其他内容都失败了,那么......
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与Using's
一起使用来减少需要杀死Excel的机会。
谢谢大家尝试解决问题该解决方案是使用Excel 2011/2013加载项,该加载项可以将Excel作为插件进行通信
为 Office Excel 创建应用程序级外接程序Microsoft。在此类解决方案中创建的功能可用于应用程序本身,无论打开了哪些工作簿。
您可以访问 MSDN