Как отформатировать ячейку Excel как дату в Apache POI, как с помощью операции "Форматирование в Excel" в Excel
Я довольно новичок в Apache POI, мне интересно, как сделать эту операцию Format Painter для форматирования ячейки в формат Date, каждый раз, когда я пытаюсь скопировать формат даты ячейки, в POI, это может дать мне только Numeric, мне интересно как я могу сохранить формат даты?
// 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, но курсивом.
1 ответ
Как уже говорилось в комментарии, проблема не воспроизводима, если у вас есть только фрагмент кода. Это показывает, почему необходимы минимальные, полные и проверяемые примеры.
Я подозреваю следующее: у вас есть фрагмент в цикле и вы меняете тот же стиль style_to
несколько раз, имеющие разные style_from
как источник Это возможно, так как несколько ячеек cell_to
может разделить тот же стиль.
Управление стилями ячеек для Excel
Таблицы не так просты, как можно подумать. Стили ячеек хранятся на уровне рабочей книги и ограничены 64 000 уникальных форматов ячеек / стилей ячеек в современном Excel
версии. Поэтому нужно быть осторожным с новыми стилями создания ячеек. По крайней мере, не следует пытаться создать новый стиль ячейки для каждой отдельной ячейки.
Apache poi
предоставляет CellUtil, который имеет различные служебные функции, облегчающие работу с ячейками и строками. Различные методы, которые имеют дело со стилем, позволяют вам создавать свои CellStyle
как вам они нужны. Когда вы применяете изменение стиля к ячейке, код будет пытаться определить, существует ли уже стиль, соответствующий вашим потребностям. Если нет, то это создаст новый стиль. Это сделано для того, чтобы не создавать слишком много стилей. До сих пор не хватает тех же утилит для работы со шрифтами. Шрифты также находятся на уровне рабочих тетрадей и поэтому не должны создаваться без заботы.
В следующем примере представлены вспомогательные функции для создания шрифтов.
Требуется ExcelTest.xlsx
как вы описали в своем последнем комментарии и вносите изменения, которые вы также описали там. Это также делает некоторые дополнительные изменения, чтобы показать, как работают функции утилиты.
Источник:
Код:
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<FontProperty, Object> 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<String, Object> styleproperties = null;
Map<FontProperty, Object> 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<FontProperty, Object>();
fontproperties.put(FontProperty.FONTHEIGHT, (short)(16*20));
font = getFont(wb, getFont(cell), fontproperties);
//set new cell style properties
styleproperties = new HashMap<String, Object>();
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<FontProperty, Object>();
fontproperties.put(FontProperty.ITALIC, true);
font = getFont(wb, getFont(cell), fontproperties);
//set new cell style properties
styleproperties = new HashMap<String, Object>();
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<FontProperty, Object>();
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<String, Object>();
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<FontProperty, Object>();
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<String, Object>();
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<FontProperty, Object>();
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();
}
}
Результат: