powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Excel Apache POI выгрузка картинок
7 сообщений из 7, страница 1 из 1
Excel Apache POI выгрузка картинок
    #38959210
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть две ссылки
http://poi.apache.org/spreadsheet/quick-guide.html#Images
http://apache-poi.1045710.n5.nabble.com/A-newbie-question-how-to-get-image-position-td2294815.html

по первой есть не большой куск кода
Reading images from a workbook:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
   List lst = workbook.getAllPictures();
    for (Iterator it = lst.iterator(); it.hasNext(); ) {
        PictureData pict = (PictureData)it.next();
        String ext = pict.suggestFileExtension();
        byte[] data = pict.getData();
        if (ext.equals("jpeg")){
          FileOutputStream out = new FileOutputStream("pict.jpg");
          out.write(data);
          out.close();
        }
    }


он работает
по второй несколько больший
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
package test;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.io.FilenameFilter;
import java.util.Iterator;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.hssf.record.EscherAggregate;
import org.apache.poi.ddf.EscherRecord;
import org.apache.poi.ddf.EscherClientAnchorRecord;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;

public class Main {

    protected final ArrayList<File> excelFiles = null;

    public void getImageMatrices(String folderName)
            throws IOException, FileNotFoundException, InvalidFormatException {
        File fileFolder = new File(folderName);
        File[] excelWorkbooks = fileFolder.listFiles(new ExcelFilenameFilter());
        for (File excelWorkbook : excelWorkbooks) {
            Workbook workbook = WorkbookFactory.create(new FileInputStream(excelWorkbook));
            if (workbook instanceof HSSFWorkbook) {
                this.processImages((HSSFWorkbook) workbook);
            } else {
                this.processImages((XSSFWorkbook) workbook);
            }
        }
    }

    private void processImages(HSSFWorkbook workbook) {
        EscherAggregate drawingAggregate;
        HSSFSheet sheet;
        List<EscherRecord> recordList;
        Iterator<EscherRecord> recordIter;
        int numSheets = workbook.getNumberOfSheets();
        for (int i = 0; i < numSheets; i++) {
            System.out.println("Processing sheet number: " + (i + 1));
            sheet = workbook.getSheetAt(i);
            drawingAggregate = sheet.getDrawingEscherAggregate();
            if (drawingAggregate != null) {
                recordList = drawingAggregate.getEscherRecords();
                recordIter = recordList.iterator();
                while (recordIter.hasNext()) {
                    this.iterateRecords(recordIter.next(), 1);
                }
            }
        }
    }

    private void iterateRecords(EscherRecord escherRecord, int level) {
        List<EscherRecord> recordList;
        Iterator<EscherRecord> recordIter;
        EscherRecord childRecord;
        recordList = escherRecord.getChildRecords();
        recordIter = recordList.iterator();
        while (recordIter.hasNext()) {
            childRecord = recordIter.next();
            if (childRecord instanceof EscherClientAnchorRecord) {
                this.printAnchorDetails((EscherClientAnchorRecord) childRecord);
            }
            if (childRecord.getChildRecords().size() > 0) {
                this.iterateRecords(childRecord, ++level);
            }
        }
    }

    private void printAnchorDetails(EscherClientAnchorRecord anchorRecord) {
        System.out.print("The top left hand corner of the image can be found "
                + "in the cell at column number "
                + anchorRecord.getCol1()
                + " and row number "
                + anchorRecord.getRow1()
                + " at the offset position x "
                + anchorRecord.getDx1()
                + " and y "
                + anchorRecord.getDy1()
                + " co-ordinates.");
        System.out.println("The bottom right hand corner of the image can be found "
                + "in the cell at column number "
                + anchorRecord.getCol2()
                + " and row number "
                + anchorRecord.getRow2()
                + " at the offset position x "
                + anchorRecord.getDx2()
                + " and y "
                + anchorRecord.getDy2()
                + " co-ordinates.");
    }

    private void processImages(XSSFWorkbook workbook) {
        System.out.println("No support yet for OOXML based workbooks. Investigating.");
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try {
            new Main().getImageMatrices("C:\\Temp\\Новая папка (2)");
        } catch (IOException | InvalidFormatException ex) {
            System.out.println("Caught an: " + ex.getClass().getName());
            System.out.println("Message: " + ex.getMessage());
            System.out.println("Stacktrace follows:.....");
            ex.printStackTrace(System.out);
        }
    }

    public class ExcelFilenameFilter implements FilenameFilter {

        @Override
        public boolean accept(File file, String fileName) {
            boolean includeFile = false;
            if (fileName.endsWith(".xls") || fileName.endsWith(".xlsx")) {
                includeFile = true;
            }
            return (includeFile);
        }
    }
}


