通过POI对excel的读取,支持excel的(除公式以外的其它类型).通过List和Map对Excel读取进行了友好封装,支持excel必选字段判断.一下为代码:
package dointerface;
import java.io.FileInputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
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;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
/**
* @author yansheng
* @since 2008/6/1
* @version 0.0.0.1
*
*/
public class ReadExcel {
public static void main(String[] args) {
ParseExcel parse = new ParseExcel();
try {
int[] flag = { 1, 0, 0, 0 };
int num = 4;
List<Map<String, String>> list = parse.parse(num, flag);
int i = 0;
for (Map<String, String> map : list) {
i++;
System.out.println("第" + i + "行");
System.out.print(map.get("f1") + " : ");
System.out.print(map.get("f2") + " : ");
System.out.print(map.get("f3") + " : ");
System.out.println(map.get("f4"));
}
} catch (Exception ex) {
ex.printStackTrace();
System.out.println(ex.getMessage());
}
}
}
class ParseExcel {
/**
* 实现excel按首行即标题读取,必须项必须与单元格行数一致
*
* @param num
* <code>int</code> 字段长度
* @param flag
* <code>int[]</code> 必选项组,不是必选项为0,是为1
* @return 返回从Excel中获得的以字段为组的
* <code>List<<code>Map<<code>String</code>, <code>String</code>></code>></code>
* @throws Exception
* 必选项和类型不匹配异常
*/
public List<Map<String, String>> parse(int num, int[] flag)
throws Exception {
List<String> keyname = new ArrayList<String>(); // 存储键值
ArrayList<Map<String, String>> list = new ArrayList<Map<String, String>>();
FileInputStream fis = null;
fis = new FileInputStream("J:\\testExcel2.xls");
POIFSFileSystem pss = new POIFSFileSystem(fis);
HSSFWorkbook workbook = new HSSFWorkbook(pss);
// 读取Sheet
HSSFSheet sheet = workbook.getSheetAt(0);
// 读取行号
for (Iterator<HSSFRow> rit = sheet.rowIterator(); rit.hasNext();) {
HSSFRow row = (HSSFRow) rit.next();
if (row.getRowNum() == 0) { // 读取第一列字段名
Iterator<HSSFCell> cit = row.cellIterator();
while (cit.hasNext()) {
HSSFCell cell = (HSSFCell) cit.next();
keyname.add(cell.getRichStringCellValue().toString());
}
} else {// 遍历cell
Map<String, String> map = new HashMap<String, String>();
for (int i = 0; i < num; i++) {
HSSFCell cell = row.getCell((short) i);
// System.out.println("row " + row.getRowNum() + " line " +
// cell.getCellNum() +
// " is " + cell.getRichStringCellValue().toString());
System.out.println(i + " " + flag.length);
map.put(keyname.get(i), match(row, cell, i, flag[i]));
}
list.add(map);
System.out.println("---------------------");
}
}
return list;
}
/**
* 对单元格类型和必填项进行校验,并转换为<code>String</code>
*
* @param row
* <code>HSSFRow</code> 行号
* @param columnNum
* <code>HSSFCell</code> 列号
* @param cell
* <code>int</code> 单位格
* @param flag
* <code>int</code> 必填项标志
* @return 将获得的数据转变为<code>String</code>
*/
public String match(HSSFRow row, HSSFCell cell, int columnNum, int flag)
throws Exception {
String str = "";
int rowNum = row.getRowNum() + 1;
columnNum++;
// 是否为必填位
if (flag == 1
&& (cell == null || cell.getCellType() == HSSFCell.CELL_TYPE_BLANK)) {
throw new Exception(rowNum + "行" + columnNum + "列为必填项");
} else if (cell != null) {
if (cell.getCellType() == HSSFCell.CELL_TYPE_BLANK) { // 是否为空型
str = "";
} else if (cell.getCellType() == HSSFCell.CELL_TYPE_STRING) {// 是否为字符串型
str = cell.getRichStringCellValue().toString();
} else if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {// 是否为数值型
if (HSSFDateUtil.isCellDateFormatted(cell)) {// 是否为日期型
str = dateToString(cell.getDateCellValue(), "yyyy-MM-dd");
} else {// 是否为数值型
double d = cell.getNumericCellValue();
if (d - (int) d < Double.MIN_VALUE) { // 是否为int型
str = Integer.toString((int) d);
} else { // 是否为double型
str = Double.toString(cell.getNumericCellValue());
}
}
} else if (cell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN) {// 是否为布尔型
str = Boolean.toString(cell.getBooleanCellValue());
} else {
throw new Exception(rowNum + "行" + columnNum + "列数据类型不匹配");
}
}
return str;
}
/**
* 将日期型转变为String型的工具方法
*
* @param date
* 日期
* @param pattern
* 日期格式
* @return String的返回值
*/
public String dateToString(Date date, String pattern) {
DateFormat format = new SimpleDateFormat(pattern);
String str = format.format(date);
return str;
}
}
excel表内容
f1 | f2 | f3 | f4 |
1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 |
poi.jar可以到poi.apache.org下载.本例使用poi版本为poi-3.1.jar