【问题标题】:Date in Cell formatted as Date not recognized as Date单元格中的日期格式为日期不被识别为日期
【发布时间】:2016-11-24 08:56:20
【问题描述】:

我正在尝试使用 Apache 的 Java POI 将日期添加到电子表格中。但是,我最终得到的日期格式单元格中的日期没有被单元格识别为日期,而是被识别为字符串。然而,当我随后打开电子表格时,只需单击单元格 - 即在没有进行有效更改的情况下对其进行编辑 - 并且自动识别日期格式。我怎样才能让我的程序在我不需要干预的情况下执行这最后一步?非常感谢,提前!

    CreationHelper creationHelper = wb.getCreationHelper();
    XSSFCellStyle cellStyleDate = wb.createCellStyle();

    LocalDate start = LocalDate.of(2000, 1, 1);
    LocalDate end = LocalDate.of(2000, 12, 31);

    cellStyleDate.setDataFormat(creationHelper.createDataFormat().getFormat("dd.mm.yyyy"));
    int i = 1;
    for (LocalDate date = start; date.isBefore(end); date = date.plusDays(1)) {

        // wb.getSheetAt(0).createRow(i).createCell(0).setCellValue(date);
        wb.getSheetAt(0).createRow(i).createCell(0).setCellValue(date.toString());
        // wb.getSheetAt(0).createRow(i).createCell(0).setCellValue(date.getDayOfMonth() + "." + date.getMonthValue() + "." + date.getYear());

        wb.getSheetAt(0).getRow(i).getCell(0).setCellStyle(cellStyleDate);
        i++;
    }

【问题讨论】:

    标签: java excel date apache-poi


    【解决方案1】:

    setCellValue 现在也为 LocalDate 和 LocalDateTime 定义

    【讨论】:

      【解决方案2】:

      目前是documented,有两种可能的方法来设置日期值。 setCellValue(java.util.Calendar value)setCellValue(java.util.Date value)。直到现在才支持使用java.time.LocalDate

      所以你必须在设置为单元格值之前将LocalDate 转换为java.util.Date

      例子:

      import java.io.*;
      
      import org.apache.poi.ss.usermodel.*;
      
      import org.apache.poi.xssf.usermodel.XSSFWorkbook;
      
      import java.util.Date;
      import java.time.LocalDate;
      import java.time.ZoneId;
      
      import java.awt.Desktop;
      
      class LocalDateTest {
      
       public static void main(String[] args) {
        try {
      
         Workbook wb = new XSSFWorkbook();
         Sheet sheet = wb.createSheet("Sheet1");
      
         CreationHelper creationHelper = wb.getCreationHelper();
         CellStyle cellStyleDate = wb.createCellStyle();
      
         LocalDate start = LocalDate.of(2000, 1, 1);
         LocalDate end = LocalDate.of(2000, 12, 31);
      
         cellStyleDate.setDataFormat(creationHelper.createDataFormat().getFormat("dd.mm.yyyy"));
         int i = 1;
         for (LocalDate localdate = start; localdate.isBefore(end.plusDays(1)); localdate = localdate.plusDays(1)) {
          Date date = Date.from(localdate.atStartOfDay(ZoneId.systemDefault()).toInstant());
          wb.getSheetAt(0).createRow(i).createCell(0).setCellValue(date);
          wb.getSheetAt(0).getRow(i).getCell(0).setCellStyle(cellStyleDate);
          i++;
         }
      
         OutputStream out = new FileOutputStream("LocalDateTest.xlsx");
         wb.write(out);
         wb.close();
      
         System.out.println("Done");
         File outputfile = new File("LocalDateTest.xlsx");
         Desktop.getDesktop().open(outputfile);
      
      
        } catch (FileNotFoundException fnfex) {
        } catch (IOException ioex) {
        }
       }
      }
      

      【讨论】:

      • 现在完美运行!关于当前文档的局限性,您是百分百正确的。非常感谢!我想我今天的教训是,总是追求最新的不一定更好,尤其是当这些东西(还没有)得到支持的时候。此外,非常感谢您详细说明的示例。祝你有美好的一天!
      猜你喜欢
      • 2015-08-31
      • 2011-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多