Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Excel Apache POI выгрузка картинок / 7 сообщений из 7, страница 1 из 1
14.05.2015, 20:46
    #38959210
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel Apache POI выгрузка картинок
есть две ссылки
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
15.05.2015, 15:17
    #38959935
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel Apache POI выгрузка картинок
UP
...
Рейтинг: 0 / 0
15.05.2015, 15:33
    #38959962
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel Apache POI выгрузка картинок
вадякоординаты столбца/колонки
в PictureData нет? API его надо смотреть.
...
Рейтинг: 0 / 0
15.05.2015, 15:45
    #38959976
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel Apache POI выгрузка картинок
Petro123вадякоординаты столбца/колонки
в PictureData нет? API его надо смотреть.
дык вот не могу найти....
вроде как должно быть
...
Рейтинг: 0 / 0
15.05.2015, 21:47
    #38960348
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel Apache POI выгрузка картинок
нашёл на 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
16.05.2015, 18:33
    #38960634
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel Apache POI выгрузка картинок
патаюсь преобразовать 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
17.05.2015, 07:07
    #38960732
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel Apache POI выгрузка картинок
вопрос более правильнее
как пробразовать 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
Форумы / Java [игнор отключен] [закрыт для гостей] / Excel Apache POI выгрузка картинок / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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