使用POI读写Excel文件(兼容xls与xlsx版本)

阅读更多

调用示例:

 

//生成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 sheetList = new ArrayList(); //Sheet页列表
sheetList.add(value1Map);
sheetList.add(value2Map);

List excelList = new ArrayList(); //数据列表
excelList.add(sheetList);

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

List sheetColumnKeyList = new ArrayList(); //Sheet行数据键列表
sheetColumnKeyList.add(columnKeyList);

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

List sheetTitleNameList = new ArrayList(); //Sheet输出文件字段名列表
sheetTitleNameList.add(titleNameList);

ExcelFileUtil.writeToExcelFile(excelList , sheetColumnKeyList , sheetTitleNameList , excelFile.getCanonicalPath());

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

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


工具类源码:

 

/**
 * BaseExcelFileUtil.java
 * Copyright ® 2017 窦海宁
 * All right reserved
 */

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

import java.io.IOException;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.aiyu.core.common.util.CollectionUtil;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;

/**
 * 

Excel文件工具基类 * *

通用的Excel文件工具基类,可用于从Excel文档中抽取或写入信息 * * @author 窦海宁, [email protected] * @since AiyuCommonCore-1.0 * @version AiyuCommonCore-1.0 */ public abstract class BaseExcelFileUtil { final protected static DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.MEDIUM , DateFormat.MEDIUM); /** *

读取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 窦海宁, 2017-01-18 */ protected static List readWorkbook(Workbook 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(BaseExcelFileUtil.readSheet(workbook.getSheetAt(i) , startRowIndex , endRowIndex , titleRowIndex)); } } return sheetValueList; } /** *

读取Sheet表中的数据 * * @param sheet Sheet表对象 * @param startRowIndex 起始行索引,第一行从0开始编号,如传入值小于0,在此方法中会被初始化为0 * @param endRowIndex 结束行索引,如传入值大于总行数,在此方法中会被初始化为总行数 - 1 * @param titleRowIndex 标题行索引 * * @return 读取出的行列表 * * @modify 窦海宁, 2017-02-06 */ protected static List readSheet(Sheet 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 = BaseExcelFileUtil.readTitleKeyList(sheet , titleRowIndex); rowValueList = new ArrayList(); for (int i = startRowIndex ; i <= endRowIndex ; i++) { Map rowMap = BaseExcelFileUtil.readRow(sheet.getRow(i) , titleKeyList); if (CollectionUtil.isNotEmpty(rowMap)) { rowValueList.add(rowMap); } } } return rowValueList; } /** *

读取指定的Sheet表中的键名 *

如在前端使用,建议Excel文件中使用中文名称,便于直接显示 *

如在后端使用,建议Excel文件中使用英文名称,并与数据库中字段名称一一对应,便于将读取出的数据对象直接应用于数据库 * * @param sheet Sheet表对象 * @param titleRowIndex 标题行索引 * * @return 读取出的标题列表 * * @modify 窦海宁, 2017-01-18 */ protected static List readTitleKeyList(Sheet sheet , int titleRowIndex) { List titleKeyList = null; if (sheet != null) { Row row = sheet.getRow(titleRowIndex); if (row != null) { titleKeyList = new ArrayList(); for (int i = 0 ; i < row.getLastCellNum() ; i++) { Object titleKey = BaseExcelFileUtil.readCell(row.getCell(i)); if (titleKey != null) { titleKeyList.add(titleKey); } } } } return titleKeyList; } /** *

读取指定的Sheet表中的一行数据 * * @param row Sheet表中的行对象 * @param titleKeyList 标题键列表 * * @return 读取出的Cell值列表 * * @modify 窦海宁, 2017-02-06 */ protected static Map readRow(Row row , List titleKeyList) { Map cellValueMap = null; if (row != null) { cellValueMap = new LinkedHashMap(); for (int i = 0 ; i < titleKeyList.size() ; i++) { if (row.getCell(i) != null) { cellValueMap.put(titleKeyList.get(i) , BaseExcelFileUtil.readCell(row.getCell(i))); } } } return cellValueMap; } /** *

读取指定的单元格的数据 * * @param cell Sheet表中的单元格对象 * * @return 读取出的Cell值 * * @modify 窦海宁, 2017-01-18 */ protected static Object readCell(Cell cell) { Object cellValue = null; if (cell != null) { CellType cellType = cell.getCellTypeEnum(); if (cellType == CellType.BLANK) { } else if (cellType == CellType.BOOLEAN) { cellValue = Boolean.valueOf(cell.getBooleanCellValue()); } else if (cellType == CellType.FORMULA) { cellValue = cell.getCellFormula(); } else if (cellType == CellType.NUMERIC) { if (HSSFDateUtil.isCellDateFormatted(cell)) { cellValue = cell.getDateCellValue(); } else { cellValue = Double.valueOf((cell.getNumericCellValue())); } } else if (cellType == CellType.STRING) { // 取得当前的Cell字符串 cellValue = cell.getRichStringCellValue().getString(); } else if (cellType == CellType.ERROR) { //错误处理 } } return cellValue; } /** *

读取指定的单元格中的文本数据 * * @param cellValue 单元格数据 * * @return 读取出的文本 * * @modify 窦海宁, 2017-01-18 */ protected 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 (BaseExcelFileUtil.dateFormat == null) { returnValue = ((Date) cellValue).toString(); } else { returnValue = BaseExcelFileUtil.dateFormat.format((Date) cellValue); } } return returnValue; } }

 
Excel2003版本工具类:
 
