调用示例:
?
class="java"> //生成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