java Excel工具类,导入导出Excel数据,导入数据对合并表格有判断获取数据;
导出数据到Excel,Excel文件不存在会创建。
使用的是poi处理,兼容Excel。
对反射不够理解,目前先用map处理,后续想好了,再处理。
代码:
package com.gx.excel;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
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.ss.usermodel.WorkbookFactory;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/**
* @ClassName: ExcelUtilDeal
* @Description: Excel工具类,导入导出Excel数据
* @author zhoujie
* @date 2018年7月21日 上午11:08:13
* @version V1.0
*/
public class ExcelUtilDeal {
public static void main(String[] args) {
//获取Excel文件数据
/*List> list = getExcelData("用户表1.xls", "用户表");
System.out.println("listsize:"+list.size());
for(Map map : list){
for (Object key : map.keySet()) {
System.out.println(key + " :" + map.get(key));
}
} */
//数据导出到Excel
List> list = new ArrayList<>();
String[] headers = {"用户名","密码","邮箱","性别","年龄"};
for (int i = 0; i < 2; i++) {
Map map = new HashMap<>();
for (int j = 0; j < headers.length; j++) {
map.put(headers[j], i+""+j+"");
}
list.add(map);
}
fillExcelData(list, "用户表1.xls", "用户表", headers);
}
/**
* 数据导出到Excel,单个Excel
* @param list 数据
* @param excelFile Excel文件:用户表.xlsx
* @param headers 行头标题字符串数组
* @param sheetname Excel的sheet名称
* @return int 导出数量
* @throws Exception
*/
public static int fillExcelData(List> list, String excelFile, String sheetname, String[] headers) {
// 无Excel文件先创建Excel文件,再读取Excel文件
String cpath = ExcelUtilDeal.class.getClassLoader().getResource("").getPath();
String rootPath = cpath.substring(0, cpath.indexOf("/WEB-INF/"));
File dirfile = new File(rootPath+"\\excel\\"); //判断文件夹是否存在
if(!dirfile.exists()){
dirfile.mkdirs(); //创建文件夹
}
String path = rootPath+"\\excel\\"+excelFile;
File file = new File(path);
FileOutputStream out = null;
FileInputStream fileinp = null;
Workbook wb = null;
try {
if(!file.exists()){ //判断文件是否存在
createExcel(path, sheetname, headers); //创建Excel文件
}
fileinp = new FileInputStream(file);
wb = WorkbookFactory.create(fileinp); //兼容模式打开Excel
Sheet sheet = wb.getSheet(sheetname); //获取sheet
Row row = null; //行
if(sheet == null){
sheet = wb.createSheet(sheetname); //创建sheet
row = sheet.createRow(0); //首行
// 先填充行头
for (int i = 0; i < headers.length; i++) {
row.createCell(i).setCellValue(headers[i]);
}
}
// 再填充数据
int rowIndex = 1;
Iterator> iterator = list.iterator();
while (iterator.hasNext()) {
row = sheet.createRow(rowIndex++);
Map map = iterator.next(); //获取对象
setRowCellValue(map, headers, row); //设置值
}
out = new FileOutputStream(path);
wb.write(out);
System.out.println("数据导出到Excel文件");
return rowIndex;
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
wb.close();
fileinp.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return 0;
}
/**
* 设置Excel一行数据
* @param map 数据集合
* @param row Excel行
* @throws NoSuchMethodException
* @throws IllegalAccessException
* @throws IllegalArgumentException
* @throws InvocationTargetException
*/
public static void setRowCellValue(Map map, String[] headers, Row row) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Object value = null;
for (int i = 0; i < headers.length; i++) {
value = map.get(headers[i]);
if(value instanceof Double){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
value = sdf.format(value).toString();
}else if(value instanceof Boolean){
if((boolean) value){
value = "是";
}else{
value = "否";
}
}
row.createCell(i).setCellValue(value.toString()); //单元格值设置
}
}
/**
* 获取Excel文件数据
* 填充数据到excel文件
* @param excelFile Excel文件名称
* @return int 导入数量
* @throws Exception
*/
public static List> getExcelData(String excelFile, String sheetname) {
List> list = new ArrayList<>();
// 本地磁盘读取excel文件,然后读取sheet,再读取所有数据,循环sheet
FileInputStream fileinp = null;
Workbook wb = null;
try {
String cpath = ExcelUtilDeal.class.getClassLoader().getResource("").getPath();
String rootPath = cpath.substring(0, cpath.indexOf("/WEB-INF/"));
String path = rootPath+"\\excel\\"+excelFile;
File file = new File(path);
if(!file.exists()){
file.mkdirs();
}
fileinp = new FileInputStream(file);
wb = WorkbookFactory.create(fileinp); //兼容模式打开Excel
Sheet sheet = wb.getSheet(sheetname); //获取对应sheet
Row firstrow = sheet.getRow(0); //获取首行数据即标题;
int rows = sheet.getPhysicalNumberOfRows(); //获取sheet表格数据行数
int cells = firstrow.getPhysicalNumberOfCells();//获取表头单元格个数
String[] headers = new String[cells]; //行头
for (int i = 0; i < cells; i++) {
Cell firstrowCell = firstrow.getCell(i);
headers[i] = firstrowCell.getStringCellValue();
}
Row row; //初始化行
Cell cell; //初始化单元格
for (int i = 1; i < rows; i++) {
row = sheet.getRow(i); //从第二行开始读数据
Map map = new HashMap<>();
for (int j = 0; j < cells; j++) {
if(isMergedRegion(sheet, i, j)){ //判断是否是合并单元格
System.out.println("发现合并单元格");
cell = getMergedCell(sheet, row, j); //获取合并单元格
}else{
cell = row.getCell(j);
}
Object value = formatCellData(cell); //获取格式化单元格值
map.put(headers[j], value);
}
list.add(map);
}
System.out.println("获取Excel文件数据");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
wb.close();
fileinp.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return list;
}
/**
* 创建新excel.
* @param fileDir excel的路径
* @param sheetName 要创建的表格索引
* @param headers excel的第一行即表格头
*/
public static void createExcel(String fileDir,String sheetName,String headers[]) {
//创建workbook
Workbook workbook = null;
try{
workbook = new HSSFWorkbook();
}catch(Exception e){
workbook = new XSSFWorkbook();
}
//添加Worksheet(不添加sheet时生成的xlsx文件打开时会报错)
workbook.createSheet(sheetName);
//输出流
FileOutputStream out = null;
try {
//添加表头
Row row = workbook.getSheet(sheetName).createRow(0); //sheet创建第一行
for(short i = 0;i < headers.length;i++){
row.createCell(i).setCellValue(headers[i]);
}
out = new FileOutputStream(fileDir); //创建文件
workbook.write(out); //写入sheet
System.out.println("创建Excel");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
workbook.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 返回格式化各类型单元格值
* @param cell 单元格
* @return Object 返回值
*/
@SuppressWarnings("deprecation")
public static Object formatCellData(Cell cell) {
if (cell == null) {
return "";
}
switch (cell.getCellType()) {
case Cell.CELL_TYPE_NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) { // 日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(DateUtil.getJavaDate(cell.getNumericCellValue())).toString();
}
return cell.getNumericCellValue(); // 数字
case Cell.CELL_TYPE_STRING: // 字符串
return cell.getStringCellValue();
case Cell.CELL_TYPE_FORMULA: // 公式
return cell.getCellFormula();
case Cell.CELL_TYPE_BLANK: // 空白
return "";
case Cell.CELL_TYPE_BOOLEAN: // 布尔取值
return cell.getBooleanCellValue();
case Cell.CELL_TYPE_ERROR: // 错误类型
return cell.getErrorCellValue();
}
return "";
}
/**
* 判断是否合并单元格
* 先获取所有合并单元格,通过传入行列索引判断是否在合并单元格内
* @param sheet
* @param row
* @param column
* @return
*/
public static boolean isMergedRegion(Sheet sheet, int row, int column) {
int sheetMergeCount = sheet.getNumMergedRegions();
for (int i = 0; i < sheetMergeCount; i++) {
CellRangeAddress range = sheet.getMergedRegion(i); //循环获取所有合并单元格
int firstColumn = range.getFirstColumn();
int lastColumn = range.getLastColumn();
int firstRow = range.getFirstRow();
int lastRow = range.getLastRow();
if (row >= firstRow && row <= lastRow) { //判断是否在合并单元格中
if (column >= firstColumn && column <= lastColumn) {
return true;
}
}
}
return false;
}
/**
* 获取合并单元格有值单元格
* 合并单元格值保存在第一个合并单元格内
* @param sheet
* @param row
* @param column
* @return
*/
public static Cell getMergedCell(Sheet sheet, Row row, int column) {
int sheetMergeCount = sheet.getNumMergedRegions();
Cell fCell = null;
int rowIndex = row.getRowNum();
for (int i = 0; i < sheetMergeCount; i++) {
CellRangeAddress ca = sheet.getMergedRegion(i);
int firstColumn = ca.getFirstColumn();
int lastColumn = ca.getLastColumn();
int firstRow = ca.getFirstRow();
int lastRow = ca.getLastRow();
if (rowIndex >= firstRow && rowIndex <= lastRow) {
if (column >= firstColumn && column <= lastColumn) {
Row fRow = sheet.getRow(firstRow);
fCell = fRow.getCell(firstColumn);
}
}
}
if (fCell == null) {
fCell = row.getCell(column);
}
return fCell;
}
/**
* 截取文件后缀
* @param path
* @return String 返回类型
*/
public static String getSuffix(String path) {
String substring = path.substring(path.lastIndexOf(".") + 1);
return substring;
}
}
说明:Excel文件导出在根目录下的excel目录。