2009-09-15 61 views
2

我想從使用.NET的Excel文件中獲取數據 正在使用Excel文件,因此無法打開它。我所做的就是使用OleDB作爲數據源連接到它。使用.NET從Excel中獲取數據作爲數據庫

問題是我得到一個單元格的數據,但沒有它的樣式。 Excel中的日期值在.NET中變爲日期時間格式,而在Excel中設置爲貨幣的單元格在.NET中顯示爲整數。使用OleDB從Excel導出數據時,您不知道單元格是否包含日期,貨幣等。例如,如果單元格設置爲文本幷包含從零開始的五位數字,則只會獲得四位數字。

我正在尋找一種方法來獲取數據,因爲它會出現,如果你要在Excel中查看數據。

使用.NET 3.5和Excel 2007

回答

4
+2

謝謝,但這些都不解決我的問題。我知道如何使用OleDB連接到Excel,但我得到的數據是不完整的,因爲我不知道每個單元格的格式類型。 – idophir 2009-09-16 13:09:10

+0

OP確實要求確定單元格格式(指問題中的樣式),而不是如何通過OLEDB進行連接。雖然如果你閱讀米奇提供的4個鏈接,這也會給你答案。 – 2010-12-19 22:15:55

0

要連接到一個Excel文件,就需要相應的連接字符串:

string connString = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=<YourExcelPath>;Extended Properties=\"Excel 12.0;HDR=YES;\""; 

使用後的OleDb類查詢到的文件中的信息:

string selectCmd = "SELECT * FROM <SheetName>"; 

using(OleDbConnection excelConn = new OleDbConnection(connString)) 
{ 
    excelConn.Open(); 
    OleDbCommand command = new OleDbCommand(selectCmd, excelConn); 
    OleDbDataAdapter da = new OleDbDataAdapter(command); 

    DataTable sheetInfo = new DataTable(); 
    dataAdapter.Fill(sheetInfo); 

    //Do something with the data. 
} 

所以,你需要替換「 YourExcelPath「與您的Excel文件的路徑和」SheetName「與您想要檢索數據的工作表的名稱。

1

可以打開Excel 2007 xlsx工作簿,而Excel 2007打開工作簿。

Excel將日期,時間,貨幣,數字等存儲爲數字(C#雙打)。數字格式通知Excel如何顯示數字。 Excel和SpreadsheetGear有一個屬性來返回格式化文本 - Excel中的Range.Text和SpreadsheetGear中的IRange.Text。

SpreadsheetGear還具有一個屬性,它告訴您單元格的數字格式的類型,以便您可以確定單元格是格式化爲日期,貨幣等等......如果這對您的應用程序很重要。有關更多信息,請參閱IRange.NumberFormatType屬性。

,如果你想嘗試一下,你可以下載一個免費試用here

聲明:我自己的SpreadsheetGear LLC

+0

謝謝喬。我一定會給你的產品一個嘗試,並會報告回來。 – idophir 2009-09-18 19:16:17

0

它不是很漂亮,但你可以使用COM互操作到Excel應用程序讀入紙。

這將允許您訪問任何您喜歡的單元格,但更容易出錯。

 System.Reflection.Missing ms = System.Reflection.Missing.Value; 
     Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application(); 
     xlApp.Visible = true; 
     Microsoft.Office.Interop.Excel.Workbook xlBook = xlApp.Workbooks.Open(@"C:\Demo.xlsx", ms, ms, ms, ms, ms, ms, ms, ms, ms, ms, ms, ms, ms, ms); 
     Microsoft.Office.Interop.Excel.Worksheet xlSheet = xlBook.Sheets[1] as Microsoft.Office.Interop.Excel.Worksheet; 
     Microsoft.Office.Interop.Excel.Range rng = xlSheet.Cells[1, 1] as Microsoft.Office.Interop.Excel.Range; 
     System.Console.WriteLine(String.Format("{0} {1} {2}", rng.Value2, rng.Text, rng.NumberFormat)); 
     xlBook.Close(false, ms, ms); 
     xlApp.Quit(); 

     System.Console.ReadLine(); 
+0

問題是要求一種方法來確定使用OLEDB的單元格格式,而不是如何使用其他方法(如com interop)。 – 2010-12-19 22:17:02

4

爲了找出列的數據類型,你必須使用FillSchema方法:

OleDbConnection conn = new OleDbConnection(...); 
conn.Open(); 

DataSet dataSet = new DataSet(); 
OleDbDataAdapter dataAdapter = new OleDbDataAdapter("SELECT * FROM <table>", conn); 
dataAdapter.FillSchema(dataSet, SchemaType.Source); 
dataAdapter.Fill(dataSet); 

//Now you can access the data type like this 
dataSet.Tables[0].Columns[0].DataType 
+0

這回答了這個問題。 – 2010-12-19 22:17:18