Изображения не являются ячейками в Excel
.Они находятся в отдельном слое рисования ( XSSFDrawing в случае XSSF
) над листом и привязываются к ячейкам.
Таким образом, если необходимо получить изображения в соответствии с положением, к которому они привязаны, то нам нужно
- получить слой рисования
- для всех фигур вэтот слой, и если форма представляет собой изображение, то
- получит изображение
- получит позицию привязки этого изображения
Следующий пример делает это и создаетMap
, который отображает XSSFPicture
на свои позиции.Я получил XSSFPicture , потому что они предоставляют гораздо больше информации, чем один XSSFPictureData
.И XSSFPictureData
можно легко получить из XSSFPicture
.
import java.io.FileInputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
import java.util.Map;
import java.util.HashMap;
public class ExcelGetPicturesWithPosition {
static Map<String, XSSFPicture> getPicturesWithPosition(XSSFSheet sheet) {
Map<String, XSSFPicture> pictures = new HashMap<String, XSSFPicture>();
XSSFDrawing drawing = sheet.getDrawingPatriarch();
for (XSSFShape shape : drawing.getShapes()) {
if (shape instanceof XSSFPicture) {
XSSFPicture picture = (XSSFPicture)shape;
XSSFClientAnchor anchor = picture.getClientAnchor();
String cellAddr = "R" + anchor.getRow1() + "C" + anchor.getCol1();
pictures.put(cellAddr, picture);
}
}
return pictures;
}
public static void main(String[] args) throws Exception {
XSSFWorkbook workbook = (XSSFWorkbook)WorkbookFactory.create(new FileInputStream("ExcelWithPictures.xlsx"));
XSSFSheet sheet = workbook.getSheetAt(0);
Map<String, XSSFPicture> pictures = getPicturesWithPosition(sheet);
System.out.println(pictures);
workbook.close();
}
}
Получив эту Карту, вы легко сможете получить изображения во время итерации листа.Например, если мы находимся на int row = 2; int column = 1;
:
XSSFPicture picture = pictures.get("R"+row+"C"+column);