Excel文件读写工具类

调用示例:

 

		//生成Excel文档
		File excelFile = new File("D:\\temp.xls");

		Map value1Map = new HashMap(); //第一行数据
		value1Map.put("Name"   , "窦海宁");
		value1Map.put("Gender" , "男");

		Map value2Map = new HashMap(); //第二行数据
		value2Map.put("Name"   , "曾艾玉");
		value2Map.put("Gender" , "女");

		List valueList = new ArrayList(); //数据列表
		valueList.add(value1Map);
		valueList.add(value2Map);

		List keyList = new ArrayList(); //行数据键列表
		keyList.add("Name");
		keyList.add("Gender");

		List titleNameList = new ArrayList(); //输出文件字段名列表
		titleNameList.add("姓名");
		titleNameList.add("性别");

		ExcelFileUtil.writeToExcelFile(valueList , keyList, titleNameList, excelFile);

		//读取Excel文档内容
		System.out.println(ExcelFileUtil.readFromExcelFile(excelFile));

		//读取Excel文档中所有内容,以字符串形式返回
		System.out.println(ExcelFileUtil.extractTextFromExcelFile(excelFile , "," , "\n" , "\n\n"));


工具类源码:

 

/**
 * ExcelFileUtil.java
 * Copyright ® 2010 窦海宁
 * All right reserved
 */

package org.aiyu.core.common.util.file;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
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;

/**
 * <p>Excel文件工具类
 * 
 * <p>通用的Excel文件工具类,可用于从Excel文档中抽取或写入信息
 * 
 * @author  窦海宁, chong0660@sina.com
 * @since   AiyuCommonCore-1.0
 * @version AiyuCommonCore-1.0
 */
@SuppressWarnings("unchecked")
public abstract class ExcelFileUtil {

