我有以下代码块:
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 ,但这涉及首先获取所有图像,然后迭代它们。 我想迭代细胞并检查图像。
I have the following block of code:
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();I am using Apache POI to read an .xlsx file. Each row can contain a cell with an image which was pasted into it by a user.
I'm hoping to grab the image and encode it to base64. How do I check if a cell contains an image while iterating through the spreadsheet?
I've already read http://poi.apache.org/spreadsheet/quick-guide.html#Images , but that deals with getting all images first, then iterating through them. I'd like to iterate through cells and check for images.
最满意答案
以下代码遍历第一张表的所有图像。 因此,您不需要遍历行/列,而是直接获取位置。 除了OneCellAnchor和TwoCellAnchor之外,还有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(); } }The following code iterates through all images of the first sheet. So you don't need to iterate through rows/cols, but get the positions straight away. Apart of OneCellAnchor and TwoCellAnchor there are also AbsoluteAnchors which can't be directly associate with a cell.
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(); } }更多推荐
发布评论