我有一个excel(xlsx 2010)文档,它只包含两列,一列用于DateTime,另一列用于值,格式为:
DateTime Value
01/09/2012 00:00:00 1.23456
02/09/2012 00:05:00 1.23457
03/09/2012 00:10:00 1.23458
04/09/2012 00:15:00 1.23459
日期-时间列设置为自定义格式(dd/mm/yyyy hh:mm:ss),所有时间都在5或10分钟标记上,秒始终为00。
然而,当我读到这篇文章时使用:
connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=Excel 12.0;", filePath);
OleDbCommand sqlComm = new OleDbCommand("SELECT * FROM [Sheet1$]", new OleDbConnection(connectionString));
OleDbDataReader r = sqlComm.ExecuteReader();
前两个DateTimes是正确读取的,但毕竟所有的DateTimes都比文件实际包含的内容少1秒,例如:
00:15:00 00:14:59
00:20:00 00:19:59
有人知道为什么吗?或者我能做些什么来纠正它,除了手动检查它们并四舍五入到最近的一分钟(在这种情况下,我认为这是一个可行的选择)
PS。为了简洁起见,我已经剪切并粘贴了相关的代码行,所以上面的代码示例在技术上可能不起作用,但在实际应用程序中,它确实读取了文件
将注释转换为回答
经过一次重大的改进和陡峭的学习曲线,我可以确认使用interop库可以正确读取文件。
请参阅下面的示例代码,基于网络上的其他帖子
object misValue = System.Reflection.Missing.Value;
// COMM creates a wrapper for each object and they don't get cleaned up. Never use 2 dots with comm
Excel.ApplicationClass xlApp = new Excel.ApplicationClass();
Excel.Workbooks xlWorkbooks = xlApp.Workbooks;
Excel.Workbook xlWorkbook = xlWorkbooks.Open(fileInfo.getFileURL(), misValue, misValue, misValue, misValue, misValue, misValue, misValue, misValue, misValue, misValue, misValue, misValue, misValue, misValue);
Excel.Worksheet xlWorksheet = (Excel.Worksheet)xlWorkbook.Sheets[1];
Excel.Range xlRange, r;
try
{
xlRange = (Excel.Range)xlWorksheet.UsedRange;
int rowCount = xlRange.Rows.Count;
int colCount = xlRange.Columns.Count;
for (int col = 0; col < colCount; col++)
{
r = (Excel.Range)xlRange.Cells[fileInfo.columnHeaders, (col + 1)];
}
}