#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 минуты, чтобы просмотреть все это.