突然要用到Excel的读写操作,自己写太过麻烦,在网上找了好久找到个还不错的工具类,怕自己忘掉,分享出来,也留个记录,以后可以直接拿来用。
这个工具类分三个部分:
ExcelUtil.java //工具类
ExcelSheetPO.java //实体对象
ExcelVersion.java //版本枚举
可以把excel数据读取到内存中,转换为 List>,也可以根据List
>转化成excel文件
ExcelUtil.java
package connect.util;
import org.apache.commons.collections.CollectionUtils;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.WorkbookUtil;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.*;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
/**
* excel工具类 提供读取和写入excel的功能
*
*/
public class ExcelUtil {
/**
* 标题样式
*/
private final static String STYLE_HEADER = "header";
/**
* 表头样式
*/
private final static String STYLE_TITLE = "title";
/**
* 数据样式
*/
private final static String STYLE_DATA = "data";
/**
* 存储样式
*/
private static final HashMap cellStyleMap = new HashMap<>();
/**
* 读取excel文件里面的内容 支持日期,数字,字符,函数公式,布尔类型
*
* @param file
* @param rowCount
* @param columnCount
*/
public static List readExcel(File file, Integer rowCount, Integer columnCount)
throws FileNotFoundException, IOException {
// 根据后缀名称判断excel的版本
String extName = file.getName().substring(file.getName().lastIndexOf(".") + 1);
Workbook wb = null;
if (ExcelVersion.V2003.getSuffix().equals(extName)) {
wb = new HSSFWorkbook(new FileInputStream(file));
} else if (ExcelVersion.V2007.getSuffix().equals(extName)) {
wb = new XSSFWorkbook(new FileInputStream(file));
} else {
// 无效后缀名称,这里之能保证excel的后缀名称,不能保证文件类型正确,不过没关系,在创建Workbook的时候会校验文件格式
throw new IllegalArgumentException("Invalid excel version");
}
// 开始读取数据
List sheetPOs = new ArrayList<>();
// 解析sheet
for (int i = 0; i < wb.getNumberOfSheets(); i++) {
Sheet sheet = wb.getSheetAt(i);
List> dataList = new ArrayList<>();
ExcelSheetPO sheetPO = new ExcelSheetPO();
sheetPO.setSheetName(sheet.getSheetName());
sheetPO.setDataList(dataList);
int readRowCount = 0;
if (rowCount == null || rowCount > sheet.getPhysicalNumberOfRows()) {
readRowCount = sheet.getPhysicalNumberOfRows();
} else {
readRowCount = rowCount;
}
// 解析sheet 的行
for (int j = sheet.getFirstRowNum(); j < readRowCount; j++) {
Row row = sheet.getRow(j);
if (row == null) {
continue;
}
if (row.getFirstCellNum() < 0) {
continue;
}
int readColumnCount = 0;
if (columnCount == null || columnCount > row.getLastCellNum()) {
readColumnCount = (int) row.getLastCellNum();
} else {
readColumnCount = columnCount;
}
List
ExcelSheetPO.java
package connect.util;
import java.util.List;
/**
* 定义表格的数据对象
*/
public class ExcelSheetPO {
/**
* sheet的名称
*/
private String sheetName;
/**
* 表格标题
*/
private String title;
/**
* 头部标题集合
*/
private String[] headers;
/**
* 数据集合
*/
private List> dataList;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String[] getHeaders() {
return headers;
}
public void setHeaders(String[] headers) {
this.headers = headers;
}
public List> getDataList() {
return dataList;
}
public void setDataList(List> dataList) {
this.dataList = dataList;
}
public String getSheetName() {
return sheetName;
}
public void setSheetName(String sheetName) {
this.sheetName = sheetName;
}
}
ExcelVersion.java
package connect.util;
/**
* excel版本枚举
*
*/
public enum ExcelVersion {
/**
* 虽然V2007版本支持最大支持1048575 * 16383 ,
* V2003版支持65535*255
* 但是在实际应用中如果使用如此庞大的对象集合会导致内存溢出,
* 因此这里限制最大为10000*100,如果还要加大建议先通过单元测试进行性能测试。
* 1000*100 全部导出预计时间为27s左右
*/
V2003("xls", 10000, 100), V2007("xlsx", 100, 100);
private String suffix;
private int maxRow;
private int maxColumn;
ExcelVersion(String suffix, int maxRow, int maxColumn) {
this.suffix = suffix;
this.maxRow = maxRow;
this.maxColumn = maxColumn;
}
public String getSuffix() {
return this.suffix;
}
public int getMaxRow() {
return maxRow;
}
public void setMaxRow(int maxRow) {
this.maxRow = maxRow;
}
public int getMaxColumn() {
return maxColumn;
}
public void setMaxColumn(int maxColumn) {
this.maxColumn = maxColumn;
}
public void setSuffix(String suffix) {
this.suffix = suffix;
}
}
Test.java
package connect.util;
import connect.service.BaseTest;
import java.io.File;
import java.io.IOException;
import java.util.List;
public class Test extends BaseTest {
@org.junit.Test
public void set() {
String file = "/Users/mac/Desktop/拯救人们2019-01-21 重庆时时彩.xlsx";
File file1 = new File(file);
try {
//传入一个文件,调用readExcel()读取文件,返回List
List list = ExcelUtil.readExcel(file1, null, null);
for (ExcelSheetPO a : list) {
System.out.println(a.getHeaders() + ".." + a.getTitle() + ".." + a.getSheetName());
for (List b : a.getDataList()) {
System.out.println(b);
}
}
//调用createWorkbookAtDisk()生成excel
ExcelUtil.createWorkbookAtDisk(ExcelVersion.V2007, list, "/Users/mac/Desktop/resres.xlsx");
} catch (IOException e) {
e.printStackTrace();
}
}
}
测试结果:
生成Excel成功