2013-04-18 2 views
6

Я пишу программу, которая импортирует файлы xlsx с помощью EventModel Apache POI (SAX/XSSF). Я почти готов, но я не могу получить правильные даты.Как проверить, использует ли дата 1904 окно с Apache POI XSSF eventmodel

Я разборе ячейку с датой валютирования

<c r="D1" s="1"> 
    <v>41319.558333333334</v> 
</c> 

Я использую org.apache.poi.ss.usermodel.DateUtil класс, чтобы получить дату:

DateUtil.getJavaCalendar(doble date, bool use1904windowing); 

То, что я должен пройти как use1904windowing, чтобы получить правильные даты? Временно я использую false, так как это дает мне правильные даты с моей тестовой рабочей книгой, но я знаю, что я должен прочитать эту ценность откуда-то.

В двоичном формате xls есть запись DateWindow1904Record, которую я читаю с использованием HSSF. Каков его аналог в XSSF? Или я должен всегда использовать false?

EDIT: Ответ @rgettman указал мне на решение, но оно не является полным. В модели событий у вас нет объекта xssfWorkbook, и вы не можете просто получить его.

Вместо этого вы можете создать CTWorkbook непосредственно из InputStream:

OPCPackage pkg = OPCPackage.open(filename); 
XSSFReader r = new XSSFReader(pkg); 
InputStream workbookXml = r.getWorkbookData(); 
CTWorkbook ctWorkbook = CTWorkbook.Factory.parse(workbookXml); 
boolean isDate1904 = ctWorkbook.getWorkbookPr().getDate1904(); 
+0

добавлен пример в контексте модели событий. – SWilk

+0

У EDIT отсутствует код. Посмотрите комментарий Андрея ниже. – user517708

ответ

4

Код описан в разделе EDIT компилирует, но всегда возвращает нуль CTWorkbookPr в POI 3.9 код ниже фактически разбирает префикс рабочей книги:

OPCPackage pkg = OPCPackage.open(filename); 
XSSFReader r = new XSSFReader(pkg); 
InputStream workbookXml = r.getWorkbookData(); 
WorkbookDocument doc = WorkbookDocument.Factory.parse(workbookXml); 
CTWorkbook wb = doc.getWorkbook(); 
CTWorkbookPr prefix = wb.getWorkbookPr(); 
boolean isDate1904 = prefix.getDate1904(); 
pkg.close(); 
3

можно определить, если формат даты 1904 устанавливается в XSSF. К сожалению, isDate1904() является protected в XSSFWorkbook. Но есть обходное решение, которое стало возможным, потому что XSSFWorkbook раскрывает свой базовый XML-компонент с помощью метода getCTWorkbook().

boolean isDate1904 = false; 
CTWorkbook internalWorkbook = xssfWorkbook.getCTWorkbook(); 
CTWorkbookPr workbookPr = internalWorkbook.getWorkbookPr(); 
if (workbookPr != null) 
{ 
    isDate1904 = workbookPr.getDate1904(); 
} 

Этот код анализирует основные XML-бобы, чтобы определить, является ли атрибут его установить date1904. Также возможно установить этот флаг с тем же XML-компонентом (CTWorkbookPr) с помощью метода setDate1904(boolean).

Смежные вопросы