/**
 * Excel2003FileUtil.java
 * Copyright ® 2010 窦海宁
 * All right reserved
 */

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

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.aiyu.core.common.util.CollectionUtil;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
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.ss.usermodel.CellType;

/**
 * 

Excel2003版文件工具类 * *

通用的Excel2003版文件工具类,可用于从Excel文档中抽取或写入信息 * *
ExcelList(数据列表结构): *
ExcelList *
|-- Sheet_1_List *
| |-- Row_1_Map *
| |-- Row_2_Map *
| |-- Row_3_Map *
| |-- Row_N_Map *
|-- Sheet_2_List *
| |-- Row_1_Map *
| |-- Row_N_Map *
|-- Sheet_3_List *
| |-- Row_1_Map *
| |-- Row_2_Map *
| |-- Row_N_Map *
|-- Sheet_N_List *
| |-- Row_N_Map *

*
columnKeyList(数据列键列表结构) *
columnKeyList *
|-- Sheet_1_List *
| |-- Column_Key_1 *
| |-- Column_Key_2 *
| |-- Column_Key_3 *
| |-- Column_Key_N *
|-- Sheet_2_List *
| |-- Column_Key_1 *
| |-- Column_Key_N *
|-- Sheet_3_List *
| |-- Column_Key_1 *
| |-- Column_Key_2 *
| |-- Column_Key_N *
|-- Sheet_N_List *
| |-- Column_Key_N *

*
titleNameList(标题列标题列表数据结构) *
titleNameList *
|-- Sheet_1_List *
| |-- Title_Name_1 *
| |-- Title_Name_2 *
| |-- Title_Name_3 *
| |-- Title_Name_N *
|-- Sheet_2_List *
| |-- Title_Name_1 *
| |-- Title_Name_N *
|-- Sheet_3_List *
| |-- Title_Name_1 *
| |-- Title_Name_2 *
| |-- Title_Name_N *
|-- Sheet_N_List *
| |-- Title_Name_N * * @author 窦海宁, [email protected] * @since AiyuCommonCore-1.0 * @version AiyuCommonCore-1.0 */ public abstract class Excel2003FileUtil extends BaseExcelFileUtil { /** *

从Excel文档中提取文本信息 * * @param excelFile Excel文件 * @param cellSeparator Cell分隔符 * @param rowSeparator Row分隔符 * @param sheetSeparator Sheet分隔符 * * @return 提取后的文本信息 * * @modify 窦海宁, 2013-07-03 */ protected static String extractText(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 = Excel2003FileUtil.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 = Excel2003FileUtil.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()); } /** *

读取Excel文档所有数据,标题行默认为第一行 * * @param excelFile Excel文件 * * @return Excel文档数据 * * @modify 窦海宁, 2010-11-19 */ protected static List readFromExcelFile(File excelFile) { return Excel2003FileUtil.readFromExcelFile(excelFile , 0 , -1 , 1 , -1 , 0); } /** *

读取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 */ protected 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 = Excel2003FileUtil.readWorkbook(new HSSFWorkbook(fileInputStream) , startSheetIndex , endSheetIndex , startRowIndex , endRowIndex , titleRowIndex); } catch (Exception ex) { ex.printStackTrace(); } finally { IOUtils.closeQuietly(fileInputStream); } } } return excelList; } /** *

写入数据到Excel文档 * * @param excelList 数据列表,由映射行数据的Map组成,Excel列数据的写顺序由keyList中的数据键顺序指定 * @param columnKeyList 数据列标题列表 * @param titleNameList 标题列表 * @param saveFilePath Excel文件保存路径 * * @return 目标Excel文件路径,创建失败返回null * * @modify 窦海宁, 2015-05-26 */ protected static boolean writeToExcelFile(List excelList , List columnKeyList , List titleNameList , String saveFilePath) { return Excel2003FileUtil.writeToExcelFile(excelList , null , columnKeyList , titleNameList , saveFilePath); } /** *

写入数据到Excel文档 * * @param excelList 数据列表,由映射行数据的Map组成,Excel列数据的写顺序由keyList中的数据键顺序指定 * @param sheetTitleList 数据页标题列表(可为null) * @param sheetColumnKeyList 数据列键列表 * @param sheetTitleNameList 数据列标题列表 * @param saveFilePath Excel文件保存路径 * * @return 目标Excel文件路径,创建失败返回null * * @modify 窦海宁, 2017-03-20 */ protected static boolean writeToExcelFile(List excelList , List sheetTitleList , List sheetColumnKeyList , List sheetTitleNameList , String saveFilePath) { boolean result = false; if (sheetColumnKeyList!= null && !sheetColumnKeyList.isEmpty()) { HSSFWorkbook workbook = new HSSFWorkbook(); for (int i = 0 ; i < excelList.size() ; i++) { //处理Sheet页 List sheetList = (List) excelList.get(i); List columnKeyList = (List) sheetColumnKeyList.get(i); List titleNameList = (List) sheetTitleNameList.get(i); HSSFSheet sheet = null; if (CollectionUtil.isNotEmpty(sheetTitleList)) { sheet = workbook.createSheet((String) sheetTitleList.get(i)); } else { sheet = workbook.createSheet(); } HSSFRow row = null; int startRowIndex = 0; //生成标题行 if (CollectionUtil.isNotEmpty(titleNameList)) { row = sheet.createRow(startRowIndex++); for (int j = 0 ; j < titleNameList.size() ; j++) { Object value = titleNameList.get(j); HSSFCell cell = row.createCell(j); cell.setCellType(CellType.STRING); cell.setCellValue(value == null ? null : value.toString()); } } //生成数据行 if (sheetList != null) { for (int j = 0 ; j < sheetList.size() ; j++) { Map rowMap = (Map) sheetList.get(j); row = sheet.createRow(j + startRowIndex); for (int k = 0 ; k < columnKeyList.size() ; k++) { Object value = rowMap.get(columnKeyList.get(k)); HSSFCell cell = row.createCell(k); cell.setCellType(CellType.STRING); cell.setCellValue(value == null ? null : value.toString()); } } } } //写入文档 FileOutputStream outputStream = null; try { outputStream = new FileOutputStream(saveFilePath); workbook.write(outputStream); outputStream.flush(); outputStream.close(); result = true; } catch (Exception ex) { ex.printStackTrace(); } finally { IOUtils.closeQuietly(outputStream); } } return result; } }

 
Excel2007版本工具类:
 
/**
 * Excel2007FileUtil.java
 * Copyright ® 2017 窦海宁
 * All right reserved
 */

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

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.aiyu.core.common.util.CollectionUtil;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.CellType;
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;

/**
 * 

Excel2007版文件工具类 * *

通用的Excel2007版文件工具类,可用于从Excel文档中抽取或写入信息 * *
ExcelList(数据列表结构): *
ExcelList *
|-- Sheet_1_List *
| |-- Row_1_Map *
| |-- Row_2_Map *
| |-- Row_3_Map *
| |-- Row_N_Map *
|-- Sheet_2_List *
| |-- Row_1_Map *
| |-- Row_N_Map *
|-- Sheet_3_List *
| |-- Row_1_Map *
| |-- Row_2_Map *
| |-- Row_N_Map *
|-- Sheet_N_List *
| |-- Row_N_Map *

*
columnKeyList(数据列键列表结构) *
columnKeyList *
|-- Sheet_1_List *
| |-- Column_Key_1 *
| |-- Column_Key_2 *
| |-- Column_Key_3 *
| |-- Column_Key_N *
|-- Sheet_2_List *
| |-- Column_Key_1 *
| |-- Column_Key_N *
|-- Sheet_3_List *
| |-- Column_Key_1 *
| |-- Column_Key_2 *
| |-- Column_Key_N *
|-- Sheet_N_List *
| |-- Column_Key_N *

*
titleNameList(标题列标题列表数据结构) *
titleNameList *
|-- Sheet_1_List *
| |-- Title_Name_1 *
| |-- Title_Name_2 *
| |-- Title_Name_3 *
| |-- Title_Name_N *
|-- Sheet_2_List *
| |-- Title_Name_1 *
| |-- Title_Name_N *
|-- Sheet_3_List *
| |-- Title_Name_1 *
| |-- Title_Name_2 *
| |-- Title_Name_N *
|-- Sheet_N_List *
| |-- Title_Name_N * * @author 窦海宁, [email protected] * @since AiyuCommonCore-1.0 * @version AiyuCommonCore-1.0 */ public abstract class Excel2007FileUtil extends BaseExcelFileUtil { /** *

从Excel文档中提取文本信息 * * @param excelFile Excel文件 * @param cellSeparator Cell分隔符 * @param rowSeparator Row分隔符 * @param sheetSeparator Sheet分隔符 * * @return 提取后的文本信息 * * @modify 窦海宁, 2017-01-18 */ protected static String extractText(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 = Excel2007FileUtil.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 = Excel2007FileUtil.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()); } /** *

读取Excel文档所有数据,标题行默认为第一行 * * @param excelFile Excel文件 * * @return Excel文档数据 * * @modify 窦海宁, 2017-01-18 */ protected static List readFromExcelFile(File excelFile) { return Excel2007FileUtil.readFromExcelFile(excelFile , 0 , -1 , 1 , -1 , 0); } /** *

读取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 窦海宁, 2017-01-18 */ protected 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 = Excel2007FileUtil.readWorkbook(new XSSFWorkbook(fileInputStream) , startSheetIndex , endSheetIndex , startRowIndex , endRowIndex , titleRowIndex); } catch (Exception ex) { ex.printStackTrace(); } finally { IOUtils.closeQuietly(fileInputStream); } } } return excelList; } /** *

写入数据到Excel文档 * * @param excelList 数据列表,由映射行数据的Map组成,Excel列数据的写顺序由keyList中的数据键顺序指定 * @param columnKeyList 数据列标题列表 * @param titleNameList 标题列表 * @param saveFilePath Excel文件保存路径 * * @return 目标Excel文件路径,创建失败返回null * * @modify 窦海宁, 2017-01-18 */ protected static boolean writeToExcelFile(List excelList , List columnKeyList , List titleNameList , String saveFilePath) { return Excel2007FileUtil.writeToExcelFile(excelList , null , columnKeyList , titleNameList , saveFilePath); } /** *

写入数据到Excel文档 * * @param excelList 数据列表,由映射行数据的Map组成,Excel列数据的写顺序由keyList中的数据键顺序指定 * @param sheetTitleList 数据页标题列表(可为null) * @param sheetColumnKeyList 数据列键列表 * @param sheetTitleNameList 数据列标题列表 * @param saveFilePath Excel文件保存路径 * * @return 目标Excel文件路径,创建失败返回null * * @modify 窦海宁, 2017-03-20 */ protected static boolean writeToExcelFile(List excelList , List sheetTitleList , List sheetColumnKeyList , List sheetTitleNameList , String saveFilePath) { boolean result = false; if (sheetColumnKeyList!= null && !sheetColumnKeyList.isEmpty()) { XSSFWorkbook workbook = new XSSFWorkbook(); for (int i = 0 ; i < excelList.size() ; i++) { //处理Sheet页 List sheetList = (List) excelList.get(i); List columnKeyList = (List) sheetColumnKeyList.get(i); List titleNameList = (List) sheetTitleNameList.get(i); XSSFSheet sheet = null; if (CollectionUtil.isNotEmpty(sheetTitleList)) { sheet = workbook.createSheet((String) sheetTitleList.get(i)); } else { sheet = workbook.createSheet(); } XSSFRow row = null; int startRowIndex = 0; //生成标题行 if (CollectionUtil.isNotEmpty(titleNameList)) { row = sheet.createRow(startRowIndex++); for (int j = 0 ; j < titleNameList.size() ; j++) { Object value = titleNameList.get(j); XSSFCell cell = row.createCell(j); cell.setCellType(CellType.STRING); cell.setCellValue(value == null ? null : value.toString()); } } //生成数据行 if (sheetList != null) { for (int j = 0 ; j < sheetList.size() ; j++) { Map rowMap = (Map) sheetList.get(j); row = sheet.createRow(j + startRowIndex); for (int k = 0 ; k < columnKeyList.size() ; k++) { Object value = rowMap.get(columnKeyList.get(k)); XSSFCell cell = row.createCell(k); cell.setCellType(CellType.STRING); cell.setCellValue(value == null ? null : value.toString()); } } } } //写入文档 FileOutputStream outputStream = null; try { outputStream = new FileOutputStream(saveFilePath); workbook.write(outputStream); outputStream.flush(); outputStream.close(); result = true; } catch (Exception ex) { ex.printStackTrace(); } finally { IOUtils.closeQuietly(outputStream); } } return result; } }

 
统一调用工具类:
 
/**
 * ExcelFileUtil.java
 * Copyright ® 2017 窦海宁
 * All right reserved
 */

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

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;

/**
 * 

Excel文件工具类 * *

通用的Excel文件工具类,可用于从Excel文档中抽取或写入信息 * *
ExcelList(数据列表结构): *
ExcelList *
|-- Sheet_1_List *
| |-- Row_1_Map *
| |-- Row_2_Map *
| |-- Row_3_Map *
| |-- Row_N_Map *
|-- Sheet_2_List *
| |-- Row_1_Map *
| |-- Row_N_Map *
|-- Sheet_3_List *
| |-- Row_1_Map *
| |-- Row_2_Map *
| |-- Row_N_Map *
|-- Sheet_N_List *
| |-- Row_N_Map *

*
columnKeyList(数据列键列表结构) *
columnKeyList *
|-- Sheet_1_List *
| |-- Column_Key_1 *
| |-- Column_Key_2 *
| |-- Column_Key_3 *
| |-- Column_Key_N *
|-- Sheet_2_List *
| |-- Column_Key_1 *
| |-- Column_Key_N *
|-- Sheet_3_List *
| |-- Column_Key_1 *
| |-- Column_Key_2 *
| |-- Column_Key_N *
|-- Sheet_N_List *
| |-- Column_Key_N *

*
titleNameList(标题列标题列表数据结构) *
titleNameList *
|-- Sheet_1_List *
| |-- Title_Name_1 *
| |-- Title_Name_2 *
| |-- Title_Name_3 *
| |-- Title_Name_N *
|-- Sheet_2_List *
| |-- Title_Name_1 *
| |-- Title_Name_N *
|-- Sheet_3_List *
| |-- Title_Name_1 *
| |-- Title_Name_2 *
| |-- Title_Name_N *
|-- Sheet_N_List *
| |-- Title_Name_N * * @author 窦海宁, [email protected] * @since AiyuCommonCore-1.0 * @version AiyuCommonCore-1.0 */ public abstract class ExcelFileUtil extends BaseExcelFileUtil { /** *

从Excel文档中提取文本信息 * * @param excelFile Excel文件 * @param cellSeparator Cell分隔符 * @param rowSeparator Row分隔符 * @param sheetSeparator Sheet分隔符 * * @return 提取后的文本信息 * * @modify 窦海宁, 2017-02-06 */ public static String extractText(File excelFile , String cellSeparator , String rowSeparator , String sheetSeparator) { String resultText = null; if (excelFile != null && excelFile.exists()) { String extension = FilenameUtils.getExtension(excelFile.getName()); if (StringUtils.equalsIgnoreCase("xls" , extension)) { //Office2003版文件处理 resultText = Excel2003FileUtil.extractText(excelFile , cellSeparator , rowSeparator , sheetSeparator); } else if (StringUtils.equalsIgnoreCase("xlsx" , extension)) { //Office2007版文件处理 resultText = Excel2007FileUtil.extractText(excelFile , cellSeparator , rowSeparator , sheetSeparator); } else { //文件类型有误 } } return resultText; } /** *

读取Excel文档所有数据,标题行默认为第一行 * * @param excelFile Excel文件 * * @return Excel文档数据 * * @modify 窦海宁, 2017-02-06 */ public static List readFromExcelFile(File excelFile) { return ExcelFileUtil.readFromExcelFile(excelFile , 0 , -1 , 1 , -1 , 0); } /** *

读取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 窦海宁, 2017-02-06 */ public static List readFromExcelFile(File excelFile , int startSheetIndex , int endSheetIndex , int startRowIndex , int endRowIndex , int titleRowIndex) { List excelList = null; if (excelFile != null && excelFile.exists()) { String extension = FilenameUtils.getExtension(excelFile.getName()); if (StringUtils.equalsIgnoreCase("xls" , extension)) { //Office2003版文件处理 excelList = Excel2003FileUtil.readFromExcelFile(excelFile , startSheetIndex , endSheetIndex , startRowIndex , endRowIndex , titleRowIndex); } else if (StringUtils.equalsIgnoreCase("xlsx" , extension)) { //Office2007版文件处理 excelList = Excel2007FileUtil.readFromExcelFile(excelFile , startSheetIndex , endSheetIndex , startRowIndex , endRowIndex , titleRowIndex); } else { //文件类型有误 } } return excelList; } /** *

写入数据到Excel文档 * * @param excelList 数据列表,由映射行数据的Map组成,Excel列数据的写顺序由keyList中的数据键顺序指定 * @param sheetColumnKeyList 数据列标题列表 * @param sheetTitleNameList 标题列表 * @param saveFilePath Excel文件保存路径 * * @return 目标Excel文件路径,创建失败返回null * * @modify 窦海宁, 2017-02-06 */ public static boolean writeToExcelFile(List excelList , List sheetColumnKeyList , List sheetTitleNameList , String saveFilePath) { return ExcelFileUtil.writeToExcelFile(excelList , null , sheetColumnKeyList , sheetTitleNameList , saveFilePath); } /** *

写入数据到Excel文档 * * @param excelList 数据列表,由映射行数据的Map组成,Excel列数据的写顺序由keyList中的数据键顺序指定 * @param sheetTitleList 数据页标题列表(可为null) * @param sheetColumnKeyList 数据列键列表 * @param sheetTitleNameList 数据列标题列表 * @param saveFilePath Excel文件保存路径 * * @return 目标Excel文件路径,创建失败返回null * * @modify 窦海宁, 2017-02-06 */ public static boolean writeToExcelFile(List excelList , List sheetTitleList , List sheetColumnKeyList , List sheetTitleNameList , String saveFilePath) { boolean result = false; if (StringUtils.isNotBlank(saveFilePath)) { String extension = FilenameUtils.getExtension(saveFilePath); if (StringUtils.equalsIgnoreCase("xls" , extension)) { //Office2003版文件处理 result = Excel2003FileUtil.writeToExcelFile(excelList , sheetTitleList , sheetColumnKeyList , sheetTitleNameList , saveFilePath); } else if (StringUtils.equalsIgnoreCase("xlsx" , extension)) { //Office2007版文件处理 result = Excel2007FileUtil.writeToExcelFile(excelList , sheetTitleList , sheetColumnKeyList , sheetTitleNameList , saveFilePath); } else { //文件类型有误 } } return result; } }

 
统一调用工具类通过文件扩展名(XLS与XLSX,不区分大小写)判断文件版本,暂时没有想到更好的办法;本工具类使用POI_3.15实现,无须目标机器安装OFFICE软件也可进行文件读写。
  • ExcelFileUtil.rar (8.6 KB)
  • 下载次数: 3

你可能感兴趣的:(java,office,excel,poi)