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)