使用.NET从Excel获取数据作为数据库

时间:2009-09-15 12:01:00

标签: .net excel oledb

我想使用.NET从Excel文件中获取数据 正在使用Excel文件,因此无法打开它。我所做的是使用OleDB将其作为数据源连接到它。

问题在于我得到了一个单元格的数据而不是它的样式。 Excel中的日期值更改为.NET中的日期时间格式,Excel中设置为货币的单元格在.NET中显示为整数。使用OleDB从Excel导出数据时,您不知道单元格是否包含日期,货币等。例如,如果单元格设置为文本并包含从零开始的五个数字,则您将获得四位数。 / p>

如果您在Excel中查看数据,我正在寻找获取数据的方法。

使用.NET 3.5和Excel 2007。

6 个答案:

答案 0 :(得分:5)

为了找出列的数据类型,您必须使用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

答案 1 :(得分:4)

答案 2 :(得分:1)

SpreadsheetGear for .NET可以在Excel 2007打开工作簿时打开Excel 2007 xlsx工作簿。

Excel将日期,时间,货币,数字等存储为数字(C#加倍)。数字格式通知Excel如何显示数字。 Excel和SpreadsheetGear具有返回格式化文本的属性 - Excel中的Range.Text和SpreadsheetGear中的IRange.Text。

SpreadsheetGear还有一个属性,告诉您单元格数字格式的类型,以便您可以确定单元格是否格式化为日期,货币等...如果这对您的应用程序很重要。有关更多信息,请参阅IRange.NumberFormatType属性。

如果您想试用,可以免费试用here

免责声明:我拥有SpreadsheetGear LLC

答案 3 :(得分: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”替换为要检索数据的工作表的名称。

答案 4 :(得分:0)

它不漂亮,但您可以在Excel应用程序上使用COM Interop来阅读工作表。

这将允许您访问任何您喜欢的单元格,但更容易出错。

        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();

答案 5 :(得分:0)

You can use IMEX=1 in the connection string强制将所有列读取为文本,而不是让OleDB尝试推断数据类型。

我相信这会尊重包含数值的单元格的格式,但将留给您测试和确认。