/* * Copyright (C) 2014 Alec Dhuse * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package co.foldingmap.data; import co.foldingmap.Logger; import java.io.File; import java.io.FileInputStream; import java.util.ArrayList; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; /** * * @author Alec */ public class ExcelDataConnector { protected int numberOfRows, numberOfCollums; protected Sheet workingSheet; protected TabularData dataFile; protected Workbook workbook; /** * Opens a new ExcelDataConnector using a given file. * * @param workBookFile The file containing the workbook. */ public ExcelDataConnector(File workBookFile) { workbook = this.openWorkBook(workBookFile); workingSheet = workbook.getSheetAt(workbook.getActiveSheetIndex()); dataFile = parseWorkbook(); workbook.setMissingCellPolicy(Row.CREATE_NULL_AS_BLANK); } /** * Returns a cell value as a DataCell object. * * @param cell * @return */ public DataCell getCellText(Cell cell) { DataCell cellText; switch(cell.getCellType()) { case Cell.CELL_TYPE_STRING: cellText = new DataCell(cell.getRichStringCellValue().getString()); break; case Cell.CELL_TYPE_NUMERIC: if(DateUtil.isCellDateFormatted(cell)) { cellText = new DataCell(cell.getDateCellValue().toString()); } else { cellText = new DataCell(Double.toString(cell.getNumericCellValue())); } break; case Cell.CELL_TYPE_BOOLEAN: cellText = new DataCell(Boolean.toString(cell.getBooleanCellValue())); break; case Cell.CELL_TYPE_FORMULA: cellText = new DataCell(cell.getCellFormula()); break; default: cellText = new DataCell(""); } return cellText; } /** * Returns the file used by the ExcelDataConnector. * * @return */ public TabularData getDataFile() { dataFile = parseWorkbook(); return dataFile; } /** * Opens the Excel Workbook to be used by this class. * * @param workBookFile * @return */ private Workbook openWorkBook(File workBookFile) { FileInputStream openedStream; Workbook openedWorkbook = new HSSFWorkbook(); try { openedStream = new FileInputStream(workBookFile); if (workBookFile.getName().endsWith(".xls")) { //old file type openedWorkbook = new HSSFWorkbook(openedStream); } else if (workBookFile.getName().endsWith(".xlsx")) { //new file type openedWorkbook = new XSSFWorkbook(openedStream); } else { //unknown file type } } catch (Exception e) { Logger.log(Logger.ERR, "Error ExcelDataConnector.openWorkBook(File) - " + e); } return openedWorkbook; } /** * Parses the cells from the workbook into a TabulaData class. * * @param workingSheet * @return */ private TabularData parseWorkbook() { ArrayList<ArrayList<DataCell>> rows; ArrayList<DataCell> cells; int columnIndex, currentCellColumnIndex, lastCellcolumnIndex; int numberOfCells, previousRowLength, rowIndex; TabularData dataFile; dataFile = new TabularData(); previousRowLength = 0; rows = new ArrayList<ArrayList<DataCell>>(); rowIndex = -1; try { for (Row row : workingSheet) { cells = new ArrayList<DataCell>(); columnIndex = row.getFirstCellNum(); lastCellcolumnIndex = -1; numberOfCells = row.getPhysicalNumberOfCells(); rowIndex++; //add blank cells for (int i = 0; i < columnIndex; i++) cells.add(new DataCell("")); for (Cell cell : row) { currentCellColumnIndex = cell.getColumnIndex(); if ((lastCellcolumnIndex + 1) == currentCellColumnIndex) { cells.add(getCellText(cell)); lastCellcolumnIndex = currentCellColumnIndex; } else { for (int i = (lastCellcolumnIndex + 1); i < currentCellColumnIndex; i++) { cells.add(new DataCell("")); } cells.add(getCellText(cell)); lastCellcolumnIndex = currentCellColumnIndex; } } //if this row does not match the length of the last one, add blank cells for (int i = (lastCellcolumnIndex + 1) ; i <= previousRowLength; i++) { cells.add(new DataCell("")); lastCellcolumnIndex = i; } previousRowLength = lastCellcolumnIndex; rows.add(cells); } } catch (Exception e) { Logger.log(Logger.ERR, "Error in ExcelDataConnector.parseWorkbook(Sheet) - " + e); } dataFile.loadData(rows); return dataFile; } }