读取Excel中插入的数学公式

这篇博客介绍了如何使用Apache POI库读取.xls格式Excel文件中的数学公式,通过HSSFPatriarch获取文本框内容。对于.xlsx格式,由于公式处理方式不同,目前代码只能读取文本框,未能成功读取公式,作者希望得到帮助。同时,文章还提及了WPS中公式以图片(wmf格式)的形式存在,并提供了相应的读取方法。
摘要由CSDN通过智能技术生成

前言

  • xls是03版Office Microsoft Office Excel 工作表的格式,用03版Office,新建Excel默认保存的Excel文件格式的后缀是.xls;
  • xlsx是07版Office Microsoft Office Excel 工作表的格式,用07版Office,新建Excel默认保存的的Excel文件格式后缀是.xlsx。
    所以读取Excel公式需要准备两套方案,本文是以office软件进行测试的,wps中插入的公式是以图片形式插入的,后面会有补充。

一、读取office文件中的数学公式

1.读取xls格式文件中的数学公式

读取xls中的公式比较简单,因为xls中的数学公式是文本框形式的,直接搜POI读取Excel文本框会出现一堆。如下所示:

public static void test() throws IOException {
    InputStream input = new FileInputStream("D:\\Users\\Dell\\Desktop\\工作簿1.xls");
    POIFSFileSystem fs = new POIFSFileSystem(input);
    HSSFWorkbook wb = new HSSFWorkbook(fs);
    HSSFSheet sheet = wb.getSheetAt(0);
    HSSFPatriarch pat = sheet.getDrawingPatriarch();
    List<HSSFShape> children = pat.getChildren();
    for (HSSFShape child : children) {
        if (child instanceof HSSFSimpleShape) {
            HSSFSimpleShape textbox = (HSSFSimpleShape) child;
            HSSFRichTextString richString = textbox.getString();
            String str = richString.getString();
            System.out.println("String: " + str);
        }
    }
}
2.读取xlsx格式文件中的公式(未完成,有大神看见的话,希望能解惑)

按照上面的思路写代码,结果只能读取文本框,无法读取公式。代码如下:

public static void test() throws IOException {
    InputStream input = new FileInputStream("D:\\Users\\Dell\\Desktop\\工作簿1.xlsx");
    XSSFWorkbook wb = new XSSFWorkbook(input);
    XSSFSheet sheet = wb.getSheetAt(0);
    XSSFDrawing drawing= sheet.getDrawingPatriarch();
    List<XSSFShape> shapes = drawing.getShapes();
    for (XSSFShape shape:shapes){
        XSSFSimpleShape simpleShape=(XSSFSimpleShape)shape;
        String text = simpleShape.getText();
        System.out.println("text = " + text);
    }
}

dubug模式下发现shapes数量不等于文件中的插入的公式数 + 插入的文本框数,所以插入的公式不可能通过getDrawingPatriarch()方法得到。

二、读取wps文件中的数学公式

wps自带公式编辑器,插入的公式是图片格式的。需要注意的是图片的格式是wmf

public static void test2() throws IOException {
    InputStream input = new FileInputStream("D:\\Users\\Dell\\Desktop\\工作簿1.xlsx");
    XSSFWorkbook wb = new XSSFWorkbook(input);
    XSSFSheet sheet = wb.getSheetAt(0);
    List<POIXMLDocumentPart> relations = sheet.getRelations();
    int i=0;
    for (POIXMLDocumentPart documentPart : relations){
        if (documentPart instanceof XSSFPictureData){
            XSSFPictureData document = (XSSFPictureData) documentPart;
            byte[] data = document.getData();
            OutputStream outputStream=new FileOutputStream("D:\\Users\\Dell\\Desktop\\工作簿"+i+".wmf");
            i++;
            outputStream.write(data);
            outputStream.flush();
            outputStream.close();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值