Прочитайте Excel и получите номер строки и расширение файла для встроенных объектов - PullRequest
0 голосов
/ 20 февраля 2019

Я использую Apache POI с Java 1.8 в своем приложении.В моем приложении я пытаюсь прочитать Excel и получить встроенные объекты.

Мне нужно знать, как получить номер строки и расширения файла для каждого встроенного объекта OLE.

Workbook workbook = WorkbookFactory.create(new File(path));

XSSFWorkbook fWorkbook = (XSSFWorkbook) workbook;

List<PackagePart> embeddedDocs = fWorkbook.getAllEmbedds();

Чтобы получить embeddedDocs.getContentType, который возвращает application/vnd.openxmlformats-officedocument.oleObject.

Но есть ли в любом случае, где мы можем получить расширения файлов (т.е. pdf, ppt, mp3), которые возвращаются MimeType.И какой способ получить номер строки встроенных объектов.Любые идеи / логика кодирования для решения этой проблемы будут очень полезны.

1 Ответ

0 голосов
/ 23 февраля 2019

Следующее работает - я думаю - для обычных подозреваемых.Я протестировал его с .xls / x на магистрали POI, которая будет POI 4.1.0, но должна работать и с POI 4.0.1.

Известные проблемы:

  • объект не был внедрен на основе файла, тогда вы не получите имя файла.Это, вероятно, также относится к большинству файлов .xls.

  • .xlsx содержит только vmlDrawing * .xml, тогда DrawingPatriach не может быть извлечен, и никакие фигуры не могут быть определены

  • фигура в .xlsx не была привязана через twoCellAnchor, тогда вы не получите ClientAnchor

Код:

import java.io.FileInputStream;
import java.io.IOException;

import org.apache.poi.hpsf.ClassIDPredefined;
import org.apache.poi.poifs.filesystem.DirectoryEntry;
import org.apache.poi.ss.usermodel.ChildAnchor;
import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.usermodel.ObjectData;
import org.apache.poi.ss.usermodel.Shape;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.junit.Test;

public class TestEmbed {
    @Test
    public void extract() throws IOException {
//        String xlsName = "test-data/spreadsheet/WithEmbeddedObjects.xls";
        String xlsName = "embed.xlsx";
        try (FileInputStream fis = new FileInputStream(xlsName);
             Workbook xls = WorkbookFactory.create(fis)) {
            for (Sheet s : xls) {
                Drawing<?> dp = s.getDrawingPatriarch();
                if (dp != null) {
                    for (Shape sh : dp) {
                        if (sh instanceof ObjectData) {
                            ObjectData od = (ObjectData)sh;
                            String filename = od.getFileName();
                            String ext = null;

                            if (filename != null && !filename.isEmpty()) {
                                int i = filename.lastIndexOf('.');
                                ext = (i > 0) ? filename.substring(i) : ".bin";
                            } else {
                                String ct = null;

                                try {
                                    DirectoryEntry de = od.getDirectory();

                                    if (de != null) {
                                        ClassIDPredefined ctcls = ClassIDPredefined.lookup(de.getStorageClsid());
                                        if (ctcls != null) {
                                            ext = ctcls.getFileExtension();
                                        }
                                    }
                                } catch (Exception ignore) {
                                }
                            }

                            if (ext == null) {
                                ext = ".bin";
                            }

                            ChildAnchor chAnc = sh.getAnchor();
                            if (chAnc instanceof ClientAnchor) {
                                ClientAnchor anc = (ClientAnchor) chAnc;
                                System.out.println("Rows: " + anc.getRow1() + " to " + anc.getRow2() + " - filename: "+filename+" - ext: "+ext);
                            }
                        }
                    }
                }
            }
        }
    }
}
...