JavaEE POI读取 Excel中的数据,(Excel2003(xls), Excel2007(xlsx))

    项目中遇到需求:将Excel 文件中的读取出来 保存到数据库中。

    这里讲解下,如何用POI 读取Excel 文件。 另:如何将数据存储到Excel 文件中:

   1.将数据导出到Excel(网络下载+本地存储)  http://blog.csdn.net/u010003835/article/details/50894549

   2.设置单元格格式: http://blog.csdn.net/u010003835/article/details/50924454



Excel 导入,  注意 Excel 2003, Excel 2007 是不同的, 2003主要用到的类 为 HSSF 开头的类,2007 用到的类 以 XSSF 开头的类。

注意: 2007 除了基本的POI JAR包,还需要 dom4j, xmlbean 包,


这里给出这个Demo的下载地址(MyEclipse2014 下开发,喜欢的朋友在文章下面评论 或给个赞)

http://pan.baidu.com/s/1hr9qcLY


需要的Jar 包:




主要的设计思想( 程序运行的流程):

0.将 数据列(希望取得名字) 和 路径+文件名的字符串 传入方法中

1.传入文件名,根据文件名的后缀判断是Excel2003,还是Excel2007

2.读取Excel 文件,将每行的读取方式设置为abstract 抽象方法。方便对于特殊的单元格进行特殊的处理,具体的Excel特定实现

3.对于单元格的值读取 给出通用的处理方法,可以不使用这种方法,自定义处理方式


示例代码:

package util;

import java.io.FileInputStream;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
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.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/**
 * @author szh
 * @note 主要功能:导入Excel 文件中的数据
 */
public abstract class ExcelImportUtilVerTwo {

	private String[] columns;

	protected void setColumns(String[] columns) {
		this.columns = columns;
	}

	public String[] getColumns() {
		return this.columns;
	}

	/**
	 * @note (Excel2003)针对于xls后缀结尾的Excel。
	 *       读取Excel数据行,并将数据存储到Map中,具体实现的时候指定如何读取数据行
	 * @param tableRow
	 * @return 返回一行Excel的数据
	 * @param map
	 */
	@SuppressWarnings("rawtypes")
	protected abstract Map readTableRowExcel2003(HSSFRow tableRow, Map map);

	/**
	 * @note (Excel2007)针对于xlsx后缀结尾的Excel。
	 *       读取Excel数据行,并将数据存储到Map中,具体实现的时候指定如何读取数据行
	 * @param tableRow
	 * @return 返回一行Excel的数据
	 */
	@SuppressWarnings("rawtypes")
	protected abstract Map readTableRowExcel2007(XSSFRow tableRow, Map map);

	/**
	 * @param fileName
	 *            传入文件名
	 * @return 根据文件名的后缀判断传入的Excel 版本
	 */
	protected String checkVersion(String fileName) {
		String version = "";
		if (null == fileName || "".equals(fileName))
			return version;
		String suffix = fileName
				.substring(fileName.trim().lastIndexOf(".") + 1);
		if ("xls".equals(suffix)) {
			version = "2003";
		} else if ("xlsx".equals(suffix)) {
			version = "2007";
		}
		return version;
	}

	/**
	 * @note 读取excel, 将其中的数据以 List<Map> 的形式返回
	 * @param fileName
	 *            读取的excel的文件名
	 */
	@SuppressWarnings("rawtypes")
	public List<Map> readExcel(String fileName, String[] columns) {
		List<Map> list = null;

		this.setColumns(columns);

		String version = this.checkVersion(fileName);
		if (!"".equals(version)) {
			if ("2003".equals(version)) {
				list = readExcel2003(fileName);
			} else if ("2007".equals(version)) {
				list = readExcel2007(fileName);
			}
		}
		return list;
	}

