如何使用Apache POI检查单元格是否包含图像?

我有以下代码块:

File file = new File("myFile.xlsx"); // my file inputStream = new FileInputStream(file); System.out.println("reading"); XSSFWorkbook wb = new XSSFWorkbook(inputStream); XSSFSheet sh = wb.getSheetAt(0); // first sheet Iterator rowIter = sh.rowIterator(); while(rowIter.hasNext()){ // iterate over all rows System.out.println("New Row "); // notify of new row Row myRow = (Row) rowIter.next(); Iterator cellIter = myRow.cellIterator(); while(cellIter.hasNext()){ // iterate over all cells in row XSSFCell myCell = (XSSFCell) cellIter.next(); //how can I check that myCell has an image? //(I'm expecting it to be in the fourth cell each time) System.out.print(" " + myCell); // output cell content on same line } } inputStream.close(); 

我正在使用Apache POI来读取.xlsx文件。 每行可以包含一个单元格,其中有一个用户粘贴的图像。

我希望抓住图像,并将其编码为base64。 如何在遍历电子表格时检查单元格是否包含图像?

我已经阅读过http://poi.apache.org/spreadsheet/quick-guide.html#Images ,但是会先处理所有的图像,然后遍历它们。 我想遍历单元格并检查图像。

以下代码遍历第一个工作表的所有图像。 所以你不需要遍历行/列,而是立即得到位置。 除OneCellAnchorTwoCellAnchor之外,还有AbsoluteAnchors ,它们不能直接与单元关联。

 import org.apache.poi.POIXMLDocumentPart; import org.apache.poi.openxml4j.opc.*; import org.apache.poi.xssf.usermodel.*; import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.*; public class Images2Cells { public static void main(String[] args) throws Exception { OPCPackage opc = OPCPackage.open("auto.xlsx", PackageAccess.READ); XSSFWorkbook book = new XSSFWorkbook(opc); XSSFSheet sheet = book.getSheetAt(0); for (POIXMLDocumentPart pdp : sheet.getRelations()) { if (!XSSFRelation.DRAWINGS.getRelation().equals(pdp.getPackageRelationship().getRelationshipType())) continue; PackagePart drawPP = pdp.getPackagePart(); WsDrDocument draw = WsDrDocument.Factory.parse(drawPP.getInputStream()); for (CTOneCellAnchor oneAnc : draw.getWsDr().getOneCellAnchorList()) { String picId = oneAnc.getPic().getBlipFill().getBlip().getEmbed(); PackageRelationship pr = drawPP.getRelationship(picId); PackagePart imgPP = drawPP.getRelatedPart(pr); // byte imgBytes[] = IOUtils.toByteArray(imgPP.getInputStream()); System.out.println(imgPP.getPartName() +" - Col: "+oneAnc.getFrom().getCol() +" - Row: "+oneAnc.getFrom().getRow() ); } for (CTTwoCellAnchor twoAnc : draw.getWsDr().getTwoCellAnchorList()) { String picId = twoAnc.getPic().getBlipFill().getBlip().getEmbed(); PackageRelationship pr = drawPP.getRelationship(picId); PackagePart imgPP = drawPP.getRelatedPart(pr); System.out.println(imgPP.getPartName() +" - Col1: "+twoAnc.getFrom().getCol() +" - Row1: "+twoAnc.getFrom().getRow() +" - Col2: "+twoAnc.getTo().getCol() +" - Row2: "+twoAnc.getTo().getRow() ); } } opc.revert(); } }