我想使用.NET从Excel文件中获取数据 正在使用Excel文件,因此无法打开它。我所做的是使用OleDB将其作为数据源连接到它。
问题在于我得到了一个单元格的数据而不是它的样式。 Excel中的日期值更改为.NET中的日期时间格式,Excel中设置为货币的单元格在.NET中显示为整数。使用OleDB从Excel导出数据时,您不知道单元格是否包含日期,货币等。例如,如果单元格设置为文本并包含从零开始的五个数字,则您将获得四位数。 / p>
如果您在Excel中查看数据,我正在寻找获取数据的方法。
使用.NET 3.5和Excel 2007。
答案 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尝试推断数据类型。
我相信这会尊重包含数值的单元格的格式,但将留给您测试和确认。