读取Excel中插入的数学公式
前言
- 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();
}
}
}