我遇到一些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
如果文件被標記爲「只讀」,它是在具有完全訪問權限的目錄,那麼該文件可以打開和數據可能閱讀成功。
由於我們打開文件,檢查信息並最終在選項卡上進行更改,這仍然存在問題。
IIS計算機是否安裝了Microsoft Access數據庫引擎2010 Redistributable或其他什麼?它是正確的版本 - 32/64位?有關想法,請參閱此問題。 http://stackoverflow.com/questions/1139390/excel-external-table-is-not-in-the-expected-format – Steve
在測試案例中,IIS機器是我的開發機器,它絕對擁有它所需要的一切。在我們的部署環境中,情況也是如此。您提供的鏈接沒有解釋這是因爲我已經在使用Microsoft.ACE.OLEDB.12連接。 –