Apache POI 到零日期




在回复之前,请确保您了解我的问题,它并不像看起来那么简单。请不要只是进行谷歌搜索并发布结果链接;我已经看过了。

我有一个 VB.Net 应用程序,我们正在用 Java 应用程序替换它。该应用程序的目的是编写Excel工作表(.xls)。然后将文件发送给第二方,他们处理其中的数据。我正在使用APACHE POI来编写文件。

最终产品被第二方拒绝,因为两个时间字段"无效"。挠了一会儿后,我注意到 Java 生成的文件和生成的文件处理 0 日期值的方式不同 VB.Net。假设时间假定为军事时间下午 3:30,则数据在两个文件中都显示为 15:30。问题是字段的日期部分:
VB.Net 生成: 1/0/1900 15:30 Java 生成: 1/1/1970 15:30

我似乎找不到一种方法让 apache POI 模仿 excel 处理 0 日期的方式。以下是我尝试过的一些事情。
我在 java 应用程序中将日期/时间变量设置为 1/0/1900 15:30。这在应用程序中给了我一个错误。
我将变量设置为字符串并将其传递给工作表,然后设置单元格的格式。我没有收到错误,但数据保持为"常规",直到我双击单元格并按 Enter 键。此过程应该是自动化的,因此这不是一个选项。
我将单元格的公式设置为 =TIMEVALUE("15:30"),但这未被第二方接受。

还有其他人遇到过这个问题吗?谁能想到解决这个问题的方法?让第二方更改他们读取文件的方式不是一种选择。

您需要知道的是,Excel将日期时间值存储为浮点双精度值。其中 0 = 00:00:00 和 1 = 24:00:00 = 01/01/1900 00:00:00。此外,0.5 = 12:00:00 和 1.5 = 36:00:00 = 01/01/1900 12:00:00。换句话说,Excel的日期时间值以 0 开头,1 是一天,是 01/01/1900。此外

,1/24 是一小时,1/24/60 是一分钟,1/24/60/60 是一秒。使用 JavaDate的问题在于Calendar构造函数中的月份是从 0 开始的。所以第 0 个月是 1 月,new GregorianCalendar(1900, 0, 1, 15, 30, 0)个月是 01/01/1900 15:30:00。并且没有第 0 天,因此new GregorianCalendar(1900, 0, 0, 15, 30, 0)将是 12/31/1899 15:30:00,对于 Excel,这将是 -1。

由于Excel的日期行为的问题已知,因此apache poi提供了 DateUtil。

使用它我们可以做到:

import java.io.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.util.Calendar;
import java.util.GregorianCalendar;
class XSSFNullDateTest {
public static void main(String[] args) {
try {
Workbook wb = new XSSFWorkbook();
Sheet sheet = wb.createSheet("Sheet1");
CreationHelper creationHelper = wb.getCreationHelper();
CellStyle cellStyleTime = wb.createCellStyle();
cellStyleTime.setDataFormat(creationHelper.createDataFormat().getFormat("hh:mm:ss"));
//using a Calendar:
Calendar calendar = new GregorianCalendar(1900, 0, 1, 15, 30, 0);
System.out.println(calendar.getTime()); //01/01/1900 15:30:00
double doubleTime = DateUtil.getExcelDate(calendar, false);
System.out.println(doubleTime); //1.6458333333333335
Cell cell = sheet.createRow(0).createCell(0);
cell.setCellValue(doubleTime-1); //subtract 1 so we have day 0
cell = sheet.getRow(0).createCell(1);
cell.setCellValue(doubleTime-1); //subtract 1 so we have day 0
cell.setCellStyle(cellStyleTime);
//using a string:
doubleTime = DateUtil.convertTime("15:30:00");
System.out.println(doubleTime); //0.6458333333333334 = day 0 already
cell = sheet.createRow(1).createCell(0);
cell.setCellValue(doubleTime);
cell = sheet.getRow(1).createCell(1);
cell.setCellValue(doubleTime);
cell.setCellStyle(cellStyleTime);

OutputStream out = new FileOutputStream("XSSFNullDateTest.xlsx");
wb.write(out);
wb.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}

相关内容

  • 没有找到相关文章

最新更新