он тоже рабочий.
задача : скрестить т.е. надо сохранить картинки на диске, а инфу из строки нужно занести в базу(файлу присваивается случайное имя , в базу заносится имя и инфа из ячеек в этой строке)
проблема: из первого кода не могу получить координаты столбца/колонки , из второго записать файл....
...
Рейтинг: 0 / 0
Excel Apache POI выгрузка картинок
    #38959935
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UP
...
Рейтинг: 0 / 0
Excel Apache POI выгрузка картинок
    #38959962
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадякоординаты столбца/колонки
в PictureData нет? API его надо смотреть.
...
Рейтинг: 0 / 0
Excel Apache POI выгрузка картинок
    #38959976
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123вадякоординаты столбца/колонки
в PictureData нет? API его надо смотреть.
дык вот не могу найти....
вроде как должно быть
...
Рейтинг: 0 / 0
Excel Apache POI выгрузка картинок
    #38960348
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нашёл на http://stackoverflow.com/
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
            Workbook workbook = WorkbookFactory.create(new FileInputStream(excelWorkbook));

            HSSFSheet sheet = (HSSFSheet) workbook.getSheetAt(0);
            HSSFPatriarch patriarch = sheet.getDrawingPatriarch();
            if (patriarch != null) {
                // Loop through the objects
                for (HSSFShape shape : patriarch.getChildren()) {
                    if (shape instanceof HSSFPicture) {
                        HSSFPicture picture = (HSSFPicture) shape;
                        if (picture.getShapeType() == HSSFSimpleShape.OBJECT_TYPE_PICTURE) {
                            if (picture.getImageDimension() != null) {
                                // how to get cell, which contains this picture
                                if (picture.getImageDimension() != null) {
                                    Row row = sheet.getRow(picture.getPreferredSize().getRow1());
                                    if (row != null) {
                                        Cell cell = row.getCell(picture.getPreferredSize().getCol1());

                                        HSSFPictureData pictureData = picture.getPictureData();
                                        byte[] data = pictureData.getData();
                                        String PATH = "C:\\Temp\\Новая папка (2)\\";

                                        File file = new File(PATH + picture.getFileName() + "." + pictureData.suggestFileExtension());
                                        try (FileOutputStream fop = new FileOutputStream(file)) {

                                            if (!file.exists()) {
                                                file.createNewFile();
                                            }

                                            fop.write(data);
                                            fop.flush();
                                            fop.close();

                                        } catch (IOException e) {
                                        }

                                    }
                                }
                            }
                        }
                    }
                }
            }

такой код


вроде позволяет сделать необходимое.
но java8 (посредством netbeans) предлагает такое
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
Workbook workbook = WorkbookFactory.create(new FileInputStream(excelWorkbook));

            HSSFSheet sheet = (HSSFSheet) workbook.getSheetAt(0);
            HSSFPatriarch patriarch = sheet.getDrawingPatriarch();
            if (patriarch != null) {
                // Loop through the objects
                patriarch.getChildren().stream().filter((shape) -> (shape instanceof HSSFPicture)).map((shape) -> (HSSFPicture) shape).filter((picture) -> (picture.getShapeType() == HSSFSimpleShape.OBJECT_TYPE_PICTURE)).filter((picture) -> (picture.getImageDimension() != null)).filter((picture) -> (picture.getImageDimension() != null)).forEach((picture) -> {
                    Row row = sheet.getRow(picture.getPreferredSize().getRow1());
                    if (row != null) {
                        Cell cell = row.getCell(picture.getPreferredSize().getCol1());
                        
                        HSSFPictureData pictureData = picture.getPictureData();
                        byte[] data = pictureData.getData();
                        String PATH = "C:\\Temp\\Новая папка (2)\\";
                        
                        File file = new File(PATH + picture.getFileName() + "." + pictureData.suggestFileExtension());
                        try (FileOutputStream fop = new FileOutputStream(file)) {
                            
                            if (!file.exists()) {
                                file.createNewFile();
                            }
                            
                            fop.write(data);
                            fop.flush();
                            fop.close();
                            
                        } catch (IOException e) {
                        }
                    }
                }); // how to get cell, which contains this picture
            }


вроде как запись короче, но наглядность ....
...
Рейтинг: 0 / 0
Excel Apache POI выгрузка картинок
    #38960634
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
патаюсь преобразовать jpg в webp
использую https://bitbucket.org/luciad/webp-imageio
но есть проблема
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
    HSSFPictureData pictureData = picture.getPictureData();
                                    byte[] data = pictureData.getData();   // data  правильная картинка jpeg

                                    InputStream in = new ByteArrayInputStream(data);
                                    BufferedImage image = ImageIO.read(in);    

           
// image нужного размера но состоит из одних -1


                                    ImageWriter imgWrier = ImageIO.getImageWritersByFormatName("webp").next();
                                    ImageWriteParam imgWriteParams = new WebPWriteParam(null);
//                                    imgWriteParams.setCompressionType("Lossy");
//                                    // 0~1
//                                    imgWriteParams.setCompressionQuality(0.75f);

                                    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

                                    ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(byteArrayOutputStream);
                                    imgWrier.setOutput(imageOutputStream);
                                    imgWrier.write(null, new IIOImage(image, null, null), imgWriteParams);
                                    int length = (int) imageOutputStream.length();
                                    byte[] resultDate = new byte[length];
                                    imageOutputStream.read(resultDate, 0, length);

                                    String file = "C:\\Temp\\Новая папка (2)\\" + row.getRowNum() + "_" + cell.getColumnIndex() + "_" + picture.getPictureIndex() + "_.webp";
                                    try (FileOutputStream out = new FileOutputStream(file)) {
                                        out.write(resultDate);                                           
                                    }




почему не преобразует byte в image ?
...
Рейтинг: 0 / 0
Excel Apache POI выгрузка картинок
    #38960732
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вопрос более правильнее
как пробразовать byte в BufferedImage?
делаю так
Код: java
1.
2.
3.
4.
5.
6.
byte[] data = pictureData.getData();
 try (FileOutputStream out = new FileOutputStream(file)) {
 out.write(data);
}
 File nfile = new File(file);
 BufferedImage image = ImageIO.read(nfile);


заи=писанный файл ситемой понимается и открывается как jpeg
но image пустой....
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Excel Apache POI выгрузка картинок
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]