2017-04-20 53 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的問題不同的原因。唉,這不是治癒,但我希望它是信息。

相關問題