package com.cmshop.bbs.util;
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;
/**
* 读取excel单元
* @author tanyang
*
*/
@SuppressWarnings("unchecked")
public class ReadExcel {
public static void main(String[] args) {
ParseExcel parse = new ParseExcel();
try {
int[] flag = { 1, 0, 1, 1 };
int num = 4;
List<Map> list = parse.parse(num, flag,null);
int i = 0;
for (Map 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());
}
}
}
@SuppressWarnings("unchecked")
class ParseExcel {
/**
* 实现excel按首行即标题读取,必须项必须与单元格行数一致
*
* @param num
* int 字段长度
* @param flag
* int[] 必选项组,不是必选项为0,是为1
* @return 返回从Excel中获得的以字段为组的 List<Map<String, String>>
* @throws Exception
* 必选项和类型不匹配异常
*/
public List parse(int num, int[] flag,FileInputStream fis) throws Exception {
List keyname = new ArrayList(); // 存储键值
ArrayList list = new ArrayList();
if(fis==null){
fis = new FileInputStream("F://user.xls");
}
POIFSFileSystem pss = new POIFSFileSystem(fis);
HSSFWorkbook workbook = new HSSFWorkbook(pss);
// 读取Sheet
HSSFSheet sheet = workbook.getSheetAt(0);
// 读取行号
for (Iterator rit = sheet.rowIterator(); rit.hasNext();) {
HSSFRow row = (HSSFRow) rit.next();
if (row.getRowNum() == 0) { // 读取第一行字段名
Iterator cit = row.cellIterator();
while (cit.hasNext()) {
HSSFCell cell = (HSSFCell) cit.next();
keyname.add(cell.getRichStringCellValue().toString());
}
} else {// 遍历cell
Map map = new HashMap();
for (int i = 1;i<=num;i++) {
short j=Integer.valueOf(i-1).shortValue();
map.put("f" + i, match(row,row.getCell(j),i-1,flag[i-1]));
}
//将一行的数据增加到一个map中,然后在加入list列表
list.add(map);
}
}
return list;
}
/*
*
* @param row HSSFRow 行号
*
* @param columnNum HSSFCell 列号
*
* @param cell int 单位格
*
* @param flag int 必填项标志
*
* @return 将获得的数据转变为String
*/
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;
}
}