最近在做项目的时候需要用的POI解析Excel,该Excel中数据类型较多,有日期型,整型,double型,文本型。但是在处理时碰见了以下两个问题:
遇到数字类型时,虽然Excel中设置为文本类型,但是POI的Cell类型依然会变为数字类型,而且当数字比较长的时候,读取出来的结果还会变成科学计数法的形式。
数字无论是否为小数还是整型,当使用()来读取内单元格内容的时候,都会统一当成Double类型来处理。
为了解决以上问题,即获取单元格的原始数据,统一用DecimalFormat对double进行格式化即可。如下:
DecimalFormat df = new DecimalFormat("0");
String cellText = (());
这里附上获取单元格内容的相关代码。
public class ExcelUtil {
private String val = null;
private SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd"); //日期格式yyyy-mm-dd
private DecimalFormat df = new DecimalFormat("0"); //数字格式,防止长数字成为科学计数法形式,或者int变为double形式
List<ArrayList<String>> strLists = new ArrayList<ArrayList<String>>(); //存放Excel中的数据
/**
* @author: LS
* 2016-8-27 下午7:04:26
* @return List<ArrayList<String>>
* @throws FileNotFoundException,IOException,InvalidFormatException
* POI方式解析EXCEL表格(2007以上版本,xlsx)
*/
public List<ArrayList<String>> poiReadXExcel(String file) throws FileNotFoundException, IOException, InvalidFormatException {
FileInputStream input = new FileInputStream(new File(file)); //读取的文件路径
XSSFWorkbook wb = new XSSFWorkbook(new BufferedInputStream(input));
XSSFSheet sheet = (0); //获取第一张表
int rowNum = ();//得到数据的行数
("行数:" + rowNum);
();
//遍历行
for (int i = 0; i < rowNum; i++)
{
List<String> strList = new ArrayList<String>();
XSSFRow row = (i);
int colNum = ();//得到当前行中存在数据的列数
//遍历列
for (int j = 0; j < colNum; j++) {
XSSFCell cell = (j);
(getXCellVal(cell));
}
(i, (ArrayList<String>) strList); //存储该行
}
//打印
for (ArrayList<String> stringList : strLists) {
for (String str : stringList) {
(str + " ");
}
();
}
();
return strLists;
}
/**
* @author: LS
* 2016-8-25 下午7:40:05
* @param cell
* @return String
* 获取单元格中的值
*/
private String getXCellVal(XSSFCell cell) {
switch (()) {
case XSSFCell.CELL_TYPE_NUMERIC:
if ((cell)) {
val = (()); //日期型
} else {
val = (()); //数字型
}
break;
case XSSFCell.CELL_TYPE_STRING: //文本类型
val = ();
break;
case XSSFCell.CELL_TYPE_BOOLEAN: //布尔型
val = (());
break;
case XSSFCell.CELL_TYPE_BLANK: //空白
val = ();
break;
case XSSFCell.CELL_TYPE_ERROR: //错误
val = "错误";
break;
case XSSFCell.CELL_TYPE_FORMULA: //公式
try {
val = (());
} catch (IllegalStateException e) {
val = (());
}
break;
default:
val = () == null ? null : ().toString();
}
return val;
}
}
Java读写Excel的三种方式见/sunglee_1992/article/details/53033644