IIS和OLE DB外部表格不符合预期格式

时间:2017-04-20 13:33:16

标签: c# oledbconnection oledbexception ms-jet-ace

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

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

通常,我们让用户下载新模板并重做工作而不添加图片。

最近,出现了很多此类行为,我试图在我的开发计算机上进行调查。我发现在文件上传过程中,我无法通过网站打开与“损坏”文件的连接,文件被读入字节流,并使用OleDbConnection创建并打开临时.xlsm文件,并从中读取数据一个隐藏的标签。

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

  • 删除所有图片
  • 删除所有标签但隐藏标签
  • 取消隐藏我们从
  • 中读取的标签
  • 将工作簿另存为xlsx以删除宏
  • 将工作簿保存为2003 - 2007工作簿,然后保存回xlsx或xlsm

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

对于我的调查,我编写了以下代码并将其托管在.NET Framework下的IIS Express中托管的测试Web应用程序的页面中的 相同 开发计算机上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()上失败。

有谁知道为什么会这样,以及如何解决?我不想因为像这样的奇怪微软问题而惩罚我们的用户。

谢谢,

编辑1

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

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

3 个答案:

答案 0 :(得分:0)

"外部表格不符合预期格式"是一个普遍的错误,因为(遗憾的是)很多原因,在我的情况下,这是因为我没有正确地解密文件。

我最好的选择是检查你的程序,用一个全新的文件测试它,并找到错误。

祝你好运!

答案 1 :(得分:0)

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

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

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

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

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

答案 2 :(得分:0)

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

" 外部表格不符合预期格式"当ADO更新并保存工作簿B但磁盘已满时,会发生错误。

磁盘完全错误不应该是常见的,如果工作簿由用户打开,则可以相当简单地克服它们,因为用户会收到警告并可以将工作簿保存到另一个区域。但是,当通过ADO连接打开时,没有警告,因此工作簿(在这种情况下为B)无法正确保存并且已损坏 - 至少这是我的结论。

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

我发布这篇文章是希望它可能有所帮助,因为它是同样的错误而且会导致腐败,尽管是由于Lee Z的问题不同。唉,这不是治愈方法,但我希望它能提供丰富的信息。