excel导出工具java
整个项目的代码结构以下git
com
\---utils
+---demo # 案例相关
| | ExcelExportApplication.java # springboot启动类
| |
| +---bean
| | DemoBean.java # 测试bean
| |
| +---controller
| | ExcelExportController.java # 测试url访问弹出下载excel文件和导出excel到文件
| |
| \---exportParam
| | DemoExportParam.java # 导出参数
| |
| \---dataConversion
| HobbyConversion.java # 爱好属性导出转换类
| SexConversion.java # 性别属性导出转换类
|
\---excelExport # 导出工具包
| AsyncExportExcel.java #多线程导出
| ExportExcel.java # 导出工具类
|
+---data
| BaseParam.java # 基础导出参数类
|
+---dataConversion
| DataExportConversion.java # 属性导出转换接口
|
+---defaultDataHandle # 默认的数据处理
| AbstractDataHandler.java
| BooleanDataHandler.java
| DataHandlerFactory.java
| DateDataHandler.java
| StringDataHandler.java
|
\---style # 默认的样式
AbstractCellStyle.java
DefaultDataCellStyle.java
DefaultTitleCellStyle.java
复制代码
简单的来讲excel导出能够分为几步github
首先实例化ExportExcel工具类,我这里提供了三个构造函数spring
public ExportExcel() public ExportExcel(SXSSFWorkbook workbook) public ExportExcel(SXSSFWorkbook workbook, AbstractCellStyle titleCellStyle, AbstractCellStyle dataCellStyle) 复制代码
一般使用的是无参构造函数。另外两个都须要本身实例化workbook对象,有三个参数的构造函数,须要传入workbook、标题行样式对象、数据行样式对象。关于样式对象下方有说明。springboot
实例化ExportExcel工具类以后,须要调用exportExcel方法,方法定义以下bash
public void exportExcel(String sheetName, BaseParam baseParam, OutputStream out)
复制代码
参数名称 | 参数内容 |
---|---|
sheetName | 工做表(sheet)的名称 |
baseParam | 继承BaseParam的导出参数对象(后面会说明) |
out | OutputStream对象、例如FileOutputStream |
public abstract class AbstractCellStyle {
Workbook workbook;
CellStyle style;
Font font;
public AbstractCellStyle(Workbook workbook) {
this.workbook = workbook;
style = workbook.createCellStyle();
font = workbook.createFont();
}
protected abstract void setStyle();
protected abstract void setFont();
public CellStyle getCellStyle() {
style.setFont(font);
return style;
}
}
复制代码
经过继承样式抽象类AbstractCellStyle,能够实现下方两个方法多线程
// 设置样式
protected abstract void setStyle();
// 设置字体
protected abstract void setFont();
复制代码
经过这两个方法能够修改单元格的样式和字体。app
BaseParam类代码以下ide
public class BaseParam {
public List data = new ArrayList<>();
public List<ColumnParam> columnParams = new ArrayList<>();
//Set Get Constructor
/** * 数据行参数 */
public class ColumnParam{```}
}
复制代码
能够看到BaseParam类有两个属性函数
public List data = new ArrayList<>();
public List<ColumnParam> columnParams = new ArrayList<>();
复制代码
data毫无疑问是存放须要导出的数据,而columnParams是存放每一列的数据,如今来看看内部类ColumnParam
public class ColumnParam{
private String headerName;
private String fieldName;
private DataExportConversion conversion;//数据转换
//Set Get Constructor
}
复制代码
属性名称 | 属性内容 |
---|---|
headerName | 标题名称 |
fieldName | 实体类对应的属性名 |
conversion | 数据转换对象 |
public interface DataExportConversion<T> {
String transferData(T data);
}
复制代码
好比说,获取出来的数据是0、1,而后你须要将数据转换成女、男,那么就能够实现数据转换接口DataExportConversion,自定义转换输出的格式,代码以下
public class SexConversion implements DataExportConversion<Integer> {
@Override
public String transferData(Integer data) {
if (0 == data){
return "女";
} else if (1 == data){
return "男";
}
return "不详";
}
}
复制代码
原始数据以下
姓名 | 性别 | 出生日期 | 爱好(List对象) |
---|---|---|---|
尘心 | 0 | 2018-08-08 14:59:11 | [舞刀,弄枪] |
千月 | 1 | 2018-08-08 14:59:11 | [唱歌,跳舞] |
须要转换为下方内容
姓名 | 性别 | 出生日期 | 爱好 |
---|---|---|---|
尘心 | 女 | 2018-08-08 14:59:11 | 舞刀,弄枪 |
千月 | 男 | 2018-08-08 14:59:11 | 唱歌,跳舞 |
实体类以下
public class DemoBean {
//姓名
private String name;
//性别,0->女,1->男
private Integer sex;
//出生日期
private Date birthday;
//爱好
private List<String> hobbies;
//Set Get
}
复制代码
能够看到有两个属性须要转换,分别是性别和爱好。性别的数据转换上面已经有了,就不贴出来了,下面是爱好的数据转换
public class HobbyConversion implements DataExportConversion<List<String>> {
@Override
public String transferData(List<String> data) {
StringBuilder hobby = new StringBuilder();
for (String s:data){
hobby.append(s).append(",");
}
//移除最后一个逗号
if (hobby.length() >= 1){
hobby.deleteCharAt(hobby.length()-1);
}
return hobby.toString();
}
}
复制代码
数据转换类写好了以后,开始编写导出参数类,代码以下
public class DemoExportParam extends BaseParam {
public DemoExportParam(List<DemoBean> list) {
setData(list);
setColumnParam();
}
private void setColumnParam() {
columnParams.add(new ColumnParam("姓名","name"));
columnParams.add(new ColumnParam("性别","sex", new SexConversion()));
columnParams.add(new ColumnParam("出生日期","birthday"));
columnParams.add(new ColumnParam("爱好","hobbies", new HobbyConversion()));
}
}
复制代码
在实例化DemoExportParam时,须要传入导出的数据,同时设置每一列对应的列参数ColumnParam。
能够看到总共有4个列参数
先写一个生成数据的方法,以下
private List<DemoBean> getDemoBeanList(){
DemoBean man = new DemoBean();
DemoBean woman = new DemoBean();
String[] manHobbys = {"舞刀", "弄枪"};
String[] womanHobbys = {"唱歌", "跳舞"};
man.setName("尘心").setBirthday(new Date()).setSex(0).setHobbies(Arrays.asList(manHobbys));
woman.setName("千月").setBirthday(new Date()).setSex(1).setHobbies(Arrays.asList(womanHobbys));
//将两个bean添加到list中
List<DemoBean> list = new ArrayList<>();
list.add(man);
list.add(woman);
return list;
}
复制代码
接下来有两种数据导出方式,一种是url访问弹出下载excel文件,另一种是导出excel到文件
@ResponseBody
@RequestMapping("/export")
public void exportByWeb(HttpServletResponse response) throws IOException {
OutputStream out = new BufferedOutputStream(response.getOutputStream());
response.reset();
String headStr = "attachment; filename=" + URLEncoder.encode("导出demo.xlsx", "utf-8");
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
response.setHeader("Content-Disposition", headStr);
//得到导出数据
List<DemoBean> list = getDemoBeanList();
DemoExportParam demoExportParam = new DemoExportParam(list);
ExportExcel exportExcel = new ExportExcel();
exportExcel.exportExcel("demo", demoExportParam, response.getOutputStream());
out.flush();
out.close();
}
复制代码
@Test
public void exportByFile() throws IOException {
File file = new File("F:\\导出demo.xlsx");
FileOutputStream out = new FileOutputStream(file);
//得到导出数据
List<DemoBean> list = getDemoBeanList();
DemoExportParam demoExportParam = new DemoExportParam(list);
ExportExcel exportExcel = new ExportExcel();
exportExcel.exportExcel("demo", demoExportParam, out);
out.flush();
out.close();
}
复制代码
项目位置:github.com/rainbowda/u…,有须要的能够去下载。