首页 文章

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

提问于
浏览
1

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

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

“A sample 来自一个 excel cell 的文字”

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

2 回答

  • 11

    我不知道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 cellsample 文本”给出以下结果:

    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
    
  • 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
    

相关问题