IIS 和 OLE DB 外部 table 不是预期的格式

IIS and OLE DB External table is not in the expected format

我在 OLE DB 连接到 Excel 工作簿时遇到了一些非常奇怪的问题。

我们的系统有一个大型 Excel 启用宏的模板(我们有 Excel 2010 和 Excel 2016)。有时,用户会添加图片、图表、选项卡等,在尝试读取工作簿中的隐藏选项卡时出现错误 外部 table 不符合预期格式用户不访问。

一般情况下,我们让用户下载一个新模板,不加图片重做。

最近,这种行为发生了很多次,我试图在我的开发计算机上进行调查。我发现在文件上传过程中无法通过网站打开与 "corrupted" 文件的连接,文件被读入字节流并使用 OleDbConnection 创建和打开临时 .xlsm 文件,数据是从隐藏的标签中读取。

我对该文件所做的任何操作都无法通过 IIS 中托管的代码将其打开。这包括以下内容:

该网站在 .NET Framework 4.0 下 运行,在 IIS 下运行。

为了我的调查,我编写了以下代码并将其托管在 同一台 开发计算机上的一个测试 Web 应用程序的页面中托管在 .NET Framework 4.0 下的 IIS Express 中,它成功打开并从原始 "corrupted" 文件中读取数据。

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

如果文件被标记为"read-only"并且位于具有完全访问权限的目录中,则可以打开文件并成功读取数据。

这仍然存在问题,因为我们正在打开文件、检查信息,最后在选项卡上进行更改。

"External table is not in the expected format" 是一个一般性错误,由于(遗憾的)很多原因,在我的情况下,这是因为我没有正确解密文件。

我最好的办法是检查你的程序,用一个全新的文件测试它,然后找到错误。

祝你好运!

我开始研究使用 ClosedXml(一个围绕 OpenXML 构建的 .NET 解决方案)来解决我遇到的许多 OleDb 问题。尝试使用 ClosedXml 打开 "corrupted" 工作簿时,我收到一条错误消息,我可以使用 Microsoft Open XML SDK 进行复制。

问题的原因是表单按钮执行 VBA 代码以将模板中的数据从一个选项卡复制到另一个选项卡。表单按钮中的文本包含一个回车 return(即 br)。当模板的大小变大并且用户保存他们的工作时,Excel 通过不终止 br 来破坏 HTML。虽然 ACE OleDB 命令没有提供任何指示,但 Open XML SDK 提供了以下消息:

无法打开文件:/xl/drawings/vmlDrawing4.vml 部分:第 19 行第 29 行的 'br' 开始标记与 'font' 的结束标记不匹配。第 20 行,位置 9.

如果将模板的扩展名从.xlsm 重命名为.zip,则可以检查实际文件并修复原因。在这种情况下,我必须删除按钮上单词之间的分隔符。

我确实担心 Excel 随着文件大小的增加而变得不稳定并且此时无法正确保存工作簿,但我可以解决这个问题。

我在使用从一个 Excel 工作簿 (A) 到另一个 Excel 工作簿 (B) 的 ADO 连接时遇到了同样的错误消息。工作簿 A 由用户打开,工作簿 B 关闭,但通过 ADO 以 Read/Write 模式连接。

External table is not in the expected format”错误发生在 ADO 更新和保存工作簿 B 但 磁盘时已满

磁盘已满错误应该不常见,如果用户打开工作簿,则可以很容易地克服这些错误,因为用户会收到警告,并且可以将工作簿保存到另一个区域。但是,当通过 ADO 连接打开时没有警告,因此工作簿(在本例中为 B)无法正确保存并损坏 - 至少这是我得出的结论。

当用户随后打开工作簿 B 时,会出现工作簿已损坏的警告。尝试恢复后,工作簿显示为空。但是,关闭工作簿 B 然后 运行 对其进行 SQL 查询(只读模式下的 ADO 连接)有时会 return 数据(取决于损坏的程度),但数据不完整。

我 post 这是希望它可能有所帮助,因为它是相同的错误并且会导致损坏,尽管原因与 Lee Z 的问题不同。唉,这不是治愈方法,但我希望它能提供信息。