C # Excel Reader преобразует временные метки в десятичное число

#c# #excel #office-interop

#c# #excel #office-взаимодействие

Вопрос:

Когда я использую программу чтения Excel, она отлично считывает все, кроме временных меток. Это преобразует, например, 15:59:35 в .67290509259259268

Как мне предотвратить это?

 object[,] valueArray = (object[,])excelRange.get_Value(XlRangeValueDataType.xlRangeValueDefault);
  

Это мой массив, содержащий значения, которые считываются с листа Excel. Не уверен, что причина в этом.

Комментарии:

1. Вы уверены, что это «15: 59:35 в .67290509259259268» вместо 16: 08:59 в это или 15: 59:35 в .6663777 …?

2. Возможно, я неверно истолковал, в какой строке оно считывалось первым.

Ответ №1:

Попробуйте DateTime.FromOADate — однако числовое значение, упомянутое вами в вопросе, на самом деле не соответствует указанному вами времени.

Ответ №2:

Причина этого в том, что Excel хранит все свои DateTimes в виде чисел с плавающей запятой. Десятичная часть является компонентом времени, в то время как целочисленная часть представляет дату.

Вы можете получить значение use Range.Text для получения текста, который должен быть правильно отформатирован. Я не думаю, что вы можете использовать это точно так же, как указано выше (пытаюсь сделать то же самое сам, поэтому пока не получил реального подхода). Также будьте осторожны, это может привести к замедлению чтения текста (чтение числовых форматов происходит медленно).

В качестве альтернативы попробуйте использовать библиотеку, FlexCel — очень хорошая библиотека, которую мы используем, или Apose для более полного решения.

Итеративный подход (это почти наверняка значительно медленнее, чем get_Value, возвращающий объект[,]).

 if (excelRange!= null)
{
   int nRows = excelRange.Rows.Count;
   int nCols = excelRange.Columns.Count;
   for (int iRow = 1; iRow <= nRows; iRow  )
   {
      for (int iCount = 1; iCount <= nCols; iCount  )
      {
         excelRange= (Microsoft.Office.Interop.Excel.Range)xlSheet.Cells[iRow, iCount];
         String text = excelRange.Text;
      }
   }
}
  

(Редактировать: удалены другие примеры, которые на самом деле были для Sharepoint.)

Комментарии:

1. Спасибо вам. Теперь мне, по крайней мере, есть с чего начать.

2. К сожалению, эти библиотеки не бесплатны, но FlexCel довольно дешев и v.прост в использовании. Если я найду решение в Excel, я опубликую его.

3. Вы не шутили насчет диапазона. Текст занимает много времени. Для 1800 строк с 59 столбцами потребовалось почти 2 минуты, чтобы просмотреть все это.