我有一个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比文件实际包含的内容少一秒之后,例如:
00:15:00 00:14:59
00:20:00 00:19:59
有谁知道为什么?或者我可以做些什么来纠正它,没有手动检查它们并且四舍五入到最近的分钟(在这种情况下是一个可行的选择 - 我认为)
PS。为了简洁起见,我已经剪切并粘贴了相关的代码行,因此上面的代码示例可能在技术上不起作用,但在真实的应用程序中它确实读取了文件
答案 0 :(得分:0)
将评论转换为答案
经过重大改进和陡峭的学习曲线后,我可以确认使用互操作库正确读取文件。
根据网络上的其他帖子,参见下面的示例代码
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)];
}
}