当前位置: 首页 > 知识库问答 >
问题:

如何重用Apache POI中的字体?

辛意智
2023-03-14
Map<String, Font> fonts = new HashMap<>();

CustomProperties customProps  = workbook.getProperties().getCustomProperties(); 

if(customProps.contains("arial_12_b")) {
    short index = customProps.getProperty("arial_12_b").getI2();
    fonts.put("arial_12_b", workbook.getFontAt(index));
} else {                                
    Font font = workbook.createFont();
    font.setFontName("Arial");
    font.setFontHeightInPoints((short)12);
    font.setBold(true);

    customProps.addProperty("arial_12_b", font.getIndex());

    fonts.put("arial_12_b", font);
}

CellStyle通过CellUtil类解决了同样的问题,CellUtil类检查CellStyle是否已经存在,如果不存在则创建它。有字体的simular吗?


AFoeee致以最诚挚的问候

共有1个答案

斜向文
2023-03-14

可以提供一种使用workbook.findfont来实现您所要求的内容的方法。与cellutil.setCellStyleProperties非常相似,它可以使用映射 object> fontProperties 来设置字体属性,其中fontPropertyworkbook.findfont当前检查的所有属性的枚举。这是粗体,颜色,字体,字体名称,斜体,三振线,TYPEOFFSET,下划线。

示例:

 //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;
 }

在此代码中,workbook.findfont用于尝试找到一个已经具有所有属性的字体。只有当没有找到时(if(font==null)),才会创建一个新的字体。

如何使用:

  //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");
 类似资料:
  • 我试图读取xlsx格式的excel文件。但是我得到的结果太大,无效的句柄异常。我把文件实例在一个FileInputStream对象,并试图在XSSFWorkbook中设置该对象。但是我得到了这个例外。 我工作的环境中没有安装Microsoft office,并且有开放式office。我没有在open office中编辑我的xlsx文件。但我在open office中打开了文件,然后尝试运行poi代

  • 现在我有一个docx文件,我加载到 我可以看到存储在style中的不同样式的当前字体大小。通过做xml 我想用poi更新字体大小,所以我试了一下 但是,在完成上述代码后,如果我使用第一段代码检查文档的字体大小(object),字体大小仍然是原始值,而不是我想要设置的12。 对于如何解决这个问题,有什么建议吗?

  • 我正在尝试用android显示PPT文件。我从ApachePOI开始,bcoz我还没有找到任何免费的开源jar。我从将ppt幻灯片转换为图像开始,参考此链接将PowerPoint幻灯片导出为java。awt。图表2D 这是Java语言。我找不到Dimension、BuffereImage和Graphics2D类。我已经导入了poi-scratchpad-3.8-20120326。jar在我的构建路

  • 嗨,我想在第一行搜索一个字符串,如果找到了,我想移动那一列。

  • 我想使用@RunFor(Parameterized.class)和 实际的测试数据应由业务人员通过Excel创建。 是否有一种简单/通用的方法可以将Apache POI XSSFSheet获取到指定的字符串数组集合? 如果是:有人能提供一个例子吗? 我发现了这个问题:使用Apache POI在TestNG中进行Datadriven测试---但我希望是一种3线测试;-)

  • 如何使用Apache POI使整个excel行单元格加粗文本? 例如: 列标题应该用粗体。与其为标题行的每个单元格应用样式,我如何将一些样式应用于整行?