package foundation.io.file.pull; import org.apache.poi.ss.usermodel.BuiltinFormats; import org.apache.poi.ss.usermodel.DataFormatter; import org.apache.poi.xssf.model.SharedStringsTable; import org.apache.poi.xssf.model.StylesTable; import org.apache.poi.xssf.usermodel.XSSFCellStyle; import org.apache.poi.xssf.usermodel.XSSFRichTextString; import org.xml.sax.Attributes; public class CellRuntime { private SharedStringsTable sharedStrings; private StylesTable stylesTable; private String columnName; private int columIndex; private CellType dataType; private StringBuilder rawData; private int formatIndex; private String formatString; private DataFormatter formatter; protected boolean[] dataFlag; public CellRuntime(SharedStringsTable sharedStrings, StylesTable stylesTable) { this.sharedStrings = sharedStrings; this.stylesTable = stylesTable; rawData = new StringBuilder(); formatter = new DataFormatter(); } public void init(boolean[] dataFlag) { this.dataFlag = dataFlag; } public void readAttributes(Attributes attributes) { //1. columnName = attributes.getValue("r"); columIndex = columnNameToIndex(columnName); //2. dataType = getCellDataType(attributes); } @SuppressWarnings("deprecation") public String parseToString() { String value = null; if (CellType.BOOL == dataType) { char first = rawData.charAt(0); value = first == '0' ? "false" : "true"; } else if (CellType.ERROR == dataType) { value = "error"; } else if (CellType.FORMULA == dataType) { value = null; } else if (CellType.INLINESTR == dataType) { XSSFRichTextString rtsi = new XSSFRichTextString(getRawDataString()); value = rtsi.toString(); } else if (CellType.SSTINDEX == dataType) { String sstIndex = getRawDataString(); try { int idx = Integer.parseInt(sstIndex); XSSFRichTextString rtss = new XSSFRichTextString(sharedStrings.getEntryAt(idx)); value = rtss.toString(); if (value != null) { value = value.trim(); } } catch (NumberFormatException ex) { } } else if (CellType.NUMBER == dataType) { try { value = getRawDataString(); } catch (Exception ex) { value = null; } } else if (CellType.DATE == dataType) { try { value = formatter.formatRawCellContents(Double.parseDouble(getRawDataString()), formatIndex, formatString); } catch (Exception ex) { value = getRawDataString(); } value = value.trim(); } else { value = null; } return value; } @SuppressWarnings("deprecation") public String parseToFormatString() { String value = null; if (CellType.BOOL == dataType) { char first = rawData.charAt(0); value = first == '0' ? "false" : "true"; } else if (CellType.ERROR == dataType) { value = "\"error: " + getRawDataString() + '"'; } else if (CellType.FORMULA == dataType) { value = rawData.toString(); } else if (CellType.INLINESTR == dataType) { XSSFRichTextString rtsi = new XSSFRichTextString(getRawDataString()); value = rtsi.toString(); } else if (CellType.SSTINDEX == dataType) { String sstIndex = getRawDataString(); try { int idx = Integer.parseInt(sstIndex); XSSFRichTextString rtss = new XSSFRichTextString(sharedStrings.getEntryAt(idx)); value = rtss.toString(); if (value != null) { value = value.trim(); } } catch (NumberFormatException ex) { } } else if (CellType.NUMBER == dataType) { try { value = getRawDataString(); if (this.formatString != null) { value = formatter.formatRawCellContents(Double.parseDouble(value), this.formatIndex, this.formatString); } } catch (Exception ex) { value = "error: " + ex.getMessage(); } } else if (CellType.DATE == dataType) { try { value = formatter.formatRawCellContents(Double.parseDouble(getRawDataString()), formatIndex, formatString); } catch (Exception ex) { value = getRawDataString(); } value = value.trim(); } else { value = null; } return value; } public CellType getDataType() { return dataType; } public void setDataType(CellType dataType) { this.dataType = dataType; } public int getColumnIndex() { return columIndex; } public void clearRawData() { rawData.setLength(0); } public int columnNameToIndex(String columnName) { int result = -1; for (int i = 0; i < columnName.length(); ++i) { if (Character.isDigit(columnName.charAt(i))) { break; } int c = columnName.charAt(i); result = (result + 1) * 26 + c - 'A'; } return result; } public CellType getCellDataType(Attributes attributes) { CellType dataType = CellType.NUMBER; String cellType = attributes.getValue("t"); String cellStyleStr = attributes.getValue("s"); if ("b".equals(cellType)) { dataType = CellType.BOOL; } else if ("e".equals(cellType)) { dataType = CellType.ERROR; } else if ("inlineStr".equals(cellType)) { dataType = CellType.INLINESTR; } else if ("s".equals(cellType)) { dataType = CellType.SSTINDEX; } else if ("str".equals(cellType)) { dataType = CellType.FORMULA; } if (cellStyleStr != null) { int styleIndex = Integer.parseInt(cellStyleStr); XSSFCellStyle style = stylesTable.getStyleAt(styleIndex); formatIndex = style.getDataFormat(); formatString = style.getDataFormatString(); if ("m/d/yy" == formatString) { dataType = CellType.DATE; formatString = "yyyy-MM-dd"; } if (formatString == null) { dataType = CellType.NULL; formatString = BuiltinFormats.getBuiltinFormat(formatIndex); } } return dataType; } public void appendValue(char[] ch, int start, int length) { rawData.append(ch, start, length); } public String getRawDataString() { String result = rawData.toString(); if (result == null) { return null; } return result.trim(); } public boolean isIgnore() { return false; //return !dataFlag[columIndex]; } }