以下是我的代码:
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
最佳答案
我怀疑您的问题是您通过CellStyle
获取Cell.getCellStyle
,然后覆盖了该CellStyle
。CellStyle
在Excel
级别上定义的Workbook
中。这意味着,不是每个单元格都有自己的单元格样式,而是单元格共享在工作簿级别定义的单元格样式。
因此,如果您通过CellStyle
获取Cell.getCellStyle
,然后多次覆盖该CellStyle
,则仅最后一次覆盖将处于活动状态。因此,我怀疑您的完整代码会用日期数字格式覆盖从另一个单元格获得的相同单元格样式,并使用另一种数字格式。
一个简单的结论可能是真正给每个单元格自己的单元格样式。但这也是错误的,因为工作簿中的单元格样式数量有限。所以我们需要
具有所需的自己的单元格样式。
共享尽可能多的单元格样式。
为此,可以在apache poi
中使用CellUtil。这提供了仅在工作簿中尚未定义相同的单元格样式时创建新的单元格样式的方法,并且仅在工作簿中已经存在相同的单元格样式时使用该单元格样式的方法。
例:
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();
}
}