使用OLEDB向Excel文件中写入数据

8
有人知道如何在C#中通过OLEDB写入Excel文件(.xls)吗?我正在尝试以下方法:
   OleDbCommand dbCmd = new OleDbCommand("CREATE TABLE [test$] (...)", connection);
   dbCmd.CommandTimeout = mTimeout;
   results = dbCmd.ExecuteNonQuery();

但是我遇到了一个OleDbException异常,其中包含以下信息:

"无法修改表 'test$' 的设计。它在只读数据库中。"

我的连接似乎没问题,我可以正常选择数据,但是我似乎无法将数据插入Excel文件中,请问有人知道如何通过OLEDB获得读/写访问Excel文件吗?


工作簿已经有一个名为test$的工作表吗? - Kearns
7个回答

14

我也在寻找答案,但是Zorantula的解决方案对我没有用。

我在http://www.cnblogs.com/zwwon/archive/2009/01/09/1372262.html上找到了解决方案。

我删除了ReadOnly=false参数和IMEX=1扩展属性。

IMEX=1属性以导入模式打开工作簿,因此结构修改命令(如CREATE TABLEDROP TABLE)无法使用。

我的连接字符串如下:

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=workbook.xls;Mode=ReadWrite;Extended Properties=\"Excel 8.0;HDR=Yes;\";"

8

您需要在连接字符串中添加 ReadOnly=False;

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=fifa_ng_db.xls;Mode=ReadWrite;ReadOnly=false;Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\";

7
不完全正确-使用ReadOnly属性会导致错误"System.Data.OleDb.OleDbException:无法找到可安装的ISAM。"是IMEX=0防止文件只读。对我有效的字符串(C#)是:@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Mode=ReadWrite;Extended Properties=""Excel 8.0;HDR=YES;MaxScanRows=0;IMEX=0"";" - rohancragg
2
所有必要的是 Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Docs\Test.xls;Mode=ReadWrite;Extended Properties=""Excel 8.0;HDR=Yes""。MaxScanRows 和 IMEX 在一定程度上依赖于注册表设置,通常不是必需的。 - Fionnuala

2

我之前也遇到过同样的问题。只需删除扩展属性IMEX=1即可解决问题。这样,您的表格就会被创建在您的Excel文件中...


1
几个问题:
  • 执行你的应用程序的用户(你?)是否有写入该文件的权限?
  • 该文件是否为只读?
  • 你的连接字符串是什么?

如果你正在使用ASP,你需要像this example中那样添加IUSER_*用户。


0

我在ASP.NET下运行时,遇到了“无法修改设计…”和“无法定位ISAM…”的错误信息。

我发现我需要:

a)使用以下连接字符串:

Provider=Microsoft.Jet.OLEDB.4.0;Mode=ReadWrite;Extended Properties='Excel 8.0;HDR=Yes;';Data Source=" + {文件路径};

请注意,我也遇到了连接字符串中IMEX=1ReadOnly=false属性的问题。

b)将EVERYONE授予文件夹的完全权限,以便写入文件。通常,ASP.NET在NETWORK SERVICE帐户下运行,并且已经具有权限。但是,OleDb代码是非托管的,因此它必须在其他安全上下文中运行。(我目前懒得弄清楚是哪个帐户,所以我只使用了EVERYONE。)


0
进一步回答迈克尔·哈伦的问题。如果此代码在ASP.NET应用程序中运行(在IIS应用程序池中指定),您将需要授予修改XLS文件的权限给NETWORK SERVICE账户。要确切了解您的代码正在以哪个账户运行,您可以简单地执行以下操作:
Response.Write(Environment.UserDomainName + "\\" + Environment.UserName);

0
  • 我该如何检查我的应用程序对Excel文件写入的权限(我正在使用Excel 2007)?
  • 据我所知,该文件不是只读或受保护的。
  • 我的连接字符串是:

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=fifa_ng_db.xls;Mode=ReadWrite;Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\""


通过右键单击并点击安全或权限选项卡来检查权限。连接到Excel文件时是否已关闭? - Michael Haren
你应该尝试使用IMEX=0。 - rohancragg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接