java代码读取excel文件,同时兼容2003和2007

package org.framework.core.util;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.PushbackInputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.poi.POIXMLDocument;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ExcelRead {
	
	
	public static Workbook create(InputStream inp) throws Exception {
		if (!inp.markSupported()) {
	        inp = new PushbackInputStream(inp, 8);
	    }
	    if (POIFSFileSystem.hasPOIFSHeader(inp)) {
	        return new HSSFWorkbook(inp);
	    }
	    if (POIXMLDocument.hasOOXMLHeader(inp)) {
	        return new XSSFWorkbook(OPCPackage.open(inp));
	    }
	    throw new IllegalArgumentException("你的excel版本目前poi解析不了");
	}
	
	/**
	 * 通过流读取Excel文件
	 * @param stream
	 * @return
	 * @throws Exception
	 */
	public static Map<String, List<List<Map<Integer,String>>>> getExcelDataByStream(String streamPath) throws Exception {
		try {
			Map<String, List<List<Map<Integer,String>>>> data = new HashMap<String, List<List<Map<Integer,String>>>>();
			Workbook book = create(new BufferedInputStream(new FileInputStream(streamPath)));
			if (null == book.getSheetAt(0)) {
				return null;
			}
			List<Map<Integer,String>> rowData = null;// 每一行的数据
			List<List<Map<Integer,String>>> sheetData = null;// 每个SHEET的数据
			String sheetName = null;
			// 遍历Excel得到SHEET
			for (int i = 0; i < book.getNumberOfSheets(); i++) {
				Sheet sheet = book.getSheetAt(i);
				// 获取SHEET的名字
				sheetName = sheet.getSheetName();
				sheetData = new ArrayList<List<Map<Integer,String>>>();
				// 遍历SHEET得到每一行
				for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {
					Row row = sheet.getRow(rowNum);
					if (null == row) {
						continue;
					}
					// 再遍历该行的所有列
					rowData = new ArrayList<Map<Integer,String>>();
					for (int cellNum = 0; cellNum < row.getLastCellNum(); cellNum++) {
						Cell cell = row.getCell(cellNum);
						if (null == cell) {
							continue;
						}
						String cellVal = getCellVal(cell);
						Map<Integer,String> map = new HashMap<Integer,String>();
						map.put(cellNum, cellVal);
						rowData.add(map);
					}
					// 如上遍历后rowData中填充了每一行的数据,将其加入到sheet中
					sheetData.add(rowData);
				}
				// 有了SHEET名字和SHEET中的数据了,以SHEET名字为键值,加入到MAP中
				data.put(sheetName, sheetData);
			}
			return data;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	private static String getCellVal(Cell cell) {
		if (null == cell) {
			return "";
		}
		switch (cell.getCellType()) {
		// 数字
		case HSSFCell.CELL_TYPE_NUMERIC:
			// 日期格式的处理
			if (HSSFDateUtil.isCellDateFormatted(cell)) {
				SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
				return sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue())).toString();
			}
			return String.valueOf(cell.getNumericCellValue());
		// 字符串
		case HSSFCell.CELL_TYPE_STRING:
			return cell.getStringCellValue();
		// 公式
		case HSSFCell.CELL_TYPE_FORMULA:
			return cell.getCellFormula();
		// 空白
		case HSSFCell.CELL_TYPE_BLANK:
			return "";
		case HSSFCell.CELL_TYPE_BOOLEAN:
			return cell.getBooleanCellValue() + "";
		// 错误类型
		case HSSFCell.CELL_TYPE_ERROR:
			return cell.getErrorCellValue() + "";
		default:
			break;
		}
		return "";
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值