读取excel文件的时候,某些单元格是数字,但是可能超过10位,例如电话号码,读取之后会变为2147483647,改变下读取的长度就好了。例如value += (long) cell.getNumericCellValue() + separate;如果long改为int就会出现这个问题,因为int接收最大长度为10位数,最大长度为2147483647,所以int改为long就好了。
以下为详细代码:
package poi_import_excel;
import java.io.FileInputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
public class poi_import_excel {
public static void main(String[] args){
List<String> allExcel= readExcel("D:/Interface/interface.xls","|");
int max = allExcel.size();
System.out.println(max);
for(int i = 0 ;i < max ;i++){
System.out.println(allExcel.get(i));
}
}
public static List<String> readExcel(String filePath, String separate) {
List<String> person=new ArrayList<>();
// 创建对Excel工作簿文件的引用
try {
HSSFWorkbook wookbook = new HSSFWorkbook(new FileInputStream(filePath));
// 在Excel文档中,第一张工作表的缺省索引是0
HSSFSheet sheet = wookbook.getSheetAt(0);
// 获取到Excel文件中的所有行数
int rows = sheet.getPhysicalNumberOfRows();
int max_cells = 0;
// 获取最长的列,在实践中发现如果列中间有空值的话,那么读到空值的地方就停止了。所以我们需要取得最长的列。<br> //如果每个列正好都有一个空值得话,通过这种方式获得的列长会比真实的列要少一列。所以我自己会在将要倒入数据库中的EXCEL表加一个表头<br> //防止列少了,而插入数据库中报错。
for (int i = 0; i < rows; i++) {
HSSFRow row = sheet.getRow(i);
if (row != null) {
int cells = row.getPhysicalNumberOfCells();
if (max_cells < cells) {
max_cells = cells;
}
}
}
//System.out.println(max_cells);
// 遍历行
for (int i = 1; i < rows; i++) {
HashMap<String, String> map = new HashMap<String, String>();
// 读取左上端单元格
HSSFRow row = sheet.getRow(i);
// 行不为空
if (row != null) {
String value = "";
// 遍历列
String b_id = null;
for (int j = 0; j < max_cells; j++) {
// 获取到列的值
HSSFCell cell = row.getCell(j);
if (cell == null) {
value += "NULL"+separate;
} else {
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_FORMULA:
try {
value += String.valueOf(cell.getNumericCellValue())+ separate;
} catch (IllegalStateException e) {
value += String.valueOf(cell.getRichStringCellValue())+ separate;
}
break;
case HSSFCell.CELL_TYPE_NUMERIC:
// 如果有日期的话,那么就读出日期格式
// 如果是数字的话,就写出数字格式
if (HSSFDateUtil.isCellDateFormatted(cell)) {
SimpleDateFormat dff = new SimpleDateFormat("yyyy-MM-dd");
Date date2 = HSSFDateUtil.getJavaDate(cell.getNumericCellValue());
String date1 = dff.format(date2);
value += date1 + separate;
} else {
//int 的最大值为2147483647,当数字超过10位会有问题,所以此处用long。
value += (long) cell.getNumericCellValue() + separate;
}
break;
case HSSFCell.CELL_TYPE_STRING:
String ss = cell.getStringCellValue();
if (ss == null || "".equals(ss)) {
value = "NULL"+separate;
} else {
value += cell.getStringCellValue() + separate;
}
break;
default:
value += "NULL"+separate;
break;
}
}
if (j == 0) {
b_id = value.substring(1, value.length() - 2);
//b_id = b_id.replaceAll("'", "");
}
}
String valueresult = value.substring(0, value.length() - 1);
((HashMap<String, String>) map).put(b_id, valueresult);
}
person.add(map.toString());
}
wookbook.cloneSheet(0);
} catch (Exception e) {
e.printStackTrace();
person.add("error:" + e.toString());
}
return person;
}
}