EasyExcel快速上手
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EasyExcel快速上手相关的知识,希望对你有一定的参考价值。
参考技术A EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。https://github.com/alibaba/easyexcel
https://www.yuque.com/easyexcel
https://alibaba-easyexcel.github.io/
https://mvnrepository.com/artifact/com.alibaba/easyexcel
本地调试功能正常,部署至服务器或Docker容器时失败,异常信息如下
https://github.com/alibaba/easyexcel/issues/157
https://docs.qq.com/doc/DSE1HV2pTbmpTckFQ
服务器环境执行如下命令
容器环境在 dockerfile 文件中添加
项目启动参数追加
EasyExcel与Apache Poi快速掌握
1. 引言
在工作中我经常要使用Excel进行批量导入与导出,只要是有关于Excel表格的都可以用得到poi和EasyExcel下面就详细的介绍下其使用规则。
2. 注意事项
/**
* Excel的写入有分03版和07版
* 区别: 03版写入是先写到缓存,在从缓存写到临时文件 最后写入速度相对快
* 03版最多写入65536行数据,07可以写入无限行数
* 07版是一次性全部写入 速度相对慢
*/
3. 由Excel分析到如何写代码
如图可知,一个完整的Excel组成应该有 1-4部分,那么我们在编写代码的时候也是一样的。
4. 由Excel映射到代码
/**
* 03版的Excel测试
* @throws Exception
*/
public void ExcelWrite03() throws Exception{
//1.创建工作簿
Workbook workbook = new HSSFWorkbook();//HSSFWorkbook为03版的Excel
//2.创建工作页
Sheet sheet = workbook.createSheet("03版测试Excel.xls");
//3.创建行
Row row = sheet.createRow(0);
//4.创建列
Cell cell = row.createCell(0);
//那么这里就可以确定为 第一行的第一列了
//5.设置值
cell.setCellValue("0_0");
//生成Excel
try ( FileOutputStream outputStream = new FileOutputStream(PATH+"03版测试Excel.xls")){
workbook.write(outputStream);
}
}
/**
* 07版的Excel测试
* @throws Exception
*/
public void ExcelWrite07() throws Exception{
//1.创建工作簿
Workbook workbook = new XSSFWorkbook();//HSSFWorkbook为03版的Excel
//2.创建工作页
Sheet sheet = workbook.createSheet("03版测试Excel.xls");
//3.创建行
Row row = sheet.createRow(0);
//4.创建列
Cell cell = row.createCell(0);
//那么这里就可以确定为 第一行的第一列了
//5.设置值
cell.setCellValue("0_0");
//生成Excel
try ( FileOutputStream outputStream = new FileOutputStream(PATH+"03版测试Excel.xlsx")){
workbook.write(outputStream);
}
}
注意事项:03版的Excel最大支持的行数65536超过就会抛出异常
/**
* 03版大数据量的插入
*/
public void ExcelWriteBigData03() throws Exception{
//1.创建工作簿
Workbook workbook = new HSSFWorkbook();//HSSFWorkbook为03版的Excel
//2.创建工作页
Sheet sheet = workbook.createSheet("03版测试Excel.xls");
for(int i=0;i<65536;i++){
Row row = sheet.createRow(i);
for(int j=0;j<10;j++){
Cell cell = row.createCell(j);
cell.setCellValue(j);
}
}
try ( FileOutputStream outputStream = new FileOutputStream(PATH+"03大数据版测试Excel.xls")){
workbook.write(outputStream);
}
}
异常如下
一个完整的Excel输出
/**
* 判断Excel的不同类型,打印出不同类型之后输出
* @throws Exception
*/
@Test
public void ExcelTypeRead() {
try (FileInputStream in = new FileInputStream(PATH + "07大数据版测试Excel.xls");) {
List<String> sheetList = new ArrayList<>();
Workbook workbook=new XSSFWorkbook(in);
Sheet sheet = workbook.getSheetAt(0);
Row rowTitle = sheet.getRow(0);
if(rowTitle!=null) {
//获取当前行下不为空的总列数
int cellCount = rowTitle.getPhysicalNumberOfCells();
for (int i = 0; i < cellCount; i++) {
//获取每一列
Cell cell = rowTitle.getCell(i);
if(null!=cell){
//获取数据类型
CellType cellType = cell.getCellType();
String cellValue = cell.getStringCellValue();
System.out.print(cellValue+"|"+cellType);
}
}
}
//获取总行数
int rowCount = sheet.getPhysicalNumberOfRows();
//第0行为标题行 不摄入统计
for(int row =1;row<rowCount;row++){
Row rowData = sheet.getRow(row);
if(rowData!=null){
int cellCount = rowData.getPhysicalNumberOfCells();
for(int cell =0 ;cell<cellCount;cell++){
Cell cellData = rowData.getCell(cell);
if(cellData!=null){
//获得一个枚举类
CellType cellType = cellData.getCellType();
switch (cellType){
case _NONE:
break;
case BLANK:
break;
case ERROR:
break;
case STRING:
sheetList.add(cellData.getStringCellValue());
break;
case BOOLEAN:
sheetList.add(String.valueOf(cellData.getBooleanCellValue()));
break;
case FORMULA:
//代表是一个Excel公式
sheetList.add(cellData.getCellFormula());
break;
case NUMERIC:
if(DateUtil.isCellDateFormatted(cellData)){
sheetList.add( new DateTime(cellData.getDateCellValue()).toString("yyyy-MM-dd"));
break;
}else{
sheetList.add(String.valueOf(cellData.getNumericCellValue()));
break;
}
}
}
}
}
}
System.out.println("数据"+sheetList);
}catch (Exception e){
e.getMessage();
}
}
EasyExcel的使用
//关键代码
final static String PATH= "D:\\dev_workhome\\studyPoi\\test\\";
/**
* EasyExcel的写操作
*/
public void easyExcelWrite() throws IOException {
ForkJoinPool forkJoinPool = new ForkJoinPool();
ListUtils listUtils = new ListUtils(0,1000);
List<User> listUsers = (List<User>) forkJoinPool.invoke(listUtils);
// EasyExcel.write(PATH+"easyExcelTest.xlsx", User.class).sheet("sheet1").doWrite(listUsers);
//写法二 一般用在重复多次写入一个Excel中
String fileName = PATH+ "easyExcelTest" + System.currentTimeMillis() + ".xlsx";
ExcelWriter excelWriter = EasyExcel.write(fileName, User.class).build();
WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();
for (int i = 0; i <2; i++) {
// 分页去数据库查询数据 这里可以去数据库查询每一页的数据
List<User> data = listUsers;//data() 数据库中查询的数据;
excelWriter.write(data, writeSheet);
}
excelWriter.finish();
}
public void easyExcelRead(){
String fileName = PATH+"easyExcelTest.xlsx";
EasyExcel.read(fileName,User.class,new UserDataListener()).sheet().doRead();
}
以上代码为关键代码,已将完整代码托管到git上
https://github.com/xhyou/poiAndEasyExcel
以上是关于EasyExcel快速上手的主要内容,如果未能解决你的问题,请参考以下文章