我遇到一些OLE DB连接到Excel工作簿的非常奇怪的问题。IIS和OLE DB外部表格未处于预期格式
我们的系统有一个大型Excel宏启用模板(我们有Excel 2010和Excel 2016)。有时用户会添加出现错误的图片,图表,选项卡等尝试读取用户无法访问的工作簿中的隐藏选项卡时,外部表的格式不是。
通常,我们让用户下载一个新模板并在不添加图片的情况下重做工作。
最近发生了很多这种行为,我试图在我的开发计算机上进行调查。我发现,在文件上传过程中,我无法通过网站打开“损坏”文件的连接,其中文件被读入字节流中,并且使用OleDbConnection创建并打开临时.xlsm文件,并从中读取数据一个隐藏的标签。
我对文件做的任何事情都不会打开它,通过托管在IIS中的代码打开它。这包括以下内容:
- 删除所有照片
- 删除所有选项卡,但隐藏的标签
- 取消隐藏我们从
- 读取工作簿保存为XLSX移除宏
- 保存的标签工作簿作为2003 - 2007年工作簿,然后保存回xlsx或xlsm
该网站在.NET Framework 4.0下运行并且是r在IIS下unning。
对于我的调查,我写了下面的代码,并在.NET Framework 4.0中的IIS快递托管的测试Web应用程序在页面托管它相同开发计算机上,它成功地打开和读取数据从原来的“损坏”文件。
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()上失败。
有谁知道为什么会发生这种情况,以及如何解决它?我不想惩罚我们的用户这样的奇怪的微软问题。
感谢,
编辑1
如果文件被标记为“只读”,它是在具有完全访问权限的目录,那么该文件可以打开和数据可能阅读成功。
由于我们打开文件,检查信息并最终在选项卡上进行更改,这仍然存在问题。
IIS计算机是否安装了Microsoft Access数据库引擎2010 Redistributable或其他什么?它是正确的版本 - 32/64位?有关想法,请参阅此问题。 http://stackoverflow.com/questions/1139390/excel-external-table-is-not-in-the-expected-format – Steve
在测试案例中,IIS机器是我的开发机器,它绝对拥有它所需要的一切。在我们的部署环境中,情况也是如此。您提供的链接没有解释这是因为我已经在使用Microsoft.ACE.OLEDB.12连接。 –