用OLEDB写入Excel文件

时间:2020-03-05 18:51:57  来源:igfitidea点击:

有谁知道如何在C#中通过OLEDB写入Excel文件(.xls)?我正在执行以下操作:

OleDbCommand dbCmd = new OleDbCommand("CREATE TABLE [test$] (...)", connection);
   dbCmd.CommandTimeout = mTimeout;
   results = dbCmd.ExecuteNonQuery();

但是我收到一条OleDbException消息:

"Cannot modify the design of table
  'test$'.  It is in a read-only
  database."

我的连接似乎正常,我可以选择数据很好,但是似乎无法将数据插入excel文件,有人知道我如何通过OLEDB获得对excel文件的读/写访问权限吗?

解决方案

回答

几个问题:

  • 执行应用程序的用户(我们吗?)是否有权写入文件?
  • 该文件是只读的吗?
  • 连接字符串是什么?

如果使用的是ASP,则需要添加IUSER_ *用户,如本例所示。

回答

  • 如何检查为应用程序写入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\""

回答

我们需要在连接字符串中添加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\";

回答

进一步了解Michael Haren的答案。如果此代码在ASP.NET应用程序中运行(在IIS应用程序池中指定),则我们需要向XLS文件授予"修改"权限的帐户可能是"网络服务"。要确切地知道代码以哪个帐户运行,我们可以执行以下简单操作:

Response.Write(Environment.UserDomainName + "\" + Environment.UserName);

回答

我也在寻找并回答,但Zorantula的解决方案对我不起作用。
我在http://www.cnblogs.com/zwwon/archive/2009/01/09/1372262.html上找到了解决方案

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

IMEX = 1属性以导入模式打开工作簿,因此修改结构的命令(如CREATE TABLE或者DROP TABLE)无效。

我的工作连接字符串是:

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

回答

我在ASP.NET下运行,并且遇到"无法修改设计..."和"无法找到ISAM ..."错误消息。

我发现我需要:

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

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

注意,我也有IMEX = 1和连接字符串中的ReadOnly = false属性的问题。

b)向所有人授予对要在其中写入文件的文件夹的完全权限。通常,ASP.NET在NETWORK SERVICE帐户下运行,并且已经具有权限。但是,OleDb代码是不受管理的,因此它必须在其他安全上下文下运行。 (我目前太懒了,无法找出哪个帐户,所以我只使用了所有人。)