POI – 如何将单元格值设置为“date”并应用默认的Exceldate格式?

我一直在使用Apache POI一段时间以编程方式读取现有的Excel 2003文件。 现在我有了一个新的需求,即在内存中创build完整的.xls文件(仍然使用Apache POI),最后将它们写入文件。 站在我面前的唯一问题是处理有date的细胞。

考虑下面的代码:

Date myDate = new Date(); HSSFCell myCell; // code that assigns a cell from an HSSFSheet to 'myCell' would go here... myCell.setCellValue(myDate); 

当我将包含此单元格的工作簿写入文件并使用Excel打开时,单元格将显示为一个数字。 是的,我意识到Excel会将自己的“date”存储为1900年1月1日以来的天数,这就是单元格中的数字。

问题:可以在POI中使用哪些API调用来告诉它,我希望将缺省date格式应用于我的date单元格?

理想情况下,如果用户在Excel中手动打开电子表格并键入Excel识别为date的单元格值,则希望电子表格单元格以与Excel分配的相同默认date格式显示。

http://poi.apache.org/spreadsheet/quick-guide.html#CreateDateCells

 CellStyle cellStyle = wb.createCellStyle(); CreationHelper createHelper = wb.getCreationHelper(); cellStyle.setDataFormat( createHelper.createDataFormat().getFormat("m/d/yy h:mm")); cell = row.createCell(1); cell.setCellValue(new Date()); cell.setCellStyle(cellStyle); 

这个例子用于处理.xlsx文件types。 本示例来自用于创build.xslx电子表格的.jsp页面。

 import org.apache.poi.xssf.usermodel.*; //import needed XSSFWorkbook wb = new XSSFWorkbook (); // Create workbook XSSFSheet sheet = wb.createSheet(); // Create spreadsheet in workbook XSSFRow row = sheet.createRow(rowIndex); // Create the row in the spreadsheet //1. Create the date cell style XSSFCreationHelper createHelper = wb.getCreationHelper(); XSSFCellStyle cellStyle = wb.createCellStyle(); cellStyle.setDataFormat( createHelper.createDataFormat().getFormat("MMMM dd, yyyy")); //2. Apply the Date cell style to a cell //This example sets the first cell in the row using the date cell style cell = row.createCell(0); cell.setCellValue(new Date()); cell.setCellStyle(cellStyle); 

设置为默认的Exceltypesdate(默认为操作系统级别语言环境/ – >即,如果在Excel的单元格格式select器中select它,xlsx在由德国人或英国人打开时看起来会有所不同,并且标有星号),您应该:

  CellStyle cellStyle = xssfWorkbook.createCellStyle(); cellStyle.setDataFormat((short)14); cell.setCellStyle(cellStyle); 

我用xlsx做了,它工作得很好。

我在这里写我的答案,因为这可能对其他读者有所帮助,其他读者可能与提问者略有不同。

我准备一个.xlsx模板; 所有将填充date的单元格已经格式化为date单元格(使用Excel)。

我使用Apache POI打开.xlsx模板,然后将date写入单元格,并且工作正常。

在下面的示例中,单元格A1已经在Excel中格式化,格式为[$-409]mmm yyyy ,Java代码仅用于填充单元格。

 FileInputStream inputStream = new FileInputStream(new File("Path to .xlsx template")); Workbook wb = new XSSFWorkbook(inputStream); Date date1=new Date(); Sheet xlsMainTable = (Sheet) wb.getSheetAt(0); Row myRow= CellUtil.getRow(0, xlsMainTable); CellUtil.getCell(myRow, 0).setCellValue(date1); 

当Excel打开时,date格式正确。

此代码示例可用于更改date格式。 这里我想从yyyy-MM-dd改为dd-MM-yyyy。 这里pos是列的位置。

 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.CreationHelper; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.xssf.usermodel.XSSFCellStyle; import org.apache.poi.xssf.usermodel.XSSFColor; import org.apache.poi.xssf.usermodel.XSSFFont; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; class Test{ public static void main( String[] args ) { String input="D:\\somefolder\\somefile.xlsx"; String output="D:\\somefolder\\someoutfile.xlsx" FileInputStream file = new FileInputStream(new File(input)); XSSFWorkbook workbook = new XSSFWorkbook(file); XSSFSheet sheet = workbook.getSheetAt(0); Iterator<Row> iterator = sheet.iterator(); Cell cell = null; Row row=null; row=iterator.next(); int pos=5; // 5th column is date. while(iterator.hasNext()) { row=iterator.next(); cell=row.getCell(pos-1); //CellStyle cellStyle = wb.createCellStyle(); XSSFCellStyle cellStyle = (XSSFCellStyle)cell.getCellStyle(); CreationHelper createHelper = wb.getCreationHelper(); cellStyle.setDataFormat( createHelper.createDataFormat().getFormat("dd-MM-yyyy")); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date d=null; try { d= sdf.parse(cell.getStringCellValue()); } catch (ParseException e) { // TODO Auto-generated catch block d=null; e.printStackTrace(); continue; } cell.setCellValue(d); cell.setCellStyle(cellStyle); } file.close(); FileOutputStream outFile =new FileOutputStream(new File(output)); workbook.write(outFile); workbook.close(); outFile.close(); }}