以下是我的代码:
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
答案 0 :(得分:2)
我怀疑您的问题是您通过CellStyle
获得了Cell.getCellStyle
然后覆盖了CellStyle
。
CellStyle
位于Excel
级Workbook
。这意味着,并非每个单元格都拥有自己的单元格样式,但单元格共享工作簿级别定义的单元格样式。
因此,如果您通过CellStyle
获取Cell.getCellStyle
,然后多次覆盖CellStyle
,那么只有最后一次覆盖才会生效。所以我怀疑,你的完整代码覆盖了相同的单元格样式,从另一个单元格中获取,用你的日期数字格式覆盖后用另一种数字格式。
简单的结论可能是真正给每个细胞提供自己的细胞样式。但这也是错误的,因为工作簿中的单元格样式数量有限制。所以我们需要
要实现此目标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();
}
}
}