如何将Date值设置为单元格

时间:2017-12-19 16:49:35

标签: java excel apache-poi xssf

以下是我的代码:

String monthEndDate = "31-Dec-17";
SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yy",java.util.Locale.ENGLISH);
XSSFCell updateDateCell = sheet.getRow(rownumber).getCell(15);
XSSFCellStyle cellStyle = (XSSFCellStyle)updateDateCell.getCellStyle();
CreationHelper createHelper = wb.getCreationHelper();
cellStyle.setDataFormat(
createHelper.createDataFormat().getFormat("dd-MMM-yy"));
Date updateDate = sdf.parse(monthEndDate);
updateDateCell.setCellValue(updateDate);
updateDateCell.setCellStyle(cellStyle);

设置数值 43100.0

3 个答案:

答案 0 :(得分:2)

我怀疑您的问题是您通过CellStyle获得了Cell.getCellStyle然后覆盖了CellStyle

CellStyle位于ExcelWorkbook。这意味着,并非每个单元格都拥有自己的单元格样式,但单元格共享工作簿级别定义的单元格样式。

因此,如果您通过CellStyle获取Cell.getCellStyle,然后多次覆盖CellStyle,那么只有最后一次覆盖才会生效。所以我怀疑,你的完整代码覆盖了相同的单元格样式,从另一个单元格中获取,用你的日期数字格式覆盖后用另一种数字格式。

简单的结论可能是真正给每个细胞提供自己的细胞样式。但这也是错误的,因为工作簿中的单元格样式数量有限制。所以我们需要

  1. 根据需要拥有尽可能多的自己的单元格样式。
  2. 尽可能多地共享单元格样式。
  3. 要实现此目标CellUtil可以在apache poi中使用。如果工作簿中尚未定义相同的单元格样式,并且只是在工作簿中已定义相同的单元格样式时使用该单元格样式,则此方法仅提供创建新单元格样式的方法。

    示例:

    import java.io.*;
    import org.apache.poi.ss.usermodel.*;
    import org.apache.poi.xssf.usermodel.*;
    
    import org.apache.poi.ss.util.CellUtil;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import java.util.Map;
    import java.util.HashMap;
    
    public class ExcelSetDateValue {
    
     public static void main(String[] args) throws Exception {
      XSSFWorkbook wb = (XSSFWorkbook)WorkbookFactory.create(new FileInputStream("ExcelTest.xlsx"));
    
      //possiby we need data formats
      DataFormat dataFormat = wb.createDataFormat();
    
      //get sheet and set row number
      XSSFSheet sheet = wb.getSheetAt(0);
      int rownumber = 3;
    
      //get the date
      String monthEndDate = "31-Dec-17";
      SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yy", java.util.Locale.ENGLISH);
      Date updateDate = sdf.parse(monthEndDate);
    
      //set date as cell value
      XSSFCell updateDateCell = sheet.getRow(rownumber).getCell(15);
      updateDateCell.setCellValue(updateDate);
    
      //use CellUtil to set the CellStyleProperties
      Map<String, Object> properties = new HashMap<String, Object>();
      properties.put(CellUtil.DATA_FORMAT, dataFormat.getFormat("dd-MMM-yy"));
      CellUtil.setCellStyleProperties(updateDateCell, properties);
    
      wb.write(new FileOutputStream("ExcelTestNew.xlsx"));
      wb.close();
     }  
    }
    

答案 1 :(得分:0)

在代码末尾添加updateDateCell = Format(updateDateCell, "dd-MMM-yyyy")

你应该得到31-Dec-2017

答案 2 :(得分:0)

这是我已经用于格式化日期的示例,您可以重用它的一部分(我标记了相关的代码行)。如果有任何问题让我知道,它已经过测试并且工作正常。

// UPDATE 请参阅Axel Richter的回答https://stackoverflow.com/a/47920182/1053496以获得正确答案。在我的例子中,我将日期存储为String而不是Date对象,这不是推荐的方式

import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.xssf.usermodel.*;

import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;



public class WriteExcelBasic {
    public static void main(String[] args) throws IOException {

        String excelFileName = "/Users/home/Test3.xls";
        FileOutputStream fos = new FileOutputStream(excelFileName);


        XSSFWorkbook wb = new XSSFWorkbook();
        XSSFCellStyle style = wb.createCellStyle();

        XSSFSheet sheet = wb.createSheet("sheet");
        XSSFFont urlFont = wb.createFont();
        style.setFont(urlFont);
        String monthEndDate = "31-Dec-17";
        DataFormat df = wb.createDataFormat(); //these 3 lines  are enough
         short dateFormat = df.getFormat("dd-MMM-yy"); // 2nd 
        style.setDataFormat(dateFormat); // 3rd


        for (int r = 0; r < 1; r++) {
            XSSFRow row = sheet.createRow(r);
            row.setHeight((short) -1);
            for (int c = 0; c < 3; c++) {
                XSSFCell cell = row.createCell(c);
                String ss = "31-Dec-17";
                cell.setCellValue(ss);
                    style.setWrapText(true);
                cell.setCellStyle(style);
            }
        }

        try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
            wb.write(baos);
            byte[] myByteArray = baos.toByteArray();
            fos.write(myByteArray);
            fos.flush();
        }
        finally {
            wb.close();
            fos.close();
        }
    }
}