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];
|
}
|
}
|