如何在Excel POI中将Excel单元格格式化为日期,与Excel中的“格式刷”操作一样

我是Apache POI的新手,我想知道怎么做Format Painter操作将一个单元格格式化为Date格式,每次当我尝试复制单元格的日期格式时,在POI中,它只能给我数字,我不知道我该如何保留日期格式?

// Get source cell type and style CellType type_from = cell_from.getCellTypeEnum(); CellStyle style_from = cell_from.getCellStyle(); // Get source cell data format short df = style_from.getDataFormat(); // Change dest cell cell type, set format on it cell_to.setCellType(type_from); CellStyle style_to = cell_to.getCellStyle(); style_to.setDataFormat(df); cell_to.setCellStyle(style_to); 

我需要更改其他一些样式,如边框,背景颜色,字体斜体等。 你能给出一个例子:创建一个xlsx文件,将1A设置为数字(比如10),将2A设置为文本(“10”)1B到日期(01/12/2018),2B到10000(只是一个数字),然后尝试将2A转换为带有字体16和绿色单元格背景的数字,并将2B转换为日期,格式与1B相同但斜体字体。

正如评论中已经说过的那样,只有您的代码片段才能重现该问题。 这表明为什么需要最小,完整和可validation的例子 。

我怀疑以下内容:您正在循环中使用片段,并且将不同的style_from作为源多次更改相同的样式style_to 。 这是可能的,因为多个单元cell_to可以共享相同的样式。

操作Excel电子表格的单元格样式并不像人们想象的那么简单。 单元格样式存储在工作簿级别,在现代Excel版本中限制为64,000种唯一单元格格式/单元格样式。 所以必须小心新的创建单元格样式。 至少有一个不应该尝试为每个单元格创建新的单元格样式。

Apache poi提供了CellUtil ,它具有各种实用function,可以更轻松地处理单元格和行。 处理样式的各种方法允许您根据需要创建CellStyle 。 将样式更改应用于单元格时,代码将尝试查看是否已存在满足您需求的样式。 如果没有,那么它将创建一种新的风格。 这是为了防止创建太多样式。 到目前为止缺少的是与处理字体相同的实用程序function。 字体也在工作簿级别,因此也不应该小心创建。

以下示例还提供了用于创建字体的实用程序函数。

它需要你在上一篇评论中描述的ExcelTest.xlsx ,并进行你在那里描述的变化。 它还进行了一些额外的更改,以显示实用程序function如何工作。

资源:

在此处输入图像描述

