Столбец Excel Date возвращает INT с использованием EPPlus
Поэтому я использую EPPlus для чтения и записи документов Excel.
Рабочий процесс
- Пользователь создает заполненный документ excel
- Открывает документ и добавляет строку
- Загружено и прочитано
Даты, которые создаются при создании документа с использованием EPPlus, отображаются правильно, когда я читаю значение обратно, но строка, которую пользователь меняет дату или добавляет, отображается как значение INT, которое я не могу использовать в качестве реального Дата.
Когда я ввожу дату 1/01/2014 и записываю ее, вывод при открытии файла показывает 41640
Я читаю его следующим образом
sheet.Cells[i, "AE".ConvertExcelColumnIndex()].Value != null
? sheet.Cells[i, "AE".ConvertExcelColumnIndex()].Value.ToString().Trim()
: string.Empty
Обновление
При экспорте файла я добавил следующие
DateTime testDate;
if (DateTime.TryParse(split[i], out testDate))
{
sheet.Cells[row, i + 1].Style.Numberformat.Format = "MM/dd/yyyy";
sheet.Cells[row, i + 1].Value = testDate.ToString("MM/dd/yyyy");
}
Также при чтении значения назад я попытался
sheet.Cells[i, "AE".ConvertExcelColumnIndex()].Style.Numberformat.Format = "MM/dd/yyy";
Я все еще получаю INT назад
Ответы
Ответ 1
... когда мне нужно прочитать этот файл excel, единственные даты, которые неверными являются те, которые пользователь изменил
Итак, когда вы читаете измененный лист excel, измененные даты - это числа, а неизменные значения - строки в вашем формате даты?
Вы можете получить DateTime
через DateTime.FromOADate
:
long dateNum = long.Parse(worksheet.Cells[row, column].Value.ToString());
DateTime result = DateTime.FromOADate(dateNum);
С вашим номером образца:
Console.Write(DateTime.FromOADate(41640)); // -> 01/01/2014
Ответ 2
Вы также можете изменить свойство 'NumberFormatLocal'. Это сработало для меня. Если вы форматируете файл Excel, прежде чем использовать его, используйте EPPLUS.
Следующий базовый пример столбца форматирования кода A в типичном файле excel.
Sub ChangeExcelColumnFormat()
Dim ExcelApp As Excel.Application
Dim ExcelWB As Excel.Workbook
Dim ExcelWS As Excel.Worksheet
Dim formatRange As Excel.Range
Dim strFile As String = "C:\Test.xlsx"
Dim strSheetname As String = "Sheet1"
ExcelApp = New Excel.Application
ExcelWB = ExcelApp.Workbooks.Open(strFile)
strColSelect = "A:A"
strFormat = "dd/mm/yyyy"
formatRange = ExcelWS.Range(strColSelect)
formatRange.NumberFormatLocal = strFormat
ExcelWB.Save()
ExcelWB.Close()
ExcelApp.Quit()
ExcelWS = Nothing
ExcelWB = Nothing
ExcelApp = Nothing
Конец Sub