XSSFCell -> как получить значение интервала времени от long - PullRequest
0 голосов
/ 27 октября 2019

Я получил длинное значение, например: 44304000 . Это значение указывает временной интервал. Если мы конвертируем это значение в часы и минуты, мы получим: 12: 18 . Мой вопрос здесь:

Как добавить значение ячейки в XSSFCell, когда я хочу увидеть, каково мое значение в качестве временного интервала? (не как текст)

Время - можно рассчитать через Excel, текст - нет!

Спасибо за помощь :)

1 Ответ

1 голос
/ 27 октября 2019

Я подозреваю, что ваш временной интервал 44304000 представляет собой разницу во времени и выражается в миллисекундах.

В Excel значения даты и времени сохраняются как значения с плавающей запятой (double) в единицах измерения дней. День 0 = 01.01.1900 00: 00: 00.000. Так что в Excel значение даты-времени 1.0 означает один день. Один час 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.

...