XSSFCell->如何从长整数获取间隔时间值

时间:2019-10-26 21:01:31

标签: java apache-poi xssf

我的价值很高,例如: 44304000 。该值指示时间间隔。 如果将这个值转换为小时和分钟,则会得到: 12:18 。 我的问题在这里:

当我想查看时间间隔的值时,如何将单元格值添加到XSSFCell? (不是文字)

时间-可以通过Excel计算,文本-不能!

寻求帮助:)

1 个答案:

答案 0 :(得分:1)

我怀疑您的时间间隔44304000是一个时差,以毫秒为单位。

Excel中,日期时间值以天的计量单位存储为浮点(double)值。第0天= 1/1/1900 00:00:00.000。因此,在Excel中,日期时间值为1.0表示一天。 1小时为1/24。一分钟是1/24/60。一秒是1/24/60/60。一毫秒是1/24/60/60/1000。

知道了这一点,您就可以计算

double excelTimeIntervalInDays = timeIntervalInMillis/24d/60d/60d/1000d;

可以将double excelTimeIntervalInDays设置为Excel中的单元格值。

还必须以单元格的单元格样式设置适当的数字格式(日期格式),因此double值将显示为时间。数字格式为[hh]:mm:ss.000的意思是:显示两位数字的小时数,即使超过24(用括号括起来的数字)也是如此。然后显示:。然后显示两位数分钟。然后显示:。然后显示两位数秒。然后显示.。然后显示三位数字毫秒。

完整示例:

import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

class CreateExcelDateTimeFromLong {

 public static void main(String[] args) throws Exception {

  try (Workbook workbook = new XSSFWorkbook(); 
       FileOutputStream fileout = new FileOutputStream("Excel.xlsx") ) {

   long[] timeIntervalsInMillis = new long[] {
    44304000, //12:18:24.000 = 12h, 18m, 24s
    20*60*60*1000+15*60*1000+10*1000, //20:15:10.000 = 20h, 15m, 10s
    25*60*60*1000+25*60*1000+15*1000, //25:25:15.000 = 25h, 25m, 15s = 1d, 1h, 25m, 15s
    48*60*60*1000+45*60*1000+55*1000, //48:45:55.000 = 48h, 45m, 55s = 2d, 0h, 45m, 55s
   };

   CellStyle timeIntervalStyle = workbook.createCellStyle();
   DataFormat format = workbook.createDataFormat();
   timeIntervalStyle.setDataFormat(format.getFormat("[hh]:mm:ss.000"));

   Sheet sheet = workbook.createSheet();
   Row row = sheet.createRow(0);
   Cell cell = row.createCell(0);
   cell.setCellValue("Time intervals");

   int r = 1;
   for (long timeIntervalInMillis : timeIntervalsInMillis) {
    row = sheet.createRow(r++);
    cell = row.createCell(0);

    double excelTimeIntervalInDays = timeIntervalInMillis/24d/60d/60d/1000d;

    cell.setCellValue(excelTimeIntervalInDays);
    cell.setCellStyle(timeIntervalStyle);
   }

   sheet.setColumnWidth(0,15*256);

   workbook.write(fileout);
  }

 }
}

注意:这假设timeIntervalsInMillis表示两个日期之间的差,以毫秒为单位。不要将其与毫秒级的时间戳混淆。如果给出了时间戳,则需要一种完全不同的方法,因为那时必须考虑那些时间戳的时代。然后必须首先从该时间戳创建日期,并且必须在Excel中将这些日期设置为单元格值。