提到的日期格式(dd/MM/yyyy)不适用于使用Apache Poi的Excel中的当前日期

tvokkenx  于 2023-04-22  发布在  Apache
关注(0)|答案(1)|浏览(100)

我需要使用HSSFWorkbook(.xlsx)生成带有日期值的Excel文件。我正在传递Date类生成的日期值,并且我正在使用createHelper.createDataFormat().getFormat("dd/MM/yyyy")将格式添加到Excel单元格中作为dd/MM/yyyy,但在下载的Excel文件中,它以不同的格式显示。
通过日期为2023年4月19日星期三15:00:17 IST,我期待的格式为2023年4月19日,但我得到的图像中所示。

附上了代码片段

Workbook wb = new HSSFWorkbook();  
CreationHelper createHelper = wb.getCreationHelper();  
Sheet sheet = wb.createSheet("New Sheet");  
Row row     = sheet.createRow(0);  
Cell cell   = row.createCell(0);  
cell.setCellValue("test");
CellStyle cellStyle = wb.createCellStyle();  
cellStyle.setDataFormat(  
            createHelper.createDataFormat().getFormat("dd/MM/yyyy"));  
cell = row.createCell(1); 
Date date = new Date();
System.out.println("Date :"+date);
cell.setCellValue(date);    
cell.setCellStyle(cellStyle);

谢谢

j9per5c4

j9per5c41#

Excel数字格式DD/MM/YYYY表示具有在系统区域设置中定义的分隔符的日期格式DMY。对于您的系统,该分隔符似乎是连字符(减号)。换句话说,该格式代码中的/并不表示斜杠,而是默认日期分隔符。
查看控制面板-区域日期(短)中的分隔符是什么。这是默认的日期分隔符。
如果你想设置一个用户定义的格式,总是使用斜杠作为分隔符,那么你需要将斜杠标记为无意义的字符。这将是DD\/MM\/YYYY-反斜杠前或DD"/"MM"/"YYYY-双引号中的斜杠。
完整示例:

import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

class CreateExcelDate {

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

  try (Workbook workbook = new HSSFWorkbook(); 
       FileOutputStream fileout = new FileOutputStream("./Excel.xls") ) {

   CellStyle cStyle = workbook.createCellStyle();
   CreationHelper createHelper = workbook.getCreationHelper();         
   //cStyle.setDataFormat(createHelper.createDataFormat().getFormat("dd/MM/yyyy"));
   //cStyle.setDataFormat(createHelper.createDataFormat().getFormat("dd\\/MM\\/yyyy"));
   cStyle.setDataFormat(createHelper.createDataFormat().getFormat("dd\"/\"MM\"/\"yyyy"));

   Sheet excelSheet = workbook.createSheet();
  
   for (int r = 1; r < 10; r++) {
    Row dataRow = excelSheet.createRow(r);;
    Cell dataCell = dataRow.createCell(1);;
    dataCell.setCellValue(new java.util.GregorianCalendar(2023, 3, r*2, r, r, r));
    dataCell.setCellStyle(cStyle);
   }

   excelSheet.setColumnWidth(1, 15 * 256);

   workbook.write(fileout);
  }

 }
}

当涉及到有关此文档的问题时,有:
Number format codes
区域化:
Number formatting
但由于我们使用Apache POI而不是Excel GUI级别的文件存储级别,因此还需要了解以下内容:
Microsoft Office始终将en_US设置存储在文件中。区域化仅在GUI中完成。
因此,对于数字格式,这意味着:
文件中存储的数字格式#,##0.00在GUI中可以是#.##0,00,该GUI使用区域设置,其中逗号是十进制分隔符,点是千位分隔符。
文件中存储的日期格式DD/MM/YYYY在使用区域设置的GUI中可能是DD.MM.YYYY,其中点是日期分隔符。在该区域语言中,当“Day”拼写“Tag”而“Year”拼写“Jahr”时,它也可能是TT.MM.JJJJ
如果将DD/MM/YYYY放在一个没有斜线作为日期分隔符的GUI中,那么在文件存储中将存储DD\/MM\/YYYY,以标记斜线为无意义的字符。但由于Apache POI直接写入文件存储,因此需要直接使用DD\/MM\/YYYY。否则斜线表示默认的日期分隔符。

相关问题