一、前言
最近在做数据平台的系统设计与开发,里面有功能需要将界面数据导出到excel上,新来的开发同事对导入excel不熟悉,在网上找了半圈,都是JXL、POI、Easyexcel等excel操作工具类,对于jxl、poi,相信很多资深的小伙伴可能都比较熟悉,这2个是比较旧的一批excel,word,pdf操作的工具类,但是它们的api及语法都比较复杂,有些对中文的处理方式也不是很友好。
而Easyexcel正是为了解决jxl/poi不好用/难用的问题而产生的,它是阿里出品的,从API及代码对接上都作了很多精简,是一个比较不错的选择。Easyexcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。他能让你在不用考虑性能、内存的等因素的情况下,快速完成Excel的读、写等功能。
那么,还有没有其他excel操作的框架呢?能比较快速的实现导入导出呢。
二、alanpoi
经过一番的查找,发现一个叫alanpoi的excel操作框架,实现excel的导出更加简单便捷,于是赶紧在项目中使用。
项目中使用:
<dependency>
<groupId>com.alanpoi</groupId>
<artifactId>alanpoi-analysis</artifactId>
<version>1.3.0</version>
</dependency>
简单一句话:一配置一继承一调用
三、怎么使用alanpoi实现导入?
1、 配置
在项目resources目录中新建excel-config.xml文件,cosume中配置自己的消费类路径,继承ExcelConsumeInterface接口,sheet中的vo是把当前sheet序列化的对象路径,column中当然就是配置vo中的属性了。
其中name可选字段,填了就是按照这个匹配excel列名,不填就是按照offset顺序;导入包含多个sheet就配置多个
<?xml version = "1.0" encoding = "GB2312"?>
<exg name="excelId" version="1.0" file-type="excel">
<excel id="ACCOUNT" consume="com.xxx.FinAccountImportHandler">
<sheet index="0" row-start="1" column-start="0"
vo="com.xxx.vo.FinAccountImportVO">
<column name="公司/供应商编号" offset="1">companyCode</column>
<column name="公司/供应商名称" offset="2">companyName</column>
<column name="银行账号" offset="3">bankAccount</column>
<column name="开户银行" offset="4">bankName</column>
</sheet>
</excel>
</exg>
2、 代码编写
想要扩展自己的excel实现,需要继承ExcelConsumeInterface接口,实现方法以下的方法:
/**
* when error will 调用
*
* @param excelError
*/
void error(ExcelError excelError);
/**
* custom valid data
*
* @param workbookId
* @param sheetDataList
*/
void validData(String workbookId, List<ExcelSheetData> sheetDataList, Map<Serializable, Object> excelParam);
/**
* @param sheetDataList return success data
*/
void end(List<ExcelSheetData> sheetDataList, Map<Serializable, Object> excelParam);
4、怎么调用?
在需要导入的代码中,调用ExcelExportUtil类的customImportData即可,参数excelId就是excel-conifg.xml中配置的id
四、如何导出呢?
在代码中,如果能够用一行代码实现绝不用第二行,如果一行不行,那就再加一行!哈哈
1、导出API介绍
注解模式导出:
- ExcelSheet注解: 用于导入类上,可制定sheet名,列头的颜色、字体、高度、宽度
- ExcelColum注解: 用于导入类的属性上,可指定列头的名称,单元格的样式
- DateFormat注解: 用于导入类的属性上, 可以按照指定格式输出到excel,默认"yyyy/MM/dd"
- NumFormat注解: 用于导入类的属性上,可以按照指定格式输出到excel,默认"00.00"
- 样例:
@ExcelSheet(name = "测试", backColor = AlanColors.GREEN, font = "宋体", fontSize = 25)
@Data
public class ExportVO {
@ExcelColumn(name = "名称", width = 32, link = "${url}")
private String name;
@ExcelColumn(name = "值")
private String value;
@ExcelColumn(name = "金额")
@NumFormat(value = "0000.00##")
private BigDecimal amount;
@ExcelColumn(name = "时间格式化")
@DateFormat(value = "yyyy-MM-dd hh:mm:ss")
private Date dateTime;
@DateFormat
@ExcelColumn(name = "日期格式化")
private java.sql.Date date;
@ExcelColumn(isExist = false)
private String url;
}
2、 输出的方式
- 方式一. 直接导出到浏览器
ExcelExportUtil.export(Colletion<?>,Class,HttpServletRequest,HttpServletResponse,fileName);
- 方式二. 调用getWorkbook获取工作表,自行处理workbook
ExcelExportUtil.getWorkbook(Collection<?> singleSheetData, Class<?> c)
3、 高级用法介绍
- 示例一:导出指定列(动态导出列)
List<ExportVO> list = new ArrayList<>();
for (int i = 0; i < 500; i++) {
ExportVO exportVO = new ExportVO();
exportVO.setName("name" + i);
exportVO.setValue(new BigDecimal(123.11 + i * 0.09));
exportVO.setAmount(new BigDecimal(6666.666 + i * 10));
exportVO.setDate(new Date(132324343 + i * 100));
exportVO.setDateTime(new java.util.Date());
list.add(exportVO);
}
List<String> colList = new ArrayList<>();
//按照顺序仅导出add的列
colList.add("name");
colList.add("value");
//调用获取workbook对象;也可以直接调用exportSpecifyCol方法导出到浏览器W
orkbook workbook = ExcelExportUtil.getWorkbookSpecifyCol(list, ExportVO.class, colList);
- 示例二:多sheet页签导出
List<ExportVO> list = new ArrayList<>();
List<Export2VO> list2 = new ArrayList<>();
for (int i = 0; i < 500; i++) {
ExportVO exportVO = new ExportVO();
exportVO.setName("name" + i);
exportVO.setValue(new BigDecimal(123.11 + i * 0.09));
exportVO.setAmount(new BigDecimal(6666.666 + i * 10));
exportVO.setDate(new Date(132324343 + i * 100));
exportVO.setDateTime(new java.util.Date());
list.add(exportVO);
Export2VO export2VO = new Export2VO();
export2VO.setName("name" + i);
export2VO.setValue("value" + i);
export2VO.setAmount(new BigDecimal(6666.666 + i * 10));
export2VO.setDate(new Date(132324343 + i * 100));
export2VO.setDateTime(new java.util.Date());
list2.add(export2VO);
}
Map<Class<?>, Collection<?>> map = new HashMap<>();
map.put(ExportVO.class, list);
map.put(Export2VO.class, list2);
//调用获取workbook对象;也可以直接调用exportByMultiSheet方法导出到浏览器
Workbook workbook = ExcelExportUtil.getWorkbookByMultiSheet(map);
地址: