【问题标题】:Apache POI getFontAt (XLS)Apache POI getFontAt (XLS)
【发布时间】:2014-09-26 22:56:56
【问题描述】:

我正在尝试解析 .xls 文档。因此我需要查看一个特定的字母是否是粗体/斜体/等。

据我所知,有 3 种方法可以通过 apache.POI 获得我想要的东西:

- HSSFFont font = workbook.getFontAt((short)i); (This one iterates
through the whole document)
- HSSFRichTextString s = (HSSFRichTextString)cell.getRichStringCellValue(); This one looks at
a given index, which should be best for me and
- http://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFCellStyle.html this one won't work for me, because i dont want the style of a given Cell, i want the formatting of a given single letter.

这是我迄今为止尝试过的(还考虑了 stackoverflow 上的几篇关于此的帖子):

if(this.formatFlag) {
                        boolean boldFlag = false;
                        boolean italicFlag = false;

                        HSSFRichTextString s = (HSSFRichTextString)cell.getRichStringCellValue();
                        for(int i = 0; i < s.length(); i++) {
                            int x = s.getFontAtIndex(i);
                            System.out.println("FormatCode: " + x + "-" + s.getString().charAt(i));
                        }

当让这个运行在 .xls 文档上时,我往往会在实际上有粗体文本的地方得到大量的“0”,这告诉我它不起作用。当只有普通文本时,我有时也会得到 15/16。所以我似乎没有正确使用这个功能。有什么想法吗?

另外:我在哪里可以找到格式 ID 的确切列表?谢谢!

【问题讨论】:

  • 您是否检查了适用于单元格的单元格样式上的字体?这是默认使用的,除非其他格式覆盖它
  • 我按了 STRING + A 并将整个表格设置为相同的字体、相同的大小、相同的对齐方式等。除了某些字母或单元格为粗体外,所有内容的格式都相同。这个 (System.out.println(workbook.getFontAt(cell.getCellStyle().getFontIndex()).getBoldweight());) 给了我完美的单元格值,不管它是否粗体。但是我怎样才能得到与单元格的每个字母对应的值呢? ...
  • 迭代 RichTextString 中的运行。如果它们有样式,则获取它们,如果不使用单元格的单元格样式?
  • 我实际上不知道该怎么做,因为 API 文档并没有真正的帮助。非常感谢您的提示,我现在可以使用它,并将在此处发布我的工作代码以防其他人需要它。 :)
  • 对文档的改进建议总是很感激!如果您能想到一个好的解释方法,请为该项目打开一个错误并详细说明改进

标签: java apache-poi


【解决方案1】:

感谢 Gagravarr 的提示,这是一个非常有效的解决方案:

HSSFRichTextString s = (HSSFRichTextString) cell.getRichStringCellValue();
                        int wbBold = workbook.getFontAt(cell.getCellStyle().getFontIndex()).getBoldweight();
                        boolean wbItalic = workbook.getFontAt(cell.getCellStyle().getFontIndex()).getItalic();

                        if(wbBold == Font.BOLDWEIGHT_BOLD) {
                            data = "<b>" + s.getString() + "</b>";
                        }
                        else if(wbItalic) {
                            data = "<i>" + s.getString() + "</i>";
                        }
                        else {
                            for(int i = 0; i < s.length(); i++) {
                                HSSFFont font = workbook.getFontAt(s.getFontAtIndex(i));

                                if(font.getItalic() && !italicFlag) {
                                    data += "<i>" + s.getString().charAt(i);
                                    italicFlag = true;
                                }
                                else if (!font.getItalic() && italicFlag) {
                                    data += "</i>" + s.getString().charAt(i);
                                    italicFlag = false;
                                }                           
                                else if((font.getBoldweight() == Font.BOLDWEIGHT_BOLD) && !boldFlag) {
                                    data += "<b>" + s.getString().charAt(i);
                                    boldFlag = true;
                                }
                                else if ((font.getBoldweight() != Font.BOLDWEIGHT_BOLD) && boldFlag) {
                                    data += "<b/>" + s.getString().charAt(i);
                                    boldFlag = false;
                                }
                                else {
                                    data += s.getString().charAt(i);
                                }
                            }

                            if(boldFlag) {
                                data += "</b>";
                            }
                            if(italicFlag) {
                                data += "</i>";
                            }
                        }       

我希望这对某人有所帮助。

【讨论】:

    【解决方案2】:

    getFontAtIndex 只返回字体的索引。 使用相应工作簿中的getFontAt(short idx) 并使用其粗体。

    【讨论】:

    • 我不能这样做,因为我正在逐个单元格地迭代工作簿单元格并处理与单元格类型相对应的数据。所以一旦我进入一个我真正想要解析的单元格,我就有了 cell.getRichStringCellValue()。之后我需要查看这个字符串哪个字母是粗体的。即使我可以使用该解决方案:为什么我的代码不起作用并且在每种情况下都给我 0 而不是 6 的粗体文本?
    猜你喜欢
    • 1970-01-01
    • 2014-02-23
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    • 2013-07-10
    • 2015-11-25
    相关资源
    最近更新 更多