poi-3.8-20120326.jar
poi-examples-3.8-20120326.jar
poi-excelant-3.8-20120326.jar
poi-ooxml-3.8-20120326.jar
poi-ooxml-schemas-3.8-20120326.jar
poi-scratchpad-3.8-20120326.jar
xmlbeans-2.3.0.jar
/**
* 读取excel文件并转换成list 空行不会被存到list数据已key等于列数value等于值的形式存到map行和列都是从0开始
*
* @param file
* 要读取的excel文件
*
* @param header
* 表头所占用行数 0表示无表头
*
* @param sheetNum
* 要读取excel的第几张表
*
* @return
*/
public static List<Map<Integer, String>> excelToList(File file, int headerNum, int sheetNum) {
try {
// 把所有读取到的数据存到一个list
List<Map<Integer, String>> list = new ArrayList<Map<Integer, String>>();
// 把单行数据存到一个map
Map<Integer, String> map = null;
// 定义一个变量来记录此行是否为空行大于0表示此行有数据否则不会存到list
int checkRow = 0;
InputStream is = new FileInputStream(file);
Workbook workbook = null;
// 通过后缀来判断要是用的Workbook,xls是2003,xlsx是2007
if ("xlsx".equals(StringUtil.getFileExt(file.getName()))) {
workbook = new XSSFWorkbook(is);
} else {
workbook = new HSSFWorkbook(is);
}
// 得到第一个shell
Sheet sheet = workbook.getSheetAt(sheetNum);
// 得到Excel的行数
int totalRows = sheet.getPhysicalNumberOfRows();
int totalCells = 0;
// 得到Excel的列数
if (totalRows >= 1 && sheet.getRow(0) != null) {
totalCells = sheet.getRow(0).getPhysicalNumberOfCells();
}
Row row = null;
Cell cell = null;
StringBuffer value = new StringBuffer("");
// 循环Excel的行
for (int r = 0; r < totalRows; r++) {
row = sheet.getRow(r);
if (row == null) {
continue;
}
map = new LinkedHashMap<Integer, String>();
// 跳过表头
if (r >= headerNum) {
// 循环Excel的列
for (int c = 0; c < totalCells; c++) {
cell = row.getCell(c);
// 值为null时转换成空字符
if (String.valueOf(cell) != null) {
// 防止数字自然数格式读取
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_NUMERIC: // 数字
DecimalFormat format = new DecimalFormat("0");
value = new StringBuffer(format.format(cell.getNumericCellValue()).replaceAll("\\s*|\t|\r|\n", ""));
break;
case HSSFCell.CELL_TYPE_STRING: // 字符串
value = new StringBuffer(String.valueOf(cell).replaceAll("\\s*|\t|\r|\n", ""));
break;
}
} else {
value = new StringBuffer("");
}
map.put(c, value + "");
if (!"".equals(value) && (value != null) && (value.length() != 0)) {
checkRow++;
}
// 存完一列数据清空value以免空列无法更新value
value = new StringBuffer("");
}
// checkRow大于表示此行有数据需要存到list
if (checkRow > 0) {
list.add(map);
// 重置list来记录下一行是否为空行
checkRow = 0;
}
}
}
return list;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}