// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.opendata.core.io.tabular;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.data.osm.DataSet;
import org.openstreetmap.josm.gui.progress.ProgressMonitor;
import org.openstreetmap.josm.plugins.opendata.core.datasets.AbstractDataSetHandler;
public class XlsReader extends SpreadSheetReader {
private Workbook wb;
private Sheet sheet;
private int rowIndex;
public XlsReader(SpreadSheetHandler handler) {
super(handler);
}
public static DataSet parseDataSet(InputStream in,
AbstractDataSetHandler handler, ProgressMonitor instance) throws IOException {
return new XlsReader(handler != null ? handler.getSpreadSheetHandler() : null).parse(in, instance);
}
@Override
protected void initResources(InputStream in, ProgressMonitor progressMonitor) throws IOException {
Main.info("Parsing XLS file");
try {
wb = new HSSFWorkbook(new POIFSFileSystem(in));
sheet = wb.getSheetAt(getSheetNumber());
rowIndex = 0;
} catch (ExceptionInInitializerError e) {
Throwable ex = e.getException();
if (ex != null && ex.getMessage() != null) {
Main.error(ex.getClass()+": "+ex.getMessage());
}
throw new IOException(e);
} catch (Throwable t) {
throw new IOException(t);
}
}
@Override
protected String[] readLine(ProgressMonitor progressMonitor) throws IOException {
if (sheet != null) {
Row row = sheet.getRow(rowIndex++);
if (row != null) {
List<String> result = new ArrayList<>();
for (Cell cell : row) {
switch (cell.getCellType()) {
case Cell.CELL_TYPE_STRING:
result.add(cell.getRichStringCellValue().getString());
break;
case Cell.CELL_TYPE_NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
result.add(cell.getDateCellValue().toString());
} else {
result.add(Double.toString(cell.getNumericCellValue()));
}
break;
case Cell.CELL_TYPE_BOOLEAN:
result.add(Boolean.toString(cell.getBooleanCellValue()));
break;
case Cell.CELL_TYPE_FORMULA:
result.add(cell.getCellFormula());
break;
default:
result.add("");
}
}
return result.toArray(new String[0]);
}
}
return null;
}
}