码:

 import java.io.*; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.*; import org.apache.poi.ss.util.CellUtil; import java.util.Map; import java.util.HashMap; public class ExcelSetCellStyleDataFormat { //method for getting current font from cell private static Font getFont(Cell cell) { Workbook wb = cell.getRow().getSheet().getWorkbook(); CellStyle style = cell.getCellStyle(); return wb.getFontAt(style.getFontIndex()); } private enum FontProperty { BOLD, COLOR, FONTHEIGHT, FONTNAME, ITALIC, STRIKEOUT, TYPEOFFSET, UNDERLINE } //method for getting font having special settings additional to given source font private static Font getFont(Workbook wb, Font fontSrc, Map fontproperties) { boolean isBold = fontSrc.getBold(); short color = fontSrc.getColor(); short fontHeight = fontSrc.getFontHeight(); String fontName = fontSrc.getFontName(); boolean isItalic = fontSrc.getItalic(); boolean isStrikeout = fontSrc.getStrikeout(); short typeOffset = fontSrc.getTypeOffset(); byte underline = fontSrc.getUnderline(); for (FontProperty property : fontproperties.keySet()) { switch (property) { case BOLD: isBold = (boolean)fontproperties.get(property); break; case COLOR: color = (short)fontproperties.get(property); break; case FONTHEIGHT: fontHeight = (short)fontproperties.get(property); break; case FONTNAME: fontName = (String)fontproperties.get(property); break; case ITALIC: isItalic = (boolean)fontproperties.get(property); break; case STRIKEOUT: isStrikeout = (boolean)fontproperties.get(property); break; case TYPEOFFSET: typeOffset = (short)fontproperties.get(property); break; case UNDERLINE: underline = (byte)fontproperties.get(property); break; } } Font font = wb.findFont(isBold, color, fontHeight, fontName, isItalic, isStrikeout, typeOffset, underline); if (font == null) { font = wb.createFont(); font.setBold(isBold); font.setColor(color); font.setFontHeight(fontHeight); font.setFontName(fontName); font.setItalic(isItalic); font.setStrikeout(isStrikeout); font.setTypeOffset(typeOffset); font.setUnderline(underline); } return font; } public static void main(String[] args) throws Exception { Workbook wb = WorkbookFactory.create(new FileInputStream("ExcelTest.xlsx")); DataFormatter formatter = new DataFormatter(); Sheet sheet = wb.getSheetAt(0); Row row = null; Cell cell = null; Font font = null; Map styleproperties = null; Map fontproperties = null; //turn cell A2 into numeric, font size 16pt and green fill color: //get cell A2 row = CellUtil.getRow(1, sheet); cell = CellUtil.getCell(row, 0); //get old cell value and set it as numeric String cellvalue = formatter.formatCellValue(cell); cell.setCellValue(Double.valueOf(cellvalue)); //get the needed font fontproperties = new HashMap(); fontproperties.put(FontProperty.FONTHEIGHT, (short)(16*20)); font = getFont(wb, getFont(cell), fontproperties); //set new cell style properties styleproperties = new HashMap(); styleproperties.put(CellUtil.DATA_FORMAT, BuiltinFormats.getBuiltinFormat("General")); styleproperties.put(CellUtil.FILL_FOREGROUND_COLOR, IndexedColors.GREEN.getIndex()); styleproperties.put(CellUtil.FILL_PATTERN, FillPatternType.SOLID_FOREGROUND); styleproperties.put(CellUtil.FONT, font.getIndex()); CellUtil.setCellStyleProperties(cell, styleproperties); //get data format from B1 row = CellUtil.getRow(0, sheet); cell = CellUtil.getCell(row, 1); short dataFormatB1 = cell.getCellStyle().getDataFormat(); //turn B2 into same data format as B1 and italic font: //get cell B2 row = CellUtil.getRow(1, sheet); cell = CellUtil.getCell(row, 1); //get the needed font fontproperties = new HashMap(); fontproperties.put(FontProperty.ITALIC, true); font = getFont(wb, getFont(cell), fontproperties); //set new cell style properties styleproperties = new HashMap(); styleproperties.put(CellUtil.DATA_FORMAT, dataFormatB1); styleproperties.put(CellUtil.FONT, font.getIndex()); CellUtil.setCellStyleProperties(cell, styleproperties); //set new cell D6 having special font settings row = CellUtil.getRow(5, sheet); cell = CellUtil.getCell(row, 3); fontproperties = new HashMap(); fontproperties.put(FontProperty.BOLD, true); fontproperties.put(FontProperty.COLOR, IndexedColors.BLUE.getIndex()); fontproperties.put(FontProperty.FONTHEIGHT, (short)(20*20)); fontproperties.put(FontProperty.FONTNAME, "Courier New"); fontproperties.put(FontProperty.STRIKEOUT, true); fontproperties.put(FontProperty.UNDERLINE, Font.U_DOUBLE); font = getFont(wb, getFont(cell), fontproperties); styleproperties = new HashMap(); styleproperties.put(CellUtil.FONT, font.getIndex()); CellUtil.setCellStyleProperties(cell, styleproperties); cell.setCellValue("new cell"); //set new cell C4 having special font settings row = CellUtil.getRow(3, sheet); cell = CellUtil.getCell(row, 2); fontproperties = new HashMap(); fontproperties.put(FontProperty.BOLD, true); fontproperties.put(FontProperty.COLOR, IndexedColors.DARK_RED.getIndex()); fontproperties.put(FontProperty.FONTHEIGHT, (short)(42*20)); fontproperties.put(FontProperty.FONTNAME, "Times New Roman"); fontproperties.put(FontProperty.ITALIC, true); font = getFont(wb, getFont(cell), fontproperties); styleproperties = new HashMap(); styleproperties.put(CellUtil.FONT, font.getIndex()); CellUtil.setCellStyleProperties(cell, styleproperties); //set rich textt string into that cell RichTextString richString = new XSSFRichTextString("E = m c2"); //^0 ^7 fontproperties = new HashMap(); fontproperties.put(FontProperty.TYPEOFFSET, Font.SS_SUPER); font = getFont(wb, getFont(cell), fontproperties); richString.applyFont(7, 8, font); cell.setCellValue(richString); wb.write(new FileOutputStream("ExcelTestNew.xlsx")); wb.close(); } } 

结果:

在此处输入图像描述