【问题标题】:Read excel cells and determine formatted words in cell读取excel单元格并确定单元格中的格式化单词
【发布时间】:2014-01-10 23:59:38
【问题描述】:

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

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

“来自一个 excel 单元格示例文本”

我想知道字符串“excel cell”是粗体,字符串“sample”是斜体。 这在 JExcel 中是否可行,如果不是,我将如何在 Java 中做到这一点?有人可以推荐一个API吗? 也许更好的方法是解析 xml 文件。

【问题讨论】:

  • Excel 工作簿是什么格式的? 97-2003,还是 2007?
  • 可以是2003或者2007,格式可以是xls或者xlsx。
  • 我曾尝试使用 JExcel 做类似的事情,我可以向您保证这是不可能的。我很快就会使用 POI 重写我的代码,所以我会选择 Spencer 的答案。

标签: java excel jxl jexcelapi


【解决方案1】:

我不了解 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 对象(但首先要确保它是一个字符串单元格),然后遍历格式化运行并检查每个单元格的字体。看起来第一次运行使用了 Cell 的 CellStyle/font,所以你必须以这种方式查找它(如果你试图从 RichTextString 中获取它,你会得到一个 NPE)。

一旦你有了字体,你就可以得到它的所有属性。这是 POI Font 的 Javadoc。

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

在工作表 1,A1 中使用以下内容运行:“A sample text from one excel cell " 给出以下结果:

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

【讨论】:

  • 我明天试试。
  • @GaborCsikós 怎么样?
  • 它确实有效!以及如何处理文本中的超链接?
【解决方案2】:

这就是我在 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

【讨论】:

  • 好的。这对我帮助不大,因为我需要 Java API 或 Java 解决方案,但谢谢
猜你喜欢
  • 1970-01-01
  • 2015-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多