读取Excel中的数据,返回List类型数据集合

读取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}]

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值