	@SuppressWarnings({ "rawtypes", "unused" })
	protected List<Map> readExcel2003(String fileName) {
		try {
			InputStream in = new FileInputStream(fileName);
			HSSFWorkbook workbook = new HSSFWorkbook(in);
			List<Map> list = new ArrayList<Map>();

			for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
				HSSFSheet sheet = workbook.getSheetAt(i);
				if (null == sheet)
					continue;
				HSSFRow titleRow = sheet.getRow(0);
				// 从第一行开始读取,因为第0行是表头
				for (int j = 1; j <= sheet.getLastRowNum(); j++) {
					HSSFRow tableRow = sheet.getRow(j);
					Map map = new HashMap<>();
					if (null == tableRow)
						continue;
					map = this.readTableRowExcel2003(tableRow, map);

					list.add(map);
				}
			}
			in.close(); // 关闭文件

			return list; // 正常返回, 返回表格的数据
		} catch (Exception e) {
			e.printStackTrace();
			return null; // 非正常返回,返回null
		}
	}

	@SuppressWarnings({ "rawtypes", "unused" })
	protected List<Map> readExcel2007(String fileName) {
		try {

			InputStream in = new FileInputStream(fileName);
			XSSFWorkbook workbook = new XSSFWorkbook(in);

			List<Map> list = new ArrayList<Map>();
			for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
				XSSFSheet sheet = workbook.getSheetAt(i);
				if (null == sheet)
					continue;
				XSSFRow tableTitle = sheet.getRow(0);
				for (int j = 1; j <= sheet.getLastRowNum(); j++) {
					XSSFRow tableRow = sheet.getRow(j);
					Map map = new HashMap();
					if (null == tableRow)
						continue;
					map = this.readTableRowExcel2007(tableRow, map);
					list.add(map);
				}
			}
			in.close();
			return list;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * @note 将Excel(2003)中单元格的数据 转换为String返回,可以在readTableRowExcel2003中进行自定义转换方式
	 * @param cell
	 * @return 若成功则返回指定的字符串,若没有成功转换则返回null
	 */
	protected String getCellValueExcel2003(HSSFCell cell) {
		Boolean convertFlag = false;
		String cellValue = "";

		if (cell == null) {
			convertFlag = true;
		} else {
			switch (cell.getCellType()) {
			case HSSFCell.CELL_TYPE_STRING:
				cellValue = cell.getStringCellValue();
				convertFlag = true;
				break;
			// 注意一个非常操蛋的事情,一般的 int 与 日期数据 都会被当成 CELL_TYPE_NUMERIC 类型
			case HSSFCell.CELL_TYPE_NUMERIC:
				// cellValue = String.valueOf(cell.getNumericCellValue());
				if (HSSFDateUtil.isCellDateFormatted(cell)) {
					Date date = cell.getDateCellValue();
					SimpleDateFormat ymdDateConvert = new SimpleDateFormat(
							"yyyy-MM-dd");
					cellValue = ymdDateConvert.format(date);
				} else {
					DecimalFormat comConvert = new DecimalFormat("#");
					cellValue = comConvert.format(cell.getNumericCellValue());
				}
				convertFlag = true;
				break;
			case HSSFCell.CELL_TYPE_BOOLEAN:
				cellValue = String.valueOf(cell.getBooleanCellValue());
				convertFlag = true;
				break;
			case HSSFCell.CELL_TYPE_BLANK:
				convertFlag = true;
				cellValue = "";
				break;
			}
		}

		if (convertFlag) {
			return cellValue; // 如果成功转换
		} else {
			return null;// 不成功,返回null
		}
	}

	/**
	 * @note 将Excel(2007)中单元格的数据 转换为String返回 ,可以在readTableRowExcel2007中进行自定义转换方式
	 * @param cell
	 * @return 若成功则返回指定的字符串,若没有成功转换则返回null,
	 */
	protected String getCellValueExcel2007(XSSFCell cell) {
		Boolean convertFlag = false;
		String cellValue = "";

		if (cell == null) {
			convertFlag = true;
		} else {
			switch (cell.getCellType()) {
			case XSSFCell.CELL_TYPE_STRING:
				cellValue = cell.getStringCellValue();
				convertFlag = true;
				break;
			// 注意一个非常操蛋的事情,一般的 int 与 日期数据 都会被当成 CELL_TYPE_NUMERIC 类型
			case XSSFCell.CELL_TYPE_NUMERIC:
				if (HSSFDateUtil.isCellDateFormatted(cell)) {
					Date date = cell.getDateCellValue();
					SimpleDateFormat ymdDateConvert = new SimpleDateFormat(
							"yyyy-MM-dd");
					cellValue = ymdDateConvert.format(date);
				} else {
					DecimalFormat comConvert = new DecimalFormat("#");
					cellValue = comConvert.format(cell.getNumericCellValue());
				}
				convertFlag = true;
				break;
			case XSSFCell.CELL_TYPE_BOOLEAN:
				cellValue = String.valueOf(cell.getBooleanCellValue());
				convertFlag = true;
				break;
			case XSSFCell.CELL_TYPE_BLANK:
				convertFlag = true;
				cellValue = "";
				break;
			}
		}

		if (convertFlag) {
			return cellValue;
		} else {
			return null;
		}
	}

}



测试代码:

package service;

import java.util.List;
import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.xssf.usermodel.XSSFRow;

import util.ExcelImportUtilVerTwo;

public class ExcelImportTest {

	public static void main(String[] args) {
		ExcelImportUtilVerTwo importUtilVerTwo = new ExcelImportUtilVerTwo() {

			@SuppressWarnings({ "unchecked", "rawtypes" })
			@Override
			protected Map readTableRowExcel2007(XSSFRow tableRow, Map map) {
				String[] colNames = this.getColumns();
				int colNum = tableRow.getPhysicalNumberOfCells();
				String cellValueString = null;

				for (int i = 0; i < colNum; i++) {
					cellValueString = this.getCellValueExcel2007(tableRow
							.getCell(i));
					if (cellValueString != null) {
						map.put(colNames[i], cellValueString);
					}
				}
				return map;

			}

			@SuppressWarnings({ "rawtypes", "unchecked" })
			@Override
			protected Map readTableRowExcel2003(HSSFRow tableRow, Map map) {
				String[] colNames = this.getColumns();
				int colNum = tableRow.getPhysicalNumberOfCells();
				String cellValueString = null;

				for (int i = 0; i < colNum; i++) {
					cellValueString = this.getCellValueExcel2003(tableRow
							.getCell(i));
					if (cellValueString != null) {
						map.put(colNames[i], cellValueString);
					}
				}
				return map;

				// //自定义如何读取
				// DecimalFormat df = new DecimalFormat("#");
				// int colNum = tableRow.getPhysicalNumberOfCells();
				// String[] colNames = this.getColumns();
				// map.put(colNames[0],
				// df.format(tableRow.getCell(0).getNumericCellValue()));
				// map.put(colNames[1], tableRow.getCell(1));
				// map.put(colNames[2],
				// df.format(tableRow.getCell(2).getNumericCellValue()));
				// System.out.println(HSSFDateUtil.isCellDateFormatted(tableRow
				// .getCell(3)));
				// Date date = tableRow.getCell(3).getDateCellValue();
				// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
				// String cellvalue = sdf.format(date);
				// map.put(colNames[3], cellvalue);
				// return map;
			}
		};
		List<Map> list = importUtilVerTwo.readExcel(
				"C:\\Users\\lenovo\\Downloads\\userInfo2007.xlsx",
				new String[] { "iphone", "name", "password", "date" });
		System.out.println(list);
	}
}






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值