/* * ExcelImportFile.java * * Created on February 12, 2007, 3:02 PM * * Utilities for the read and write operations over XLS files. * Uses the Apache POI Horrible Spreadsheet Format library */ package org.inbio.m3s.service.util.impl; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import org.apache.log4j.Logger; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.inbio.m3s.service.util.ImportFileParser; /** * * @author james */ public class ExcelImportFileParserImpl implements ImportFileParser { private static Logger logger = Logger.getLogger(ExcelImportFileParserImpl.class); private String filename; private POIFSFileSystem fs; private HSSFWorkbook wb; /*************************************************************************** * Creates a new instance of ExcelImportFile **************************************************************************/ public ExcelImportFileParserImpl(String filename) throws FileNotFoundException,IOException, IllegalArgumentException { logger.debug("filename ["+filename+"]"); this.filename = filename; this.fs = new POIFSFileSystem(new FileInputStream(filename)); this.wb = new HSSFWorkbook(fs); logger.debug("numero de paginas del Excell: "+this.wb.getNumberOfSheets()+""); // check the number of sheets of the document if (this.wb.getNumberOfSheets() == 0) { logger.error("El archivo no contiene informaciĆ³n necesaria"); throw new IllegalArgumentException("El archivo no contiene informaciĆ³n necesaria"); } else if (this.wb.getNumberOfSheets() == 1) { wb.createSheet("resultados"); wb.setSheetOrder("resultados", ExcelImportFileParserImpl.OUTPUT_SHEET); } else { wb.setSheetName(ExcelImportFileParserImpl.OUTPUT_SHEET, "resultados"); } // sets the output sheet informations String value; for (int i = 0; i <= ExcelImportFileParserImpl.LAST_COLUMN; i++) { value = readCell(ExcelImportFileParserImpl.INPUT_SHEET, ExcelImportFileParserImpl.HEADER_ROW, i); // System.out.println("Columna #"+i+":"+value); writeCell(ExcelImportFileParserImpl.OUTPUT_SHEET, ExcelImportFileParserImpl.HEADER_ROW, i, value); } }// constructor /*************************************************************************** * read and write operations implementation **************************************************************************/ /** * Reads the dataCode information from a excel file * * @param entryNumber * @param datacode * @return String */ public String read(int entryNumber, int dataCode) { return readCell(ExcelImportFileParserImpl.INPUT_SHEET, entryNumber, getExcelColumnNumber(dataCode)); } /** * Writes the result of processing the information of the entryNumber * * @param entryNumber * @param result * * FIXME: only writes on the first column (0), on invocation of the method * over the same entryNumber row overwrites the first result. This shoud * write the seccond result on the next column. * */ public void writeFinalResult(int entryNumber, String result) { writeCell(ExcelImportFileParserImpl.INPUT_SHEET, entryNumber, getExcelColumnNumber(ImportFileParser.FINAL_RESULT), result); } /** * * @param entryNumber * @param dataCode * @param result */ public void writeResult(int entryNumber, int dataCode, String result) { writeCell(ExcelImportFileParserImpl.OUTPUT_SHEET, entryNumber, dataCode, result); } /*************************************************************************** * Basic control operations implementation **************************************************************************/ /** * Closes the input and/or output file(s). */ public void closeFile() { try { FileOutputStream fileOut = new FileOutputStream(filename); this.wb.write(fileOut); fileOut.close(); } catch (IOException ex) { System.out.println("Excepcion volo"); ex.printStackTrace(); } } /** * Number of entries in the input * * @return int */ public int getTotalEntries() { return this.numberOfRows(ExcelImportFileParserImpl.INPUT_SHEET); } /** * The first entry of the output or -1 if there are no entries. * * @return int */ public int getFistEntryIdex() { if (this.getTotalEntries() >= 1) return ExcelImportFileParserImpl.FIRST_ENTRY_ROW; else return -1; } /** * true if entryIndex is the last index of the input * * @return boolean */ public boolean isLastIndex(int entryIdex) { if ((getTotalEntries() - 1) == entryIdex) return true; else return false; } /*************************************************************************** * Private class methods **************************************************************************/ /** * Convertes the ImportFile data codes to excel column numbers * * @param dataCode * ImportFile data code * @return int excel column number */ private int getExcelColumnNumber(int dataCode) { if (dataCode >= 0 && dataCode < 14) return dataCode; else if (dataCode >= 14 && dataCode < 23) return dataCode + 1; else if (dataCode >= 23 && dataCode < 29) return dataCode + 2; else if (dataCode == 29) return 32; else // data code == 29 return 34; } /** * @param sheetNumber * @return int */ private int numberOfRows(int sheetNumber) { return this.wb.getSheetAt(sheetNumber).getLastRowNum(); } /** * @param sheetNumber * @param rowNumber * @param columnNumber * @return String with the value, or null string if there was an error. */ private String readCell(int sheetNumber, int rowNumber, int columnNumber) { Double tempDouble; Integer tempInteger; try { HSSFSheet sheet = this.wb.getSheetAt(sheetNumber); HSSFRow row = sheet.getRow(rowNumber); HSSFCell cell = row.getCell(columnNumber); if (cell.getCellType() == HSSFCell.CELL_TYPE_STRING) { // System.out.println("-string-"+rowNumber); return cell.getStringCellValue(); } else if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) { // System.out.println("-numeric-"+rowNumber); tempDouble = Double.valueOf(cell.getNumericCellValue()); tempInteger = new Integer(tempDouble.intValue()); return tempInteger.toString(); } else return null; } catch (NullPointerException npe) { // System.out.println("Exception en read @ col" + columnNumber); return null; } } /** * @param sheetNumber * @param rowNumber * @param columnNumber * @param value */ private void writeCell(int sheetNumber, int rowNumber, int columnNumber, String value) { HSSFSheet sheet = wb.getSheetAt(sheetNumber); HSSFRow row; HSSFCell cell; row = sheet.getRow(rowNumber); if (row == null) { row = sheet.createRow(rowNumber); } cell = row.getCell(columnNumber); if (cell == null) { cell = row.createCell(columnNumber); } cell.setCellType(HSSFCell.CELL_TYPE_STRING); cell.setCellValue(value); } /*************************************************************************** * Class constants **************************************************************************/ // SHEETS private final static int INPUT_SHEET = 0; private final static int OUTPUT_SHEET = 1; // ROWS private final static int HEADER_ROW = 0; private final static int FIRST_ENTRY_ROW = 1; // COLUMNS private final static int LAST_COLUMN = 34; }