读取2003版本
/**
* 获取2003版本的Excel数据
* @param is
* @param sheetName 指定的sheet名称
* @param firstRow 第一行,从0开始计算
* @param firstCell 第一列,从0开始计算
* @param titleNames 中文名称, 数据库字段 ,表头别名(以汉字的形式名称,用来转换成数据库中的英文字段),如果为null则不使用别名
* @return
* @throws IOException
*/
public static List<Map<String, Object>> getxlsInfo(InputStream is, String sheetName, int firstRow, int firstCell, List<Map<String, String>> titleNames) throws IOException {
List<Map<String, Object>> info = new ArrayList<Map<String, Object>>();
HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);
// 循环工作表Sheet
for (int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) {
// Excel工作表对象
HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
if (StringUtils.isBlank(sheetName) && hssfSheet == null) {
continue;
} else if (!hssfSheet.getSheetName().contains(sheetName)) {
continue;
}
// 取得表头名称
HSSFRow titleRow = hssfSheet.getRow(0);// 表头行,模板表头从第1行开始
HSSFCell titleCell = null;// 表头cell
String titleName = "";
// 循环行,内容从模板的第X行开始
for (int i = firstRow; i <= hssfSheet.getLastRowNum(); i++) {
HSSFRow hssfRow = hssfSheet.getRow(i);
if (hssfRow != null) {
HSSFCell cell = hssfRow.getCell(1);
//如果第1、2、3列无数据将跳过此行
if (cell == null && hssfRow.getCell(0) == null && hssfRow.getCell(2) == null) {
continue;
}
Map<String, Object> map = new HashMap<String, Object>();
// 循环列,从模板的第X列开始
for (int j = firstCell; j < hssfRow.getLastCellNum(); j++) {
// 当前列为空,则跳出
cell = hssfRow.getCell(j);
if (cell == null) {
continue;
}
String cellValue = ExcelUtil.getValue(hssfRow.getCell(j));// cell值
if (StringUtils.isBlank(cellValue)) {
// continue;
}
// 获取当前列对应的表头名称
titleCell = titleRow.getCell(j);
titleName = titleCell.getStringCellValue().trim();
if(titleName == null) {
map.put(titleName, cellValue);
}else {
for(Map<String, String> name:titleNames) {
map.put(name.get(titleName), cellValue);
}
}
}
info.add(map);
}
}
}
return info;
}
读取2007版本
/**
* 获取2007版本的Excel数据
* @param is
* @param sheetName
* @param firstRow 第一行,从0开始计算
* @param firstCell 第一列,从0开始计算
* @param titleNames 中文名称, 数据库字段 ,表头别名(以汉字的形式名称,用来转换成数据库中的英文字段),如果为null则不使用别名
* @return
* @throws IOException
*/
public static List<Map<String, Object>> getxlsxInfo(InputStream is, String sheetName, int firstRow, int firstCell, List<Map<String, String>> titleNames) throws IOException {
List<Map<String, Object>> info = new ArrayList<Map<String, Object>>();
XSSFWorkbook hssfWorkbook = new XSSFWorkbook(is);
// 循环工作表Sheet
for (int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) {
// Excel工作表对象
XSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
if (StringUtils.isBlank(sheetName) && hssfSheet == null) {
continue;
} else if (!hssfSheet.getSheetName().contains(sheetName)) {
continue;
}
// 取得表头名称
XSSFRow titleRow = hssfSheet.getRow(0);// 表头行,模板表头从第1行开始
XSSFCell titleCell = null;// 表头cell
String titleName = "";
// 循环行,内容从模板的第X行开始
for (int i = firstRow; i <= hssfSheet.getLastRowNum(); i++) {
XSSFRow hssfRow = hssfSheet.getRow(i);
if (hssfRow != null) {
XSSFCell cell = hssfRow.getCell(1);
//如果第1、2、3列无数据将跳过此行
if (cell == null && hssfRow.getCell(0) == null && hssfRow.getCell(2) == null) {
continue;
}
Map<String, Object> map = new HashMap<String, Object>();
// 循环列,从模板的第X列开始
for (int j = firstCell; j < hssfRow.getLastCellNum(); j++) {
// 当前列为空,则跳出
cell = hssfRow.getCell(j);
if (cell == null) {
continue;
}
String cellValue = ExcelUtil.getValue(hssfRow.getCell(j));// cell值
if (StringUtils.isBlank(cellValue)) {
// continue;
}
// 获取当前列对应的表头名称
titleCell = titleRow.getCell(j);
titleName = titleCell.getStringCellValue().trim();
if(titleName == null) {
map.put(titleName, cellValue);
}else {
for(Map<String, String> name:titleNames) {
map.put(name.get(titleName), cellValue);
}
}
}
info.add(map);
}
}
}
return info;
}
注:ExcelUtil为该类名
函数中的getValue方法:
/**
* 获取单元格的值
*
* @param cell
* @return
*/
public static String getValue(Cell cell) {
String value = "";
if(cell!=null){//如果单元格不为空
switch (cell.getCellType()) {
case Cell.CELL_TYPE_STRING:
value = cell.getStringCellValue();
break;
case Cell.CELL_TYPE_NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
Date date = cell.getDateCellValue();
if (date != null) {
value = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
.format(date);
} else {
value = "";
}
} else {
try {
if (Long.parseLong(new DecimalFormat("0")
.format(cell.getNumericCellValue())) == cell
.getNumericCellValue()) {
value = new DecimalFormat("0")
.format(cell
.getNumericCellValue());
} else {
value = new DecimalFormat("0.00000")
.format(cell
.getNumericCellValue());
}
} catch (Exception ex) {
value = new DecimalFormat("0").format(cell
.getNumericCellValue());
}
}
break;
case Cell.CELL_TYPE_FORMULA:
// 导入时如果为公式生成的数据则无值
/*if (!cell.getStringCellValue().equals("")) {
value = cell.getStringCellValue();
} else {
value = cell.getNumericCellValue() + "";
}*/
try {
value = String.valueOf(cell
.getStringCellValue());
} catch (IllegalStateException e) {
value = new DecimalFormat("0.00000")
.format(Double.valueOf(String
.valueOf(cell
.getNumericCellValue())));
}
break;
case Cell.CELL_TYPE_BLANK:
value = "";
break;
case Cell.CELL_TYPE_ERROR:
value = "";
break;
case Cell.CELL_TYPE_BOOLEAN:
value = (cell.getBooleanCellValue() == true ? "Y" : "N");
break;
default:
value = "";
}
}
return value;
}
引用的包(有些是多余的)
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFFont;
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.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
调用示例:
public void uploadHL(MultipartFile file, AccountSession as) throws Exception {
if (!(file.getOriginalFilename().endsWith(".xls") || file.getOriginalFilename().endsWith(".xlsx"))) {
throw new Exception("文件类型不是xls或xlsx格式");
}
String sheetName = "";
int firstRow = 1;
int firstCell = 0;
InputStream is = file.getInputStream();
List<Map<String, Object>> info = null;
List<Map<String, String>> titleNames = new ArrayList<Map<String,String>>();
Map<String, String> titleName = new HashMap<String, String>();
titleName.put("落货纸", "ihlCode");
titleName.put("发票号", "ihdInvoice");
titleName.put("数量", "ihdQty");
titleName.put("单价", "ihdPrice");
titleName.put("净重", "ihdNetWeight");
titleName.put("金额", "ihdMoney");
titleNames.add(titleName);
if (file.getOriginalFilename().endsWith(".xls")) {
info = ExcelUtil.getxlsInfo(is, sheetName, firstRow, firstCell, titleNames);
} else if (file.getOriginalFilename().endsWith(".xlsx")) {
info = ExcelUtil.getxlsxInfo(is, sheetName, firstRow, firstCell, titleNames);
}
//检查数据是否获取
if (info == null || info.size() <= 0) {
throw new Exception("未能获取到数据");
}
}
获取到的数据示例:
如果传入的titleName中没有与Excel中对应的,就是null名称
[{null=1, ihdMoney=210665, ihdNetWeight=2592, ihdPrice=65, ihlCode=RC20190627000001, ihdQty=3241}, {null=2, ihdMoney=100.00000, ihdNetWeight=930, ihdPrice=10, ihlCode=RC20191220000010, ihdQty=10}]