IIS 和 OLE DB 外部表不是预期的格式
Posted
技术标签:
【中文标题】IIS 和 OLE DB 外部表不是预期的格式【英文标题】:IIS and OLE DB External table is not in the expected format 【发布时间】: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 位吗?另请参阅此问题以获取想法。 ***.com/questions/1139390/… 在测试用例中,IIS机器是我的开发机器,肯定有它需要的一切。在我们部署的环境中,情况也是如此。您提供的链接没有解释这一点,因为我已经在使用 Microsoft.ACE.OLEDB.12 连接。 【参考方案1】:“外部表不是预期的格式”是一个通用错误,由于(可悲)很多原因,在我的情况下是因为我没有正确解密文件。
我最好的办法是检查你的程序,用一个全新的文件对其进行测试,然后通过这种方式找到错误。
祝你好运!
【讨论】:
如果我的帖子不清楚,其中一些文件偶尔会由于用户添加图片而“损坏”。一旦“损坏”,就无法修复它,用户必须重新开始。在同一台服务器(我的开发箱)上的测试运行中,我可以在 IIS Express 下打开文件。这意味着 OLE DB 连接受到 IIS 中的某些东西的影响(这为零意义)。我同意微软确实搞砸了这条消息,因为它不包含解决问题的有效信息。 我怀疑 IIS 是问题所在,你的服务器和你的开发盒是否有相同的访问运行时? access 2016 处理错误 IIRC 的方式发生了一些变化。 关键是托管的 IIS 站点和测试网页在同一个盒子上的功能不同 - 即根据定义,相同的访问运行时。除非您是说在 IIS Express 下运行的页面在同一台计算机上运行时使用与 IIS 下不同的访问运行时? 我以为你的意思是你在两台不同的机器上运行,我的错。如果是这种情况,那么我不知道,也许这些进程在不同的用户下,所以它们链接到不同的运行时间?这将是我唯一能想到的。【参考方案2】:我开始研究使用 ClosedXml(围绕 OpenXML 构建的 .NET 解决方案)来解决我遇到的许多 OleDb 问题。尝试使用 ClosedXml 打开“损坏的”工作簿时,我收到一条错误消息,我可以使用 Microsoft Open XML SDK 进行复制。
问题的原因是表单按钮执行 VBA 代码以将模板内的数据从一个选项卡复制到另一个选项卡。表单按钮中的文本包含回车符(即 br)。当模板变大并且用户保存他们的工作时,Excel 通过不终止 br 来破坏 html。虽然 ACE OleDB 命令没有提供任何指示,但 Open XML SDK 提供了以下消息:
无法打开文件:Part /xl/drawings/vmlDrawing4.vml:第 19 行位置 29 上的“br”开始标记与“font”的结束标记不匹配。第 20 行,第 9 位。
如果将模板的扩展名从.xlsm 重命名为.zip,则可以检查实际文件并修复原因。在这种情况下,我必须删除按钮上单词之间的分隔符。
我确实担心 Excel 会随着文件大小的增加而变得不稳定,并且此时无法正确保存工作簿,但我能够解决这种情况。
【讨论】:
【参考方案3】:使用 ADO 连接从一个 Excel 工作簿 (A) 到另一个 Excel 工作簿 (B) 时,我遇到了同样的错误消息。工作簿 A 由用户打开,工作簿 B 关闭,但由 ADO 以读/写模式连接。
当工作簿 B 由 ADO 更新和保存但磁盘已满时,会出现“外部表不是预期格式”错误。
磁盘已满错误应该不常见,如果用户打开工作簿,则可以轻松克服这些错误,因为用户会收到警告并且可以将工作簿保存到另一个区域。但是,当通过 ADO 连接打开时,没有警告,因此工作簿(在本例中为 B)无法正确保存并损坏 - 至少这是我得出的结论。
当用户随后打开工作簿 B 时,会出现工作簿已损坏的警告。尝试恢复后,工作簿显示为空。但是,关闭工作簿 B 然后对其运行 SQL 查询(只读模式下的 ADO 连接)有时会返回数据(取决于损坏的程度),但数据不完整。
我发布此内容是希望它可能会有所帮助,因为它是相同的错误并且会导致损坏,尽管原因与 Lee Z 的问题不同。唉,这不是治愈方法,但我希望它能提供信息。
【讨论】:
以上是关于IIS 和 OLE DB 外部表不是预期的格式的主要内容,如果未能解决你的问题,请参考以下文章