正如评论中所述,仅使用您的代码片段无法重现该问题。这说明了为什么最小、完整且可验证的示例是必要的。
我怀疑以下内容:您正在循环中使用片段并更改相同的样式style_to
多次有不同的style_from
作为源。这是可能的,因为多个单元cell_to
可能有相同的风格。
操作单元格样式Excel
电子表格并不像人们想象的那么简单。单元格样式存储在工作簿级别,并且limited现代 64,000 种独特的单元格格式/单元格样式Excel
版本。因此,必须小心创建新的单元格样式。至少不应尝试为每个单元格创建新的单元格样式。
Apache poi
提供CellUtil它具有各种实用功能,使单元格和行的处理变得更加容易。处理风格的各种方法允许您创建自己的风格CellStyle
满足您的需要。当您将样式更改应用于单元格时,代码将尝试查看是否已存在满足您需求的样式。如果没有,那么它将创造一种新的风格。这是为了防止创建太多样式。到目前为止,缺少的是处理字体的相同实用函数。字体也是工作簿级别的,因此也不应该不小心地创建。
以下示例也提供了用于创建字体的实用函数。
它需要ExcelTest.xlsx
正如您在上一条评论中所描述的那样,并进行了您在那里所描述的更改。它还进行了一些额外的更改以显示实用程序函数如何工作。
Source:
![enter image description here](https://i.stack.imgur.com/LrqbZ.png)
Code:
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();
}
}
Result:
![enter image description here](https://i.stack.imgur.com/dC4z7.png)