下载最新的poi包poi-bin-3.12-20150511.zip,里面有读取xlsx图片的新方法!
上个星期开始鼓捣导入Excel,下载了最新的poi包,结果Excel文件里有图片。处理图片还真是个难事,网上搜索一开始发现了HSSFSheet类处理图片的例子,但不是xlsx文件能用的,其中对一个方HSSFSheet.getDrawingEscherAggregate()有印象。
转帖处:贴子1:http://www.cnblogs.com/shwen99/archive/2010/09/13/1824896.html
后来又找到了兼容xls和xlsx读图片位置的贴子,这个贴子就可以解决问题了。
转帖处:贴子2:http://blog.csdn.net/delongcpp/article/details/8833995。
但是其中用到一个方法XSSFSheet.getRelations(),得到一个集合遍历查找,比较好奇这个集合是什么。在我的项目中试了一下发现只有一个元素,有个疑问是不是取出工作表的图片只要拿到这个集合的第一个元素就行呢(就不用写for循环遍历的代码,懒~)?上网找了官方api文档,找着找着,看到官方文档中写着XSSFSheet里有一个方法getDrawingPatriarch(),有点像贴子1那个方法,返回的结果是贴子2需要的对象。之前也所有方法都试过,印象中没有这个方法,在项目里头试了一下果然没有。于是猜是不是有新版本了,有点怀疑因为我上周才下载了最新版3.11,但还是怀着期待惊喜的心情上官网查。果然,最新版是3.12,5月11号更新!也就是昨天(这个贴子是12号写的没发表出去)!哈哈,真是刚想瞌睡的时候有人来送枕头。现在可以更方便的处理xlsx图片了!
下面是我写的一个方法:
/** * 获取单元格中的图片文件名,如果单元格内容不是图片,则返回null。 * * @param sheet * 工作表 * @param cell * 单元格 * @return 图片文件名 */ public static String getPictureNameOfCell(Sheet sheet, Cell cell) { int cellRowIndex = cell.getRowIndex(); int cellColIndex = cell.getColumnIndex(); if (sheet instanceof XSSFSheet) { XSSFSheet xSheet = (XSSFSheet) db.getSheet(); XSSFDrawing drawing = xSheet.getDrawingPatriarch(); List<XSSFShape> xShapeList = drawing.getShapes(); for (int i = 0; i < xShapeList.size(); i++) { XSSFPicture xPicture = (XSSFPicture) xShapeList.get(i); XSSFClientAnchor xAnchor = xPicture.getPreferredSize(); if (xAnchor.getRow1() == cellRowIndex && xAnchor.getCol1() == cellColIndex) { return xPicture.getPictureData().getPackagePart().getPartName().getName(); } } } return null; }