我使用下面的代码将日期值设置为excel单元格,但它在excel单元格中显示双倍值。要求是在打开excel时查看日期值。
row = sheet.createRow(rowNum++);
cell = row.createCell(0);
XSSFCellStyle cellStyle = (XSSFCellStyle)cell.getCellStyle();
cellStyle.setDataFormat(workbook.createDataFormat().getFormat("mm/dd/yyyy"));
Date loginDate = formatStringToDate(entry.getKey(),"yyyy-MM-dd");
cell.setCellValue(loginDate);
cell.setCellStyle(cellStyle);
当我打开并看到单元格格式时,它显示为General,如下所示
如果我在excel中将格式更改为日期,那么它在单元格中显示日期值,但我希望单元格默认显示日期值
答案 0 :(得分:2)
首先,您需要了解Excel
如何管理其细胞样式。它在工作簿级别执行此操作,以便不是每个单元格都有自己的单元格样式。相反,根据需要有不同的细胞样式,细胞正在使用其中一种细胞样式。
新创建的单元格具有默认单元格样式,如果在此新创建的单元格上使用Cell.getCellStyle,您将获得此默认单元格样式。因此,您的代码会尝试将默认单元格样式设置为日期格式的单元格样式。这不是要走的路。
因此,首先在工作簿级别上,我们根据需要创建尽可能多的单元格样式。例如,一个日期格式化的单元格样式和一种货币格式的单元格样式。
然后我们正在创建工作表和单元格,并将数据放入单元格中。如果单元格需要特殊的单元格样式,那么我们使用的是之前创建的单元格样式之一。
示例:
import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Map;
import java.util.TreeMap;
import java.util.List;
import java.util.Arrays;
public class CreateExcelNumberFormats {
public static void main(String[] args) throws Exception {
Map<Date, List<Object>> data = new TreeMap<Date, List<Object>>();
data.put(new GregorianCalendar(2017, 9, 29, 6, 0).getTime(), Arrays.asList("user 1", 1234.56));
data.put(new GregorianCalendar(2017, 9, 30, 6, 0).getTime(), Arrays.asList("user 2", 789.12));
data.put(new GregorianCalendar(2017, 9, 31, 6, 0).getTime(), Arrays.asList("user 3", 131415.16));
data.put(new GregorianCalendar(2017, 9, 29, 15, 45).getTime(), Arrays.asList("user 4", 1234567.89));
data.put(new GregorianCalendar(2017, 9, 30, 9, 45).getTime(), Arrays.asList("user 5", 123.45));
Workbook wb = new XSSFWorkbook();
CreationHelper creationHelper = wb.getCreationHelper();
//on workbook level we are creating as much cell styles as needed:
CellStyle datestyle = wb.createCellStyle();
datestyle.setDataFormat(creationHelper.createDataFormat().getFormat("mm/dd/yyyy"));
CellStyle currencystyle = wb.createCellStyle();
currencystyle.setDataFormat(creationHelper.createDataFormat().getFormat("$#,##0.00"));
//now we are creating the sheet and the cells and are putting the data into the cells
Sheet sheet = wb.createSheet();
Row row = sheet.createRow(0);
Cell cell = row.createCell(0);
cell.setCellValue("Date");
cell = row.createCell(1);
cell.setCellValue("Logged in User");
cell = row.createCell(2);
cell.setCellValue("Amount");
int rowNum = 1;
for (Map.Entry<Date, List<Object>> entry : data.entrySet()) {
row = sheet.createRow(rowNum++);
cell = row.createCell(0);
Date loginDate = entry.getKey();
cell.setCellValue(loginDate);
//if the cell needs a special cell style, then we are using one of the ones we have previous created
cell.setCellStyle(datestyle);
List<Object> userdatas = entry.getValue();
int cellNum = 1;
for (Object userdata : userdatas) {
cell = row.createCell(cellNum);
if (cellNum == 1) {
cell.setCellValue((String)userdata);
} else if (cellNum == 2) {
cell.setCellValue((Double)userdata);
//if the cell needs a special cell style, then we are using one of the ones we have previous created
cell.setCellStyle(currencystyle);
}
cellNum++;
}
}
wb.write(new FileOutputStream("CreateExcelNumberFormats.xlsx"));
wb.close();
}
}