Как получить изображения с именами из файла xls с помощью Apache POI

Использование workbook.getAllPictures() Я могу получить массив данных изображения, но, к сожалению, только данные и эти объекты не имеют методов доступа к имени изображения или любой другой связанной информации.

Существует класс HSSFPicture который будет содержать все детали изображения, но как получить, например, массив этих объектов из xls?

Обновить:

Нашел вопрос SO Как я могу найти ячейку, которая содержит изображение в apache poi, которое имеет метод для прокрутки всех изображений на листе. Это работает.

Теперь, когда я смог попробовать класс HSSFPicture я узнал, что метод getFileName() возвращает имя файла без расширения. Я могу использовать getPictureData().suggestFileExtension() чтобы получить предлагаемое расширение файла, но мне действительно нужно будет получить расширение, которое было у него, когда оно было добавлено в файл xls. Будет ли способ получить его?

Обновление 2:

Изображения добавляются в xls с макросом. Это часть макроса, которая добавляет изображения в лист. fname – полный путь, а imageName – имя файла, оба включают расширение.

 Set img = Sheets("Receipt images").Pictures.Insert(fname) img.Left = 10 img.top = top + 10 img.Name = imageName Set img = Nothing 

Подпрограмма, чтобы проверить, существует ли изображение в файле Excel.

 For Each img In Sheets("Receipt images").Shapes If img.Name = imageName Then Set foundImage = img Exit For End If Next 

Это признает, что «image.jpg» отличается от «image.gif», поэтому img.Name включает расширение.

Имена форм не входят в объекты POI по умолчанию. Поэтому, если мы в них нуждаемся, мы должны иметь дело с базовыми объектами. То есть для форм в HSSF главным образом EscherAggregate ( http://poi.apache.org/apidocs/org/apache/poi/hssf/record/EscherAggregate.html ), которые мы можем получить из листа. Из родительского класса AbstractEscherHolderRecord мы можем получить все EscherOptRecords, который содержит параметры фигур. В этих вариантах также можно найти groupshape.shapenames.

Мой пример – не полное решение. Показывается только, какие объекты могут быть использованы для достижения этого.

Пример:

 import org.apache.poi.hssf.usermodel.*; import org.apache.poi.ss.usermodel.*; import java.io.FileOutputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.FileInputStream; import java.io.InputStream; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.hssf.record.*; import org.apache.poi.ddf.*; import java.util.List; import java.util.ArrayList; class ShapeNameTestHSSF { public static void main(String[] args) { try { InputStream inp = new FileInputStream("workbook1.xls"); Workbook wb = WorkbookFactory.create(inp); Sheet sheet = wb.getSheetAt(0); EscherAggregate escherAggregate = ((HSSFSheet)sheet).getDrawingEscherAggregate(); EscherContainerRecord escherContainer = escherAggregate.getEscherContainer().getChildContainers().get(0); //throws java.lang.NullPointerException if no Container present List<EscherRecord> escherOptRecords = new ArrayList<EscherRecord>(); escherContainer.getRecordsById(EscherOptRecord.RECORD_ID, escherOptRecords); for (EscherRecord escherOptRecord : escherOptRecords) { for (EscherProperty escherProperty : ((EscherOptRecord)escherOptRecord).getEscherProperties()) { System.out.println(escherProperty.getName()); if (escherProperty.isComplex()) { System.out.println(new String(((EscherComplexProperty)escherProperty).getComplexData(), "UTF-16LE")); } else { if (escherProperty.isBlipId()) System.out.print("BlipId = ImageId = "); System.out.println(((EscherSimpleProperty)escherProperty).getPropertyValue()); } System.out.println("============================="); } System.out.println(":::::::::::::::::::::::::::::"); } FileOutputStream fileOut = new FileOutputStream("workbook1.xls"); wb.write(fileOut); fileOut.flush(); fileOut.close(); } catch (InvalidFormatException ifex) { } catch (FileNotFoundException fnfex) { } catch (IOException ioex) { } } } 

Опять же: это не готовое к использованию решение. Невозможно предоставить готовое к использованию решение из-за сложности EscherRecords. Возможно, чтобы получить правильные EscherRecords для фигур изображения и связанных с ними EscherOptRecords, у вас есть рекурсивный цикл для всех EscherRecords в EscherAggregate, проверяющий, являются ли они ContainerRecords, и если это так происходит через его дочерние элементы и так далее.

Начало здесь:

http://poi.apache.org/spreadsheet/quick-guide.html#Images

этот учебник поможет вам извлечь информацию об изображении из таблицы xls с помощью Apache POI

  • получать столбцы из файлов Excel с помощью Apache POI?
  • NoClassDefFoundError: org / apache / poi / ss / formula / udf / ошибка UDFFinder в java
  • Java JDBC-ODBC не может загрузить драйвер для Excel
  • Какие причины и каковы различия между NoClassDefFoundError и ClassNotFoundException?
  • получить файл excel в качестве ответа в javascript из службы Rest
  • Как получить доступ к содержимому XSSF, когда листы не распознаются
  • взяв excel-вход и используя его в качестве данных в jave
  • Создать файл Excel в Java
  • Excel в XML-код в java?
  • Как использовать Java для установки разных цветов в одной ячейке в Excel
  • Формулы POI Apache не оцениваются
  • Interesting Posts

    Изменение имени файла после открытия загруженного файла excel в .Net C # MVC

    Макро Найти последнюю строку и добавить данные

    Несоответствие типов при использовании VBA CountIF ()

    цикл для вставки только в строки с данными

    VBA удаляет "из содержимого ячейки в диапазоне

    Невозможно прочитать и не может вводить данные в онлайн-форме в программах селена и Java, а затем получать ниже ошибки

    Функция IF работает над выбором ячеек

    Заменить строки с идентификаторами в Excel

    Вычитание в пределах диапазона для цикла

    Как установить цвет фона моей панели управления, включая также сводные таблицы?

    ArrayFormula Более 255 символов. Не работает

    Печать отчета Excel в pdf быстрее

    Извлечение необработанных данных из модели PowerPivot с использованием Python

    Я хочу обернуть формулу excel, которая возвращает массив значений, чтобы заменить значения 0 на NA ()

    Excel и «нечитаемый контент» при создании электронной таблицы Open XML с помощью MemoryStream

    Давайте будем гением компьютера.