gpt4 book ai didi

c# - 使用 OleDb 以只读模式打开 Excel 文件?

转载 作者:行者123 更新时间:2023-12-05 07:35:20 25 4
gpt4 key购买 nike

我们有一些代码可以打开 Excel(XLSX 和 XLS)文件并从中加载数据。我们将 OleDbConnection 与 Microsoft Access 数据库引擎 (ACE) 结合使用。

当相关 Excel 文件位于网络共享上并且用户在 Excel 中打开该文件时,此代码偶尔会引发异常。我着手尝试解决此问题,我的假设是我可以将一个设置添加到连接字符串以配置只读访问权限。

在我的研究中,我发现这个问题多次提出,并给出了各种推荐的解决方案。不幸的是,我发现它们都不起作用,而且我找不到任何关于 Excel 连接字符串设置的官方 Microsoft 文档。

我开始觉得我想做的事情是不可能的,希望得到任何帮助。

这是我的测试代码:

const string excelFile = @"\\server\folder\file.xlsx";

var connStrings = new[] {
// Base, no "read only" configuration
$"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={excelFile};Extended Properties=\"Excel 12.0;IMEX=1\"",

// Mode=Read
//
// C# ace oledb 12 read-only file
// https://stackoverflow.com/questions/45165570/c-sharp-ace-oledb-12-read-only-file
//
// OleDbConnection Read Only Mode
// https://social.msdn.microsoft.com/Forums/office/en-US/498cd52a-b0ee-4c8d-8943-2b76055b4130/oledbconnection-read-only-mode?forum=accessdev
$"Provider=Microsoft.ACE.OLEDB.12.0;Mode=Read;Data Source={excelFile};Extended Properties=\"Excel 12.0;IMEX=1\"",

// READONLY=TRUE (and variations) in Extended Properties
//
// Excel source read only?
// https://social.msdn.microsoft.com/Forums/sqlserver/en-US/d03e4b1a-6be0-4b3c-8b31-42d6fc79bf39/excel-source-read-only?forum=sqlintegrationservices
//
// Working with MS Excel(xls / xlsx) Using MDAC and Oledb
// https://www.codeproject.com/Articles/37055/Working-with-MS-Excel-xls-xlsx-Using-MDAC-and-Oled
$"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={excelFile};Extended Properties=\"Excel 12.0;IMEX=1;READONLY=TRUE\"",
$"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={excelFile};Extended Properties=\"Excel 12.0;IMEX=1;ReadOnly=true;\"",
$"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={excelFile};Extended Properties=\"Excel 12.0;IMEX=1;MODE=READ;READONLY=TRUE\"",

// Wild guesses
$"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={excelFile};Extended Properties=\"Excel 12.0;IMEX=1;READONLY=1\"",
$"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={excelFile};Extended Properties=\"Excel 12.0;IMEX=1;MODE=READ;READONLY=1\""
};

for ( var i = 0; i < connStrings.Length; i++ ) {
var conn = new OleDbConnection( connStrings[i] );

try {
conn.Open();
Console.WriteLine( $"{i}: Success" );
conn.Close();
}
catch ( OleDbException ex ) {
Console.WriteLine( $"{i}: FAIL: {ex.Message}" );
}
finally {
conn.Dispose();
}
}

当目标文件在网络共享的 Excel 中打开时,所有连接字符串变体都会失败,如下所示:

0: FAIL: The Microsoft Access database engine cannot open or write to the file ''. It is already opened exclusively by another user, or you need permission to view and write its data.
1: FAIL: The Microsoft Access database engine cannot open or write to the file ''. It is already opened exclusively by another user, or you need permission to view and write its data.
2: FAIL: The Microsoft Access database engine cannot open or write to the file ''. It is already opened exclusively by another user, or you need permission to view and write its data.
3: FAIL: The Microsoft Access database engine cannot open or write to the file ''. It is already opened exclusively by another user, or you need permission to view and write its data.
4: FAIL: The Microsoft Access database engine cannot open or write to the file ''. It is already opened exclusively by another user, or you need permission to view and write its data.
5: FAIL: The Microsoft Access database engine cannot open or write to the file ''. It is already opened exclusively by another user, or you need permission to view and write its data.
6: FAIL: The Microsoft Access database engine cannot open or write to the file ''. It is already opened exclusively by another user, or you need permission to view and write its data.

最佳答案

您可以创建该文件的副本以绕过只读访问权限。

尝试 System.IO 命名空间中的 File.Copy() 方法将 Excel 复制到另一个位置,例如 C:/temp。

然后用OLEDB打开它来读取和关闭/删除它

关于c# - 使用 OleDb 以只读模式打开 Excel 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49619452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com