java 获取Excel单元格的样式

业务开发过程中遇到的问题,稍微记录一下:

需求:进行Excel文本导入时,需要获取单元格内文本的样式并将其转换为Html标签格式文本。

excel图片

解决:

  • 如果类似表格A-1统一格式的话,可以通过POI的workbook.getFontAt(cell.getCellStyle().getFontIndex())方法获取统一格式的文本样式

问题升级:

类似B-1这种形式,单元格内存在多种样式,那该如何处理呢?

解决:

  • 可通过cell.getRichStringCellValue()方法获取富文本进行处理

注意的地方:富文本首个标签内的内容,是不包含样式的。其样式取自单元格的样式

import org.apache.poi.xssf.usermodel.XSSFRichTextString;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public static void main(String[] args) {
    File file = FileUtil.file("C:\\Users\\YanZhiyu\\Desktop\\测试格式.xlsx");
    // 创建工作簿对象
    Workbook workbook = null;
    try {
        workbook = new XSSFWorkbook(file);
        // 获取对应的Sheet,如果name不存在,则会创建新的Sheet
        Sheet sheet = workbook.getSheet("Sheet1");
        for (int i = 0; i <= sheet.getLastRowNum(); i++) {
            // 获取第一行的所有单元格
            Row row = sheet.getRow(i);
            // 遍历所有单元格
            for (int j = 0; j < row.getLastCellNum(); j++) {
                Cell cell = row.getCell(j);
                // 获取字体对象
                Font font = workbook.getFontAt(cell.getCellStyle().getFontIndex());
                // 获取字体加粗属性
                boolean isBold = font.getBold();
                // 获取字体是否有下划线属性
                byte underline = font.getUnderline();
                boolean isUnderline = FontUnderline.SINGLE.getByteValue() == underline;
                // 获取字体颜色属性
                short colorIndex = font.getColor();
                IndexedColors color = IndexedColors.fromInt(colorIndex);
                // 获取字体名称属性
                String fontName = font.getFontName();
                // 获取字体大小属性
                short fontSize = font.getFontHeightInPoints();
                String stringCellValue = cell.getStringCellValue();
                // 输出单元格属性
                System.out.printf("单元格[%d, %d],字体加粗:%b,字体颜色:%s,字体名称:%s,字体大小:%d,字体下划线:%s,值为:%s\n",
                                  row.getRowNum(), cell.getColumnIndex(), isBold, color, fontName, fontSize, isUnderline, stringCellValue);
                //富文本形式
                XSSFRichTextString richStringCellValue = (XSSFRichTextString) cell.getRichStringCellValue();
                String string = richStringCellValue.getCTRst().toString();
                System.out.printf("富文本内容为:%s\n", string);
            }
        }
        //workbook.close();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (InvalidFormatException e) {
        e.printStackTrace();
    }
}

打印输出日志如下:

单元格[0, 0],字体加粗:true,字体颜色:BLACK,字体名称:宋体,字体大小:16,字体下划线:false,值为:盼望着,盼望着,东风来了,春天的脚步近了。
一切都像刚睡醒的样子,欣欣然张开了眼。山朗润起来了,水涨起来了,太阳的脸红起来了。
富文本内容为:
<t xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">盼望着,盼望着,东风来了,春天的脚步近了。
一切都像刚睡醒的样子,欣欣然张开了眼。山朗润起来了,水涨起来了,太阳的脸红起来了。</t>
单元格[0, 1],字体加粗:true,字体颜色:BLACK,字体名称:金山云技术体,字体大小:14,字体下划线:true,值为:盼望着,盼望着,东风来了,春天的脚步近了。
一切都像刚睡醒的样子,欣欣然张开了眼。山朗润起来了,水涨起来了,太阳的脸红起来了。
富文本内容为:
<xml-fragment xmlns:main="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
  <main:r>
    <main:t>盼望着</main:t>
  </main:r>
  <main:r>
    <main:rPr>
      <main:b/>
      <main:i/>
      <main:sz val="16"/>
      <main:rFont val="宋体"/>
      <main:charset val="134"/>
      <main:scheme val="minor"/>
    </main:rPr>
    <main:t>,</main:t>
  </main:r>
  <main:r>
    <main:rPr>
      <main:b/>
      <main:i/>
      <main:u/>
      <main:sz val="18"/>
      <main:rFont val="汉仪青云简"/>
      <main:charset val="134"/>
    </main:rPr>
    <main:t>盼望着</main:t>
  </main:r>
  <main:r>
    <main:rPr>
      <main:sz val="16"/>
      <main:rFont val="宋体"/>
      <main:charset val="134"/>
      <main:scheme val="minor"/>
    </main:rPr>
    <main:t>,</main:t>
  </main:r>
  <main:r>
    <main:rPr>
      <main:u/>
      <main:sz val="16"/>
      <main:rFont val="宋体"/>
      <main:charset val="134"/>
      <main:scheme val="minor"/>
    </main:rPr>
    <main:t>东风来了</main:t>
  </main:r>
  <main:r>
    <main:rPr>
      <main:sz val="16"/>
      <main:rFont val="宋体"/>
      <main:charset val="134"/>
      <main:scheme val="minor"/>
    </main:rPr>
    <main:t>,春天的脚步近了。
一切都像刚睡醒的样子,欣欣然张开了眼。山朗润起来了,水涨起来了,太阳的脸红起来了。</main:t>
  </main:r>
</xml-fragment>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值