簡體   English   中英

使用Microsoft Jet引擎讀取XLS文件

[英]Reading an XLS file with the Microsoft Jet Engine

我想允許我的應用程序從XLS文件導入數據。 我已經使用CSV文件和XML文件進行了此操作,但是想為用戶打開作用域。 我在加載文件時遇到麻煩。 我們將文件( XLSCSVXML )加載到數據集中,然后從那里進行處理。 XLS的加載代碼如下

FileInfo fi = new FileInfo(filename);

//create and open a connection with the supplied string
OleDbConnection objOleDBConn;
objOleDBConn = new OleDbConnection(string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data  Source={0};Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'", fi.FullName));
objOleDBConn.Open();

DataTable dt = objOleDBConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

if (dt == null || dt.Rows.Count == 0)
{
    return;
}

string sheet = dt.Rows[0]["TABLE_NAME"].ToString();

//then read the data as usual.
OleDbDataAdapter objOleDBDa;
objOleDBDa = new OleDbDataAdapter(string.Format("select * from [{0}]",sheet), objOleDBConn);
objOleDBDa.Fill(data);
objOleDBConn.Close();

這樣我的數據就可以加載了,但是它似乎設置了各列的數據類型,這對我的其中一列是個問題。 這是一個字段,我們選擇接受FalseTrueYesNoYN 有一些代碼可以稍后將其轉換為布爾值。 這在CSV文件(連接字符串不同的文件)中工作正常,但在XLS ,如果前10行說FALSETRUE ,然后說第11行說YES ,那么我只會得到一個空條目。 我猜想它會讀取前幾個條目並基於此確定數據類型?

問題:是否有辦法關閉根據前幾個條目標識列的數據類型的機制?

這個問題與Excel中的OLEDB-providerExcel讀取ASP.NET中的 單元格值截斷非常相似:如果列具有不同的數據格式,則無法讀取數據在這些其他問題中似乎討論了幾個可行的解決方案。

有一個注冊表設置可以告訴Jet提供程序要讀取多少行才能推斷出列的數據類型。 我相信它默認為8。 它是:

HKLM\Software\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Excel\TypeGuessRows

(如適用,請更改版本)。 在您的情況下,它推斷出布爾值,因此將忽略字符串值“ yes”。

技巧是將標頭行作為要從中推斷數據類型的行,以便將所有列都讀取為字符串。 然后,如果需要,您將能夠解析代碼以更正數據類型,而不會丟失值-用於此HDR = No

objOleDBConn = new OleDbConnection(string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data  Source={0};Extended Properties='Excel 8.0;HDR=No;IMEX=1'", fi.FullName));

試試我通過堆棧溢出發布的OleDBAdapter Excel QA

我用一個全為TRUE或FALSE填充工作表列,然后隨機輸入幾個“是”或“否”值,它工作得很好...

在“調試”模式下運行,然后在填充數據集可視化器后單擊以查看結果。 或者,將其添加到輸出代碼的末尾

// DataSet:          
Object row11Col3 = ds.Tables["xlsImport"].Rows[11][3];
string rowElevenColumn3 = row11Col3.ToString();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM