ectable的导出为Excel,以数字开头,以F或D结束的,最后F,D都被截取的问题,经过测试跟踪,终于找到了问题的根源。
在原ectable的org.extremecomponents.table.view.XlsView中,其方法writeToCellFormatted()为:
private void writeToCellFormatted(HSSFCell cell, String value, String styleModifier) {
double numeric = NON_NUMERIC;
try {
numeric =Double.parseDouble(value);
} catch (Exception e) {
numeric = NON_NUMERIC;
}
if (value.startsWith("$") || value.endsWith("%") || value.startsWith("($")) {
boolean moneyFlag = (value.startsWith("$") || value.startsWith("($"));
boolean percentFlag = value.endsWith("%");
value = StringUtils.replace(value, "$", "");
value = StringUtils.replace(value, "%", "");
value = StringUtils.replace(value, ",", "");
value = StringUtils.replace(value, "(", "-");
value = StringUtils.replace(value, ")", "");
try {
numeric = Double.parseDouble(value);
} catch (Exception e) {
numeric = NON_NUMERIC;
}
cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
if (moneyFlag) {
// format money
cell.setCellStyle((HSSFCellStyle) styles.get("moneyStyle" + styleModifier));
} else if (percentFlag) {
// format percent
numeric = numeric / 100;
cell.setCellStyle((HSSFCellStyle) styles.get("percentStyle" + styleModifier));
}
} else if (numeric != NON_NUMERIC) {
// format numeric
cell.setCellStyle((HSSFCellStyle) styles.get("numericStyle" + styleModifier));
} else {
// format text
if (value.trim().equals(NBSP)) {
value = "";
}
cell.setCellStyle((HSSFCellStyle) styles.get("textStyle" + styleModifier));
}
fixWidthAndPopulate(cell, numeric, value);
}
其中红色部分对于以数字开头,以f,F,d,D结束的字符串会被解析为数字,因此导致结尾的F(f,D,d)会丢失。
因此需要排除这样的情况,相应修改如下:
try {
if(value.endsWith("F")||value.endsWith("f")||value.endsWith("D")||value.endsWith("d")){
numeric = NON_NUMERIC;
}else{
numeric = Double.parseDouble(value);
} } catch (Exception e) {
numeric = NON_NUMERIC;
}
在原ectable的org.extremecomponents.table.view.XlsView中,其方法writeToCellFormatted()为:
private void writeToCellFormatted(HSSFCell cell, String value, String styleModifier) {
double numeric = NON_NUMERIC;
try {
numeric =Double.parseDouble(value);
} catch (Exception e) {
numeric = NON_NUMERIC;
}
if (value.startsWith("$") || value.endsWith("%") || value.startsWith("($")) {
boolean moneyFlag = (value.startsWith("$") || value.startsWith("($"));
boolean percentFlag = value.endsWith("%");
value = StringUtils.replace(value, "$", "");
value = StringUtils.replace(value, "%", "");
value = StringUtils.replace(value, ",", "");
value = StringUtils.replace(value, "(", "-");
value = StringUtils.replace(value, ")", "");
try {
numeric = Double.parseDouble(value);
} catch (Exception e) {
numeric = NON_NUMERIC;
}
cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
if (moneyFlag) {
// format money
cell.setCellStyle((HSSFCellStyle) styles.get("moneyStyle" + styleModifier));
} else if (percentFlag) {
// format percent
numeric = numeric / 100;
cell.setCellStyle((HSSFCellStyle) styles.get("percentStyle" + styleModifier));
}
} else if (numeric != NON_NUMERIC) {
// format numeric
cell.setCellStyle((HSSFCellStyle) styles.get("numericStyle" + styleModifier));
} else {
// format text
if (value.trim().equals(NBSP)) {
value = "";
}
cell.setCellStyle((HSSFCellStyle) styles.get("textStyle" + styleModifier));
}
fixWidthAndPopulate(cell, numeric, value);
}
其中红色部分对于以数字开头,以f,F,d,D结束的字符串会被解析为数字,因此导致结尾的F(f,D,d)会丢失。
因此需要排除这样的情况,相应修改如下:
try {
if(value.endsWith("F")||value.endsWith("f")||value.endsWith("D")||value.endsWith("d")){
numeric = NON_NUMERIC;
}else{
numeric = Double.parseDouble(value);
} } catch (Exception e) {
numeric = NON_NUMERIC;
}


评论