Apache POI getFontAt(XLS)

时间:2014-08-04 12:54:30

标签: java apache-poi

我正在尝试解析.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的确切列表?谢谢!

2 个答案:

答案 0 :(得分: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>";
                            }
                        }       

我希望这有助于某人。

答案 1 :(得分:0)

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