0

我有一个 excel (xlsx 2010) 文档,其中只包含两列,一列用于日期时间,一列用于值,格式如下:

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。为了简洁起见,我已经剪切并粘贴了相关的代码行,所以上面的代码示例在技术上可能不起作用,但在真正的应用程序中它确实读取了文件

4

1 回答 1

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)];
    }
}
于 2013-01-25T08:41:29.697 回答