如何使用Apache POI XSSF事件模型检查日期是否使用1904窗口

SWi*_*ilk 7 date apache-poi xssf

我正在编写一个用Apache POI eventmodel(SAX/XSSF)导入xlsx文件的程序.我差不多完成了,但我无法得到正确的日期.

我正在解析具有日期值的单元格

<c r="D1" s="1">
    <v>41319.558333333334</v>
</c>
Run Code Online (Sandbox Code Playgroud)

我正在使用org.apache.poi.ss.usermodel.DateUtil课程来获取日期:

DateUtil.getJavaCalendar(doble date, bool use1904windowing);
Run Code Online (Sandbox Code Playgroud)

我应该通过什么use1904windowing来获得正确的日期?我暂时使用false,因为这给了我测试工作簿的正确日期,但我知道我应该从某个地方读取这个值.

DateWindow1904Record二进制xls格式的记录,我用HSSF读取.它与XSSF的对应关系是什么?或者我应该经常使用false

编辑:@rgettman回答指出我的解决方案,但它不完整.在事件模型中,您没有xssfWorkbook对象,您不能只获取它的CTWorkbook().

相反,您可以直接从InputStream创建CTWorkbook:

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();
Run Code Online (Sandbox Code Playgroud)

小智 5

编译EDIT部分中描述的代码,但始终在POI 3.9中返回空CTWorkbookPr,下面的代码实际上解析工作簿前缀:

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();
Run Code Online (Sandbox Code Playgroud)