2017-04-20 54 views
0

我遇到一些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

如果文件被标记为“只读”,它是在具有完全访问权限的目录,那么该文件可以打开和数据可能阅读成功。

由于我们打开文件,检查信息并最终在选项卡上进行更改,这仍然存在问题。

+0

IIS计算机是否安装了Microsoft Access数据库引擎2010 Redistributable或其他什么?它是正确的版本 - 32/64位?有关想法,请参阅此问题。 http://stackoverflow.com/questions/1139390/excel-external-table-is-not-in-the-expected-format – Steve

+0

在测试案例中,IIS机器是我的开发机器,它绝对拥有它所需要的一切。在我们的部署环境中,情况也是如此。您提供的链接没有解释这是因为我已经在使用Microsoft.ACE.OLEDB.12连接。 –

回答

0

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

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

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

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

这确实让我担心Excel会变得不稳定,因为文件大小会增加,并且此时不能正确保存工作簿,但我可以解决这一问题。

0

“外部表格不是预期的格式”是一个普遍的错误,因为(可惜)很多原因,在我的情况下,这是因为我没有正确解密文件。

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

祝你好运!

+0

如果我的帖子不清楚,其中一些文件偶尔会因用户添加图片而“损坏”。一旦“损坏”,没有任何修复它,用户必须重新开始。在同一台服务器(我的开发盒)上运行的测试中,我可以在IIS Express下打开该文件。这意味着OLE DB连接受到IIS中某些东西的影响(这是毫无意义的)。我同意微软真的搞砸了这条消息,因为它没有包含有效的信息来解决这个问题。 –

+0

我怀疑IIS是否是问题,你的服务器和你的开发箱都有相同的访问运行时间吗? 2016访问错误IIRC的方式发生了一些变化。 –

+0

重点在于托管的IIS站点和测试网页在同一个方框 - 即根据定义,相同的访问运行时间方面具有不同的功能。除非你说在IIS Express下运行的页面在同一台计算机上运行时使用不同的访问运行时,而在IIS下运行的页面运行时间不同? –

0

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

的“外部表不是预期的格式”时,工作簿B被更新,并通过ADO保存但当磁盘已满发生错误。

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

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

我发布这个,希望它可能有帮助,因为它是相同的错误,它会导致腐败,虽然由李Z的问题不同的原因。唉,这不是治愈,但我希望它是信息。

相关问题