package foundation.io.file; import java.io.File; import java.io.FileInputStream; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.poi.hssf.usermodel.HSSFDateUtil; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; 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.xssf.usermodel.XSSFWorkbook; import foundation.data.entity.Entity; import foundation.data.entity.EntitySet; import foundation.data.object.DataObject; import foundation.io.define.DataIO; import foundation.io.engine.IReadDataListener; import foundation.io.engine.ISheetReader; import foundation.io.engine.IWorkBookReader; import foundation.io.mapping.MappingsRuntime; import foundation.io.object.Titles; import foundation.util.MapList; public class BookStandardReader extends IWorkBookReader implements ISheetReader { private FileInputStream inputStream; private XSSFWorkbook workbook; private MapList sheetList; private DataIO dataIO; private Sheet sheet; private int titleRowNo; private int dataRowNo; private int maxRowNo; private int currentRowNo; private int[] fromIndex; private int[] toIndex; public BookStandardReader(File uploadFile, int batchCount) throws Exception { inputStream = new FileInputStream(uploadFile); workbook = new XSSFWorkbook(inputStream); sheetList = new MapList(); for (Sheet sheet: workbook) { sheetList.add(sheet.getSheetName(), sheet); } currentRowNo = -1; } @Override public ISheetReader openSheetReader(DataIO dataIO) { this.dataIO = dataIO; this.titleRowNo = dataIO.getFromTitleRowNo(); this.dataRowNo = dataIO.getFromDataRowNo(); sheet = sheetList.get(dataIO.getFromName()); if (sheet == null) { sheet = sheetList.get(0); } maxRowNo = sheet.getLastRowNum(); return this; } @Override public Titles readTitles() { Titles result = null; Row titleRow = sheet.getRow(titleRowNo); if (titleRow == null) { return null; } result = new Titles(); int max = titleRow.getLastCellNum(); Cell cell = null; for (int i = 0; i < max; i++) { cell = titleRow.getCell(i); if (cell == null) { continue; } String title = null; CellType cellType = cell.getCellType(); if (CellType.STRING == cellType) { title = cell.getStringCellValue(); } else if (CellType.NUMERIC == cellType) { title = String.valueOf(cell.getNumericCellValue()); } else if (CellType.BOOLEAN == cellType) { title = String.valueOf(cell.getBooleanCellValue()); } else { title = null; } result.add(title, i); } return result; } @Override public EntitySet readData(MappingsRuntime mappingsRuntime, int batchCount, IReadDataListener dataListener) throws Exception { // if (currentRowNo < 0) { // currentRowNo = dataRowNo; // } currentRowNo = dataRowNo; DataObject dataObject = dataIO.getToTempDataObject(); EntitySet entitySet = dataObject.createTableEntitySet(batchCount); Entity entity = null; int emptyCount = 0; for (int i = 0; i < batchCount; i++) { Row dataRow = sheet.getRow(currentRowNo); if (dataRow == null) { continue; } entity = entitySet.newEntity(); readOneDataRow(entity, dataRow); if (entity.isEmpty()) { emptyCount++; if (emptyCount >= Max_Empty_Read_Times) { break; } continue; } entity.set("line_no", currentRowNo + 1); dataListener.onReadLine(entity); entitySet.append(entity); currentRowNo++; if (currentRowNo > maxRowNo) { break; } } return entitySet; } private DecimalFormat decimalFormat_zero = new DecimalFormat("0"); private DecimalFormat decimalFormat_well = new DecimalFormat("#.#########"); private SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); private void readOneDataRow(Entity entity, Row dataRow) { int size = fromIndex.length; Cell cell = null; CellType cellType; Object value; for (int i = 0; i < size; i++) { cell = dataRow.getCell(fromIndex[i]); if (cell == null) { continue; } cellType = cell.getCellType(); if (CellType.STRING == cellType) { value = cell.getStringCellValue(); entity.set(toIndex[i], value); continue; } if (CellType.NUMERIC == cellType) { if (DateUtil.isCellDateFormatted(cell)) { Date tempValue = cell.getDateCellValue(); value = simpleFormat.format(tempValue); entity.set(toIndex[i], value); continue; } String dateFormat = cell.getCellStyle().getDataFormatString(); if ("@".equals(dateFormat)) { value = decimalFormat_zero.format(cell.getNumericCellValue()); entity.set(toIndex[i], value); continue; } else if ("General".equals(dateFormat)) { value = decimalFormat_well.format(cell.getNumericCellValue()); entity.set(toIndex[i], value); continue; } else if ("m/d/yy h:mm".equalsIgnoreCase(dateFormat)) { value = simpleFormat.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue())); entity.set(toIndex[i], value); continue; } value = cell.getNumericCellValue(); entity.set(toIndex[i], value); continue; } if (CellType.BOOLEAN == cellType) { value = cell.getBooleanCellValue(); entity.set(toIndex[i], value); continue; } } entity.set("row_no", dataRow.getRowNum()); } @Override protected void close() { try { workbook.close(); } catch (Exception e) { } try { inputStream.close(); } catch (Exception e) { } } @Override public void setMappingRuntime(MappingsRuntime mappingsRuntime) { this.fromIndex = mappingsRuntime.getFromIndex(); this.toIndex = mappingsRuntime.getToIndex(); } }