如何检查excel工作簿已经在C#中打开
本文关键字:工作簿 何检查 检查 excel | 更新日期: 2023-09-27 18:25:56
我正在应用程序中打开多个excel文件。有些将在应用程序启动时自动打开,而有些则在运行时打开。
现在我想通过点击按钮从excel文件中获取数据。但在打开它之前,我想检查一下excel文件是否已经打开。
- 如果它是打开,我想直接从中读取
- 如果未打开,我想打开它并从中读取
但在这两种情况下,我都不想在阅读后关闭文件。"
我正在使用这种方法打开excel文件。
objExcel = new Excel.ApplicationClass();
objWorkbook = objExcel.Workbooks.Open(...);`
请帮帮我,我是C#的新手。
如果我理解得很清楚,你实际上想知道这个winform应用程序是否已经打开了一些文件,对吧?
如果是这样的话,我认为它应该相当简单——只需将打开的工作簿缓存到某个字典中即可:
static Dictionary<string, Workbook> _openedWorkBooks = new Dictionary<string, Workbook>();
public static Workbook GetWorkbook(string filePath) {
Workbook wkb = null;
if (!(_openedWorkBooks.TryGetValue(filePath, out wkb)))
{
// Open the file and store it into the dictionary
}
return wkb;
}
// remember to remove it when it's closed
public static CloseWorkbook()
{ // need to remove the corresponding key from the dictionary
}
此外,你也可以使用excel应用程序的单个实例,然后所有打开的工作簿都可以从应用程序中重新发布。然而,Workbooks有时会引发一些异常(不知道为什么,但我以前确实遇到过)。
var app = new Microsoft.Office.Interop.Excel.Application(); var bk1 = app.Workbooks.Open("c:'temp'myfile.xls"); var allOpenBks = app.Workbooks;
实际上,调用IsFileLock方法来检查文件是否已被其他应用程序打开仍然是值得的,否则您可能会遇到一些错误。
如果您有读写访问权限,您可以检查k:
/// <summary>
/// Check wether a file is locked
/// </summary>
/// <param name="file"></param>
/// <returns></returns>
public static bool IsFileLocked(FileInfo file)
{
FileStream stream = null;
try
{
stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
}
catch (IOException)
{
//the file is unavailable because it is:
//still being written to
//or being processed by another thread
//or does not exist (has already been processed)
return true;
}
finally
{
if (stream != null)
stream.Close();
}
//file is not locked
return false;
}
该代码来自StackOverflow上的其他代码。
是否.xlsx?如果是这样,您可以使用OpenXML读取和写入Excel文件。