2009-12-16 125 views
1

我目前正在開發一個項目,用於遍歷excel文檔並使用C#將數據插入到數據庫中。C#:從xls文檔讀取數據

該項目的相關數據是:

  • Excel工作表的頂部,我不在乎有14行。 (有時15,參見下文俄羅斯/西伯利亞)
  • 的數據由姓名分組爲2列(日期和值),如:

表1

USA      China      Russia 
Date   Value   Date   Value   Siberia   
1/1/09  4.3654  1/1/09  2.7456  Date   Value   
1/2/09  3.5545  1/3/09  9.3214  2/5/09  0.2454 
1/3/09  3.2322  1/21/09  5.2234  2/6/09  0.5557 
  • 名稱我需要獲取的是直接在「日期」之上列出的任何一個。
  • 我只關心數據庫中沒有的數據。在解析每個列集之前,我將從數據庫中獲取任何給定名稱的最大日期,並在其之前或之前跳過任何內容。
  • 不保證列將以固定順序排列或間隔不變。
  • 我不希望所有名稱的數據,而只是在收集文件之前放在一個列表中的數據。

我目前的計劃是這樣的:

  • 對於每一列,如果日期欄是在第16行,該名稱保存,因爲它上面的15行的值,檢查數據庫的最後日期對於該名稱,只在日期大於獲取日期的地方插入數據。
  • 如果日期字段是在排17,做同樣的事情,但在18
  • 啓動for循環的每一行如果名字不在列表中,跳過列。如果是,請確保抓住旁邊的列以獲取必要的值。

我的問題是:

  • 我目前正在使用從Codeplex上的ExcelDataReader(http://www.codeplex.com/ExcelDataReader)。這隻喜歡類似csv的工作表,這個項目沒有。
  • 我不知道任何替代Excel閱讀器。
  • 據我所知,直接FileStream遍歷此文件只能逐行,而不是逐列。

要有人還在讀書,感謝您的時間。有關如何繼續的建議?請確保解決方案可以遍歷每列,而不是每行。

而且,請不要擔心數據庫的東西,或先於遍歷名稱的列表。

附錄:我最終想要得到的是某種類型的表格,我可以用一個嵌套循環遍歷,使得以列爲中心的遍歷更加容易。由於靠近紙張頂部(14行以上)有太多垃圾,因此大多數簡單的解決方案都不可行。

回答

3

如果你想從Excel在C#中讀取,我用這個庫取得了巨大成功,它會讓您可以靈活地解析列/行只,但是你會想:

其他開源我還沒有使用的庫,但可走OD:

或者,你可以使用的一個許多優秀的Java庫,並使用IKVM將其轉換爲C#彙編:

我已經介紹瞭如何做IKVM爪哇 - > C#轉換這裏(這真的不是可怕的選擇你想的):

+0

我期待嘗試koogra和nexcel。我會讓你知道他們是如何爲我工作的。 – 2009-12-16 22:47:40

+1

我一直在生產系統中使用koogra一年多,每天解析六個excel文件,它確實工作得很好,但是它的文檔不存在。如果您遇到困難,請與我們聯繫。 – Chris 2009-12-16 22:50:13

+0

+1 Chris,POI通過IKVM不是不明智的選擇,因爲它首次出現。這是一個非常強大的圖書館。 – 2009-12-17 01:46:59

0

我強烈建議做別的事情與它之前的CSV格式保存該Excel文檔。您可以使用this code 獲得CSV後,您可以使用該庫進行解析,也可以編寫自己的解析器。

0

沒有直接回答你的問題,但另外一個設想:

您的數據看起來像一個樞軸ISH表。我建議將其「反轉」爲簡單的表格。

例子:

  Russia  USA 
Q1   123  323 
Q2   456  321 
Q3   567  843 

變爲:

Quarter Country Value 
Q1  Russia 123  
Q1  USA  323 
Q2  Russia 321 
.... 

如果是這樣的話,不知道如果我得到了你的問題這一權利,比使用OLEDB驅動程序或任何CSV處理數據有些東西應該變得不那麼痛苦。

0

您可以通過ODBC驅動程序直接使用ADO.NET訪問Excel。有關如何做到這一點的更多信息,請參閱http://www.davidhayden.com/blog/dave/archive/2006/05/26/2973.aspx或Google。你不妨試試HDR =沒有在你的連接字符串中,因爲你的第一行並不是真正正確的標題。

我沒有這樣做了一段時間,但我記得,這是一個有點「氣質」,並採取了一些玩弄獲得列名權,但它應該工作。嘗試SELECT * FROM [Sheet1$],看看你得到什麼。

+0

但假設有在垃圾上面的名字很多行,將這種方法仍然有效? – 2009-12-16 22:31:37

+0

它可能。你必須看看Excel返回給你什麼,並找出如何檢測什麼是垃圾,什麼不是垃圾。 – EMP 2009-12-16 23:58:42

0

正如我之前做過,我更喜歡使用以OLEDB連接連接到一個Excel文件。

順便說一句,你可以看看下面的文章,瞭解詳情: http://www.codeproject.com/KB/office/excel_using_oledb.aspx

+0

來自鏈接: 「它是如何發生的? 顯然,引擎讀取每列的前8個單元格並檢查它的數據類型,如果大多數前8個單元格是int/double,問題依然存在。 在獲得真實數據之前,我至少有14行。是的,這些確實有其他數據(垃圾)分散在其中。 – 2009-12-16 22:33:58

+0

據我所知,解決方案沒有問題。也許我不明白你的問題,但如果你的問題是要從Excel文檔讀取數據,OLEDB是一個解決方案:-) – 2009-12-16 23:06:20

0

可以加載工作簿並以任何順序訪問任何工作表上的任何單元格。您可以獲取單元格的格式化文本(如「1/1/09」)或基礎值(「1/1/09」作爲Excel或SpreadsheetGear中的雙精度型39814.0存儲)。

如果您想自己嘗試,可以看到一些實時ASP.NET樣本here並下載免費試用版here

聲明:我自己的SpreadsheetGear LLC

+0

不會說謊。我希望我有這樣的聲明。然而,我正在尋找更多......自由的東西。 – 2009-12-17 14:37:16