2009-09-15 115 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

相关问题