	final public static DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.MEDIUM , DateFormat.MEDIUM);

	/**
	 * <p>从Excel文档中提取文本信息
	 * 
	 * @param  excelFile      Excel文件
	 * @param  cellSeparator  Cell分隔符
	 * @param  rowSeparator   Row分隔符
	 * @param  sheetSeparator Sheet分隔符
	 * 
	 * @return 提取后的文本信息
	 * 
	 * @modify 窦海宁, 2013-07-03
	 */
	public static String extractTextFromExcelFile(File excelFile , String cellSeparator , String rowSeparator , String sheetSeparator) {

		StringBuffer returnValue = new StringBuffer();
		if (excelFile != null && cellSeparator != null && rowSeparator != null && sheetSeparator != null) {

			if (excelFile.isFile()) {

				Iterator sheetIterator = ExcelFileUtil.readFromExcelFile(excelFile).iterator();
				//遍历Sheet
				while (sheetIterator.hasNext()) {

					Iterator rowIterator = ((List) sheetIterator.next()).iterator();
					//遍历Row
					while (rowIterator.hasNext()) {

						Iterator cellIterator = ((Map) rowIterator.next()).values().iterator();
						//遍历Cell
						while (cellIterator.hasNext()) {

							String cellValue = ExcelFileUtil.readCellAsText(cellIterator.next());
							if (cellValue != null) {

								returnValue.append(cellValue);
								//添加Cell分隔符
								if (cellIterator.hasNext()) {

									returnValue.append(cellSeparator);
								}
							}
						}
						//添加Row分隔符
						if (rowIterator.hasNext()) {

							returnValue.append(rowSeparator);
						}
					}
					//添加Sheet分隔符
					if (sheetIterator.hasNext()) {

						returnValue.append(sheetSeparator);
					}
				}
			}
		}
		return StringUtils.trimToNull(returnValue.toString());
	}

	/**
	 * <p>读取Excel文档所有数据,标题行默认为第一行
	 * 
	 * @param  excelFile Excel文件
	 * 
	 * @return Excel文档数据
	 * 
	 * @modify 窦海宁, 2010-11-19
	 */
	public static List readFromExcelFile(File excelFile) {

		return ExcelFileUtil.readFromExcelFile(excelFile , 0 , -1 , 0 , -1 , 0);
	}

	/**
	 * <p>读取Excel文档数据
	 * 
	 * @param  excelFile       Excel文件
	 * @param  startSheetIndex 起始Sheet表索引,第一个Sheet从0开始编号,如传入值小于0,在此方法中会被初始化为0
	 * @param  endSheetIndex   结束Sheet表索引,如传入值大于总Sheet表数,在此方法中会被初始化为总Sheet表数 - 1
	 * @param  startRowIndex   起始行索引,第一行从0开始编号,如传入值小于0,在此方法中会被初始化为0
	 * @param  endRowIndex     结束行索引,如传入值大于总行数,在此方法中会被初始化为总行数 - 1
	 * @param  titleRowIndex   标题行索引
	 * 
	 * @return Excel文档数据
	 * 
	 * @modify 窦海宁, 2013-07-03
	 */
	public static List readFromExcelFile(File excelFile , int startSheetIndex , int endSheetIndex , int startRowIndex , int endRowIndex , int titleRowIndex) {

		List excelList = null;
		if (excelFile != null) {

			if (excelFile.isFile()) {

				FileInputStream fileInputStream = null;
				try {

					fileInputStream = new FileInputStream(excelFile);
					excelList = ExcelFileUtil.readWorkbook(new HSSFWorkbook(fileInputStream) , startSheetIndex , endSheetIndex , startRowIndex , endRowIndex , titleRowIndex);
				} catch (Exception ex) {

					ex.printStackTrace();
				} finally {

					IOUtils.closeQuietly(fileInputStream);
				}
			}
		}
		return excelList;
	}

	/**
	 * <p>读取Excel文件中的工作薄
	 * 
	 * @param  workbook        工作表对象
	 * @param  startSheetIndex 起始Sheet表索引,第一个Sheet从0开始编号,如传入值小于0,在此方法中会被初始化为0
	 * @param  endSheetIndex   结束Sheet表索引,如传入值大于总Sheet表数,在此方法中会被初始化为总Sheet表数 - 1
	 * @param  startRowIndex   起始行索引,第一行从0开始编号,如传入值小于0,在此方法中会被初始化为0
	 * @param  endRowIndex     结束行索引,如传入值大于总行数,在此方法中会被初始化为总行数 - 1
	 * @param  titleRowIndex   标题行索引
	 * 
	 * @return 读取出的工作薄列表
	 * 
	 * @modify 窦海宁, 2013-07-03
	 */
	private static List readWorkbook(HSSFWorkbook workbook , int startSheetIndex , int endSheetIndex , int startRowIndex , int endRowIndex , int titleRowIndex) throws IOException {

		//检查并确保Sheet表起始索引为正常值
		if (startSheetIndex < 0) {

			startSheetIndex = 0;
		}

		if (endSheetIndex < 0) {

			endSheetIndex = workbook.getNumberOfSheets() - 1;
		} else {

			endSheetIndex = endSheetIndex > workbook.getNumberOfSheets() - 1 ? workbook.getNumberOfSheets() - 1 : endSheetIndex;
		}

		//读取Sheet表
		List sheetValueList = null;
		if (workbook != null) {

			sheetValueList = new ArrayList();
			for (int i = startSheetIndex ; i <= endSheetIndex ; i++) {

				sheetValueList.add(ExcelFileUtil.readSheet(workbook.getSheetAt(i) , startRowIndex , endRowIndex , titleRowIndex));
			}
		}
		return sheetValueList;
	}

	/**
	 * <p>读取Sheet表中的数据
	 * 
	 * @param  sheet         Sheet表对象
	 * @param  startRowIndex 起始行索引,第一行从0开始编号,如传入值小于0,在此方法中会被初始化为0
	 * @param  endRowIndex   结束行索引,如传入值大于总行数,在此方法中会被初始化为总行数 - 1
	 * @param  titleRowIndex 标题行索引
	 * 
	 * @return 读取出的行列表
	 * 
	 * @modify 窦海宁, 2013-07-03
	 */
	private static List readSheet(HSSFSheet sheet , int startRowIndex , int endRowIndex , int titleRowIndex) {

		//检查并确保行起始索引为正常值
		if (startRowIndex < 0) {

			startRowIndex = 0;
		}

		if (endRowIndex < 0) {

			endRowIndex = sheet.getLastRowNum();
		} else {

			endRowIndex = endRowIndex > sheet.getLastRowNum() ? endRowIndex : sheet.getLastRowNum();
		}

		//读取行
		List rowValueList = null;
		if (sheet != null) {

			//读取标题行
			List titleKeyList = ExcelFileUtil.readTitleKeyList(sheet , titleRowIndex);

			rowValueList = new ArrayList();
			for (int i = startRowIndex ; i <= endRowIndex ; i++) {

				rowValueList.add(ExcelFileUtil.readRow(sheet.getRow(i) , titleKeyList));
			}
		}
		return rowValueList;
	}

	/**
	 * <p>读取指定的Sheet表中的键名
	 * <p>如在前端使用,建议Excel文件中使用中文名称,便于直接显示
	 * <p>如在后端使用,建议Excel文件中使用英文名称,并与数据库中字段名称一一对应,便于将读取出的数据对象直接应用于数据库
	 * 
	 * @param  sheet         Sheet表对象
	 * @param  titleRowIndex 标题行索引
	 * 
	 * @return 读取出的标题列表
	 * 
	 * @modify 窦海宁, 2013-07-03
	 */
	private static List readTitleKeyList(HSSFSheet sheet , int titleRowIndex) {

		List titleKeyList = null;
		if (sheet != null) {

			HSSFRow row = sheet.getRow(titleRowIndex);

			titleKeyList = new ArrayList();
			for (int i = 0 ; i < row.getLastCellNum() ; i++) {

				Object titleKey = ExcelFileUtil.readCell(row.getCell(i));
				if (titleKey != null) {

					titleKeyList.add(titleKey);
				}
			}
		}
		return titleKeyList;
	}

	/**
	 * <p>读取指定的Sheet表中的一行数据
	 * 
	 * @param  row          Sheet表中的行对象
	 * @param  titleKeyList 标题键列表
	 * 
	 * @return 读取出的Cell值列表
	 * 
	 * @modify 窦海宁, 2013-07-03
	 */
	private static Map readRow(HSSFRow row , List titleKeyList) {

		Map cellValueMap = null;
		if (row != null) {

			cellValueMap = new LinkedHashMap();
			for (int i = 0 ; i < row.getLastCellNum() ; i++) {

				cellValueMap.put(titleKeyList.get(i) , ExcelFileUtil.readCell(row.getCell(i)));
			}
		}
		return cellValueMap;
	}


	/**
	 * <p>读取指定的单元格的数据
	 * 
	 * @param  cell Sheet表中的单元格对象
	 * 
	 * @return 读取出的Cell值
	 * 
	 * @modify 窦海宁, 2008-07-20
	 */
	private static Object readCell(HSSFCell cell) {

		Object cellValue = null;

		if (cell != null) {

			switch (cell.getCellType()) {
			case HSSFCell.CELL_TYPE_BLANK   :

				break;
			case HSSFCell.CELL_TYPE_BOOLEAN :

				cellValue = Boolean.valueOf(cell.getBooleanCellValue());
				break;
			case HSSFCell.CELL_TYPE_FORMULA :

				cellValue = cell.getCellFormula();
				break;
			case HSSFCell.CELL_TYPE_NUMERIC :

				if (HSSFDateUtil.isCellDateFormatted(cell)) {

					cellValue = cell.getDateCellValue();
				} else {

					cellValue = Double.valueOf((cell.getNumericCellValue()));
				}
				break;
			case HSSFCell.CELL_TYPE_STRING  :

				// 取得当前的Cell字符串
				cellValue = cell.getRichStringCellValue().getString();
				break;
			case HSSFCell.CELL_TYPE_ERROR   :

				break;
			}
		}
		return cellValue;
	}

	/**
	 * <p>读取指定的单元格中的文本数据
	 * 
	 * @param  cellValue 单元格数据
	 * 
	 * @return 读取出的文本
	 * 
	 * @modify 窦海宁, 2008-08-10
	 */
	private static String readCellAsText(Object cellValue) {

		String returnValue = null;
		if (cellValue instanceof String) {

			returnValue = (String) cellValue;
		} else if (cellValue instanceof Boolean) {

			returnValue = ((Boolean) cellValue).toString();
		} else if (cellValue instanceof Double) {

			returnValue = ((Double) cellValue).toString();
		} else if (cellValue instanceof Date) {

			if (ExcelFileUtil.dateFormat == null) {

				returnValue = ((Date) cellValue).toString();
			} else {

				returnValue = ExcelFileUtil.dateFormat.format((Date) cellValue);
			}
		}
		return returnValue;
	}

	/**
	 * <p>写入数据到Excel文档
	 * 
	 * @param  valueList     数据列表,由映射行数据的Map组成,Excel列数据的写顺序由keyList中的数据键顺序指定
	 * @param  keyList       数据键列表
	 * @param  titleNameList 标题列表
	 * @param  excelFile     Excel目标文件
	 * 
	 * @modify 窦海宁, 2013-07-03
	 */
	public static void writeToExcelFile(List valueList , List keyList , List titleNameList , File excelFile) {

		if (keyList!= null && titleNameList != null && !keyList.isEmpty() && !titleNameList.isEmpty()) {

			HSSFWorkbook workbook = new HSSFWorkbook();
			HSSFSheet    sheet    = workbook.createSheet();

			//生成标题行
			HSSFRow row = sheet.createRow(0);
			for (int i = 0 ; i < titleNameList.size() ; i++) {

				Object   value = titleNameList.get(i);
				HSSFCell cell  = row.createCell(i);
				cell.setCellType(HSSFCell.CELL_TYPE_STRING);
				cell.setCellValue(value == null ? null : value.toString());
			}

			//生成数据行
			if (valueList != null) {

				for (int i = 0 ; i < valueList.size() ; i++) {

					Map valueMap = (Map) valueList.get(i);

					row = sheet.createRow(i + 1);
					for (int j = 0 ; j < keyList.size() ; j++) {

						Object   value = valueMap.get(keyList.get(j));
						HSSFCell cell  = row.createCell(j);
						cell.setCellType(HSSFCell.CELL_TYPE_STRING);
						cell.setCellValue(value == null ? null : value.toString());
					}
				}
			}

			//写入文档
			FileOutputStream outputStream = null;
			try {

				outputStream = new FileOutputStream(excelFile);
				workbook.write(outputStream);
				outputStream.flush();
				outputStream.close();
			} catch (Exception ex) {

				ex.printStackTrace();
			} finally {

				IOUtils.closeQuietly(outputStream);
			}
		}
	}

}


 

您好,我是窦海宁,现在是一名免费开源工具研发人员,如果您喜欢我的开源代码,如果您希望我更好的发展下去,为您提供更多更好的开源代码……在这里感谢您的捐助。

捐助地址:https://me.alipay.com/chong0660

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值