Разбор большого файла xlsx, регистр формата даты - PullRequest
3 голосов
/ 19 января 2012

Поскольку файл xlsx может содержать миллионы строк, я решил использовать модель событий poi, взял пример из здесь (ExampleEventUserModel), но обнаружил некоторые проблемы при разборе ячеек формата даты.

Например, у меня в Excel дата 01.10.2011 в ячейке A15, но xml имеет:

<c r="A15" s="11"><v>40817</v></c>

Это не в формате даты, даже не в миллисекундах, например.

Как разобрать дату для модели события?

С уважением.

Ответы [ 2 ]

4 голосов
/ 19 января 2012

Excel сохраняет даты в виде числа с плавающей точкой дней (и доли дня) от фиксированной начальной точки. Значение 40817 - это количество дней с этой начальной точки до 1 октября 2011 года.

POI HSSFCell имеет метод getDateCellValue(), который возвращает Java Date и выполняет то, что вы хотите.

3 голосов
/ 23 января 2012

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

Ячейка, <c>, элементимеет атрибут типа t, но он не используется для этого серийного типа даты Excel.Таким образом, единственное, что отличает ячейку, которая содержит дату, закодированную как 40817, и ячейку со значением 40817, - это формат, который применяется к числу (на которое ссылается через атрибут s ячейки).* Чтобы определить этот формат, вам нужно найти атрибут numFmtId ссылочного стиля xf в соответствующем styles.xml и попытаться определить, является ли этот формат форматом даты.И для того, чтобы сделать это, вам придется применить некоторую эвристику.

В целом, это огромная боль, когда вы хотите отличить даты от других числовых данных, и для меня это упущение в формате SpreadsheetML.

PS Стандарт OOXML определяет значение даты d для атрибута типа t, но оно используется только для дат ISO 8601, которые фактически не создаются в Excel.(Обновление: этот формат даты теперь используется в строгом режиме в Excel 2013).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...