如何使用Apache POI修改单元格内容同时保留格式
修改Excel单元格单个字符并保留原有格式(POI实现)
直接用setCellValue会覆盖单元格的富文本格式,要实现修改单个字符同时保留格式,得通过RichTextString操作单元格内容——POI里单元格的富文本格式是绑定在每个字符上的,直接操作富文本对象就能保留原有格式信息。
实现步骤
- 获取目标单元格的富文本对象,若无则将普通文本转为富文本
- 修改指定位置的字符,同时复制原有每个字符的格式
- 将修改后的富文本对象重新设回单元格
代码示例(适配.xlsx格式,XSSF)
import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRichTextString; import org.apache.poi.ss.usermodel.Font; // 获取目标单元格 XSSFCell cell = sheet.getRow(rowIndex).getCell(cellIndex); // 读取单元格原有富文本内容 XSSFRichTextString originalRichText = (XSSFRichTextString) cell.getRichStringCellValue(); String originalText = originalRichText.getString(); // 修改指定索引的字符(示例:把索引2的字符改成'X') int targetIndex = 2; if (targetIndex >= 0 && targetIndex < originalText.length()) { StringBuilder newText = new StringBuilder(originalText); newText.setCharAt(targetIndex, 'X'); // 创建新富文本对象,复制原有格式 XSSFRichTextString newRichText = new XSSFRichTextString(newText.toString()); for (int i = 0; i < originalText.length(); i++) { Font font = originalRichText.getFontAtIndex(i); if (font != null) { // 将原字符格式应用到新文本对应位置 newRichText.applyFont(i, i + 1, font); } } // 把修改后的富文本写回单元格 cell.setCellValue(newRichText); }
注意事项
- 若处理
.xls旧格式,替换为HSSFRichTextString和HSSFCell即可 - 如果需要给修改的字符单独设置新格式,可在复制完原有格式后,单独为目标索引绑定新
Font对象 - 确保目标单元格是文本类型,若为数值/公式类型,需先转为文本再操作
内容的提问来源于stack exchange,提问作者Robin
相关产品推荐
相关产品推荐

