读取excel单元格并确定单元格中的格式化单词

时间:2013-12-22 17:40:32

标签: java excel jxl jexcelapi

是否可以从excell表中读取单元格的格式并确定哪些单词是粗体还是斜体? 我可以读取和写入单元格,我也知道JExcel可以写入格式化的单元格。在格式化的单元格中,我的意思是文本是斜体或粗体。

是否可以读取单元格数据并确定哪些单词是粗体? 例如,我将在单元格中有这个:

来自一个 excel小区的 示例 文字

我想知道字符串“excel cell”是粗体,字符串“sample”是Italic。 这在JExcel中是否可行,如果不是,我将如何在Java中执行此操作?有人可以推荐一个API吗? 也许更好的方法是削减xml文件。

2 个答案:

答案 0 :(得分:12)

我不了解JExcel,但我可以告诉你这在Apache POI中相当容易。这是一个简单的应用程序,以显示它可以完成的一种方式。这不是非常漂亮,但它应该足以让你开始:

public static final void main(String... args) throws Exception
{
    InputStream is = ExcelFormatTest.class.getResourceAsStream("Test.xlsx");
    Workbook wb = new XSSFWorkbook(is);
    Sheet sheet = wb.getSheetAt(0);
    Cell cell = sheet.getRow(0).getCell(0);
    XSSFRichTextString richText = (XSSFRichTextString)cell.getRichStringCellValue();
    int formattingRuns = cell.getRichStringCellValue().numFormattingRuns();

    for(int i = 0; i < formattingRuns; i++)
    {
        int startIdx = richText.getIndexOfFormattingRun(i);
        int length = richText.getLengthOfFormattingRun(i);
        System.out.println("Text: " + richText.getString().substring(startIdx, startIdx + length));
        if(i == 0)
        {
            short fontIndex = cell.getCellStyle().getFontIndex();
            Font f = wb.getFontAt(fontIndex);
            System.out.println("Bold: " + (f.getBoldweight() == Font.BOLDWEIGHT_BOLD));
            System.out.println("Italics: " + f.getItalic() + "\n");
        }
        else
        {
            Font f = richText.getFontOfFormattingRun(i);
            System.out.println("Bold: " + (f.getBoldweight() == Font.BOLDWEIGHT_BOLD));
            System.out.println("Italics: " + f.getItalic() + "\n");
        }
    }
}

基本上,你从一个单元格中获取一个RichTextString对象(但要确保它首先是一个String单元格),然后迭代格式化运行并检查每个单元格的字体。看起来第一次使用Cell的CellStyle /字体,所以你必须以那种方式查找(如果你试图从RichTextString中获取它,你会得到一个NPE)。

获得字体后,您可以获得其所有属性。这是POI的Font的Javadoc。

如果您使用较旧的非XLSX文件,请在类名中将XSSF替换为HSSF,并且您必须稍微更改RichTextString代码以使用字体索引查找字体。以下是XSSFRichTextStringHSSFRichTextString的JavaDoc。

使用工作表1中的以下内容运行此操作,A1:“示例文本来自一个 excel单元格 “给出了以下结果:

Text: A 
Bold: false
Italics: false

Text: sample
Bold: true
Italics: false

Text:  text 
Bold: false
Italics: false

Text: from
Bold: false
Italics: true

Text:  one 
Bold: false
Italics: false

Text: excel cell
Bold: true
Italics: true

答案 1 :(得分:3)

以下是我在VBA中的表现。也许你可以翻译:

Sub ListBoldStrings()
Dim cell As Excel.Range
Dim i As Long
Dim BoldChars As String
Dim BoldStrings() As String
'replace "|" with a char that will not appear in evaluated strings
Const SEPARATOR_CHAR As String = "|"

Set cell = ActiveCell
With cell
    For i = 1 To .Characters.Count
        If .Characters(i, 1).Font.Bold Then
            BoldChars = BoldChars + .Characters(i, 1).Text
        Else
            BoldChars = BoldChars + SEPARATOR_CHAR
        End If
        If Right$(BoldChars, 2) = WorksheetFunction.Rept(SEPARATOR_CHAR, 2) Then
            BoldChars = Left$(BoldChars, Len(BoldChars) - 1)
        End If
    Next i
End With
BoldStrings = Split(BoldChars, SEPARATOR_CHAR)
For i = LBound(BoldStrings) To UBound(BoldStrings)
    Debug.Print BoldStrings(i)
Next i
End Sub