当前位置: 首页 > 面试题库 >

POI Excel:获取样式名称

南门嘉
2023-03-14
问题内容

我想阅读给应用于xlsx文档中单元格的样式的名称。我已经提取了文件,并且在xl / styles.xml中可以找到样式名称:

<cellStyles count="3">
  <cellStyle xfId="2" builtinId="7" name="Currency [0]"/>
  <cellStyle xfId="0" builtinId="0" name="Normal"/>
  <cellStyle xfId="1" name="test style"/>
</cellStyles>

我想要的样式名称是“测试样式”。目前,我有以下代码,并且我可以获取xfId而不是名称:

@Override
public String getName(Workbook table, XSSFCell cell, String value) {
   XSSFCellStyle cellStyle = cell.getCellStyle();
   CellColor cellColor = new CellColor(cellStyle);
   int xfId = cellStyle.getCoreXf().getFillId();

   //todo: fint name, not xfId

   return null;
}

有谁知道我是否可以用poi获得样式名称,以及我将如何进行?

如果这不可能,那么我可以基于xfId将背景颜色设为rgb吗?

问候


问题答案:

经过大量的挖掘,我找到了解决方案。我想我会在这里分享。我仍然没有找到样式的名称。但是我已经找到一种获得颜色的方法。

CellStyle有一个xf对象,该对象保存了所用填充的参考索引。您可以从“工作簿样式表”中获取填充。

填充根据颜色是不同的来引用颜色。它只是具有您可以解析的rgb字符串,或者具有主题ID和色调值。

您可以像填充一样从StylesTable中获取主题。并且该主题具有rgb值。我不确定如何应用色调,但是在我的测试中并没有必要。

private int red;
private int green;
private int blue;

public void loadRgb(XSSFWorkbook table, XSSFCellStyle variableStyle) {
   long fillId = variableStyle.getCoreXf().getFillId();
   StylesTable stylesSource = table.getStylesSource();
   XSSFCellFill fill = stylesSource.getFillAt((int) fillId);
   CTColor fgColor = fill.getCTFill().getPatternFill().getFgColor();
   if (fgColor != null) {
      if (fgColor.xgetRgb() != null) {
         convert(fgColor.xgetRgb().getStringValue());
      } else {
         convert(stylesSource.getTheme().getThemeColor((int) fgColor.getTheme()).getRgb());
      }
   }
}

private void convert(String stringValue) {
   // the string value contains an alpha value, so we skip the first 2 chars
   red = Integer.valueOf(stringValue.substring(2, 4), 16).intValue();
   green = Integer.valueOf(stringValue.substring(4, 6), 16).intValue();
   blue = Integer.valueOf(stringValue.substring(6, 8), 16).intValue();
}

private void convert(byte[] rgb) {
   if (rgb != null) {
      // Bytes are signed, so values of 128+ are negative!
      // 0: red, 1: green, 2: blue
      red = (rgb[0] < 0) ? (rgb[0] + 256) : rgb[0];
      green = (rgb[1] < 0) ? (rgb[1] + 256) : rgb[1];
      blue = (rgb[2] < 0) ? (rgb[2] + 256) : rgb[2];
   }
}


 类似资料:
  • 问题内容: 是否可以使用JavaScript获取对象的所有样式?就像是: 问题答案: 在上一篇文章中,这是一个函数: 如何使用它: CSS: JS:

  • 问题内容: 这是用于提供行和列ID时提供COLUMN名称的代码,但是当我提供like值时,它应该返回,但返回 我在做什么错了? (此代码是EXCEL列的参考,在这里我提供了Row,Column ID值,并期望相同的ALPHABETIC值。) 问题答案: 编辑:我认为我必须承认,正如其他一些人(他们从未留下过我的评论)所指出的那样,我的答案的上一版本(您接受了)存在一个错误,该错误使其无法正确处理大

  • 返回指定元素的CSS规则的值。 使用 Window.getComputedStyle() 获取指定元素的CSS规则的值。 const getStyle = (el, ruleName) => getComputedStyle(el)[ruleName]; getStyle(document.querySelector('p'), 'font-size'); // '16px'

  • 问题内容: 我一直在使用Pro JavaScript Techniques的John Resig 函数来获取元素的样式: 是否可以仅获取样式表指定的元素样式(如果样式未定义,则返回null)? 更新: 为什么我需要这样的野兽?我正在构建一个允许用户设置元素样式的小组件。一个可应用的样式是- ,, -使用无样式元素默认。这使得无法确定元素是居中还是因为用户希望居中,还是因为这是默认样式而居中。 问题

  • 问题内容: 我在表Product_Category(MSSQL 2008 r2)中具有简单的多对多关系: 如何选择具有以下条件的ProductId:CategoryId = 200 和 CategoryId = 300 且 CategoryId = 400? 查询示例(以下sql不起作用): 我期望结果:ProductId = 2 问题答案:

  • 本文向大家介绍JS获取CSS样式(style/getComputedStyle/currentStyle),包括了JS获取CSS样式(style/getComputedStyle/currentStyle)的使用技巧和注意事项,需要的朋友参考一下 CSS的样式分为三类: 内嵌样式:是写在Tag里面的,内嵌样式只对所有的Tag有效。 内部样式:是写在HTML的里面的,内部样式只对所在的网页有效。 外