package com.constellio.app.services.schemas.bulkImport.data.excel; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import com.constellio.app.services.schemas.bulkImport.data.ImportDataIterator; import com.constellio.app.services.schemas.bulkImport.data.ImportDataIteratorRuntimeException.ImportDataIteratorRuntimeException_InvalidDate; import com.constellio.app.services.schemas.bulkImport.data.ImportDataProvider; import com.constellio.app.services.schemas.bulkImport.data.ImportDataProviderRuntimeException; import com.constellio.app.services.schemas.bulkImport.data.ImportDataProviderRuntimeException.ImportDataProviderRuntimeException_InvalidDate; public class Excel2007ImportDataProvider implements ImportDataProvider { private File excelFile; private OPCPackage opcPackage; private XSSFWorkbook workbook; public Excel2007ImportDataProvider(File excelFile) { this.excelFile = excelFile; } @Override public int size(String schemaType) { int count = 0; ImportDataIterator iterator = newDataIterator(schemaType); try { while (iterator.hasNext()) { iterator.next(); count++; } } catch (RuntimeException e) { if (e instanceof ImportDataIteratorRuntimeException_InvalidDate) { ImportDataIteratorRuntimeException_InvalidDate exception = (ImportDataIteratorRuntimeException_InvalidDate) e; throw new ImportDataProviderRuntimeException_InvalidDate(exception.getDateFormat(), exception.getInvalidValue()); } throw new ImportDataProviderRuntimeException(e); } return count; } @Override public void initialize() { this.workbook = loadWorkbook(excelFile); } @Override public void close() { try { opcPackage.close(); } catch (IOException e) { e.printStackTrace(); } } @Override public List<String> getAvailableSchemaTypes() { List<String> sheetNames = new ArrayList<>(); Iterator<Sheet> iterator = workbook.iterator(); while (iterator.hasNext()) { sheetNames.add(iterator.next().getSheetName()); } return sheetNames; } @Override public ImportDataIterator newDataIterator(String schemaType) { if (getAvailableSchemaTypes().contains(schemaType)) return new ExcelImportDataIterator(getExcelSheet(schemaType)); throw new RuntimeException("There are no sheet with this schema type"); } public XSSFWorkbook loadWorkbook(File workbookFile) { try { opcPackage = OPCPackage.open(new FileInputStream(workbookFile)); return new XSSFWorkbook(opcPackage); } catch (InvalidFormatException | IOException e) { throw new RuntimeException(e); } } public static Excel2007ImportDataProvider fromFile(File excelFile) { Excel2007ImportDataProvider instance = new Excel2007ImportDataProvider(excelFile); instance.initialize(); return instance; } public ExcelSheet getExcelSheet(String schemaType) { return new Excel2007Sheet(workbook.getSheet(schemaType)); } }