【发布时间】:2017-04-20 13:33:15
【问题描述】:
我在将 OLE DB 连接到 Excel 工作簿时遇到了一些非常奇怪的问题。
我们的系统有一个大型 Excel 启用宏的模板(我们有 Excel 2010 和 Excel 2016)。有时用户会添加图片、图表、选项卡等,当尝试读取用户无法访问的工作簿中的隐藏选项卡时,会出现错误外部表不是预期格式。 p>
通常情况下,我们让用户下载新模板并重做工作而不添加图片。
最近,这种行为发生了很多次,我试图在我的开发计算机上进行调查。我发现在文件上传过程中,我无法通过网站打开与“损坏”文件的连接,其中文件被读入字节流,并使用 OleDbConnection 创建和打开临时 .xlsm 文件,并从中读取数据一个隐藏的标签。
我对文件所做的任何操作都不会打开它以通过 IIS 中托管的代码打开它。这包括以下内容:
- 删除所有图片
- 删除除隐藏选项卡以外的所有选项卡
- 取消隐藏我们从中读取的标签
- 将工作簿另存为 xlsx 以删除宏
- 将工作簿保存为 2003 - 2007 工作簿,然后保存回 xlsx 或 xlsm
网站在 .NET Framework 4.0 下运行,并且在 IIS 下运行。
为了我的调查,我编写了以下代码并将其托管在 相同 开发计算机上的测试 Web 应用程序的页面中,该应用程序托管在 .NET Framework 下的 IIS Express 中4.0 并成功打开并从原始“损坏”文件中读取数据。
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class ReadExcelTabToDataSet : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string szSheetName = @"C:\Temp\Test.xlsm";
string szConnection = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=\"Excel 12.0;HDR=YES\";Data Source=" + szSheetName;
string szQuery = "Select 'Configuration$' as Sheet, * From [Configuration$B1:S2]";
string szExcelTableName = "ValidateFlag";
DataSet ds;
using (OleDbConnection conn = new OleDbConnection(szConnection))
{
using (OleDbDataAdapter da = new OleDbDataAdapter(szQuery, conn))
{
conn.Open();
ds = new DataSet();
da.Fill(ds, szExcelTableName);
}
}
}
}
这引发了很多警钟,让我感到难过。这个测试似乎排除了一切,但 OleDb 在 IIS 中托管时的执行方式除外。当这个页面被复制到我们的站点时,它在 conn.Open() 上失败了。
有谁明白为什么会发生这种情况以及如何解决它?我不想因为此类奇怪的 Microsoft 问题而惩罚我们的用户。
谢谢,
编辑 1
如果文件被标记为“只读”并且它位于具有完全访问权限的目录中,则可以打开文件并且可以成功读取数据。
这仍然存在问题,因为我们正在打开文件、检查信息并最后在选项卡上进行更改。
【问题讨论】:
-
IIS 机器是否安装了 Microsoft Access Database Engine 2010 Redistributable 或其他任何东西?它是正确的版本 - 32/64 位吗?另请参阅此问题以获取想法。 stackoverflow.com/questions/1139390/…
-
在测试用例中,IIS机器是我的开发机器,肯定有它需要的一切。在我们部署的环境中,情况也是如此。您提供的链接没有解释这一点,因为我已经在使用 Microsoft.ACE.OLEDB.12 连接。
标签: c# oledbconnection oledbexception ms-jet-ace