第一步导包:
maven仓库:https://mvnrepository.com/artifact/org.apache.poi/poi/3.17
maven方式:
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
gradle方式:
// https://mvnrepository.com/artifact/org.apache.poi/poi
compile group: 'org.apache.poi', name: 'poi', version: '3.17'
首先我们要构造一个excel表结构:由于很多其他的博文会给excel表的字体、样式下功夫.导致小白会觉得有点画蛇添足,我们先考虑完成导出excel表这个需求才能考虑继续深造。
构造一个表从两方面考虑,一方面是结构,一方面是数据。
下面这个工具栏提供的方法很简单,就是传入一个excel表名,excel每一列的列名,一个数据集,以及在数据集中每个字段映射的key,其实也可以不用传这个key,但是为了表结构更加清晰,以及更容易获取数据,我们传多一个key数组。
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import java.util.List;
import java.util.Map;
/**
* 生成Excel文件的工具类
* @author weiyuwang
*/
public class ExcelUtil {
/**
* 创建excel文档,
* @param excelName excel的表名
* @param list 数据,相当于每一行,而map的key代表了单元格的字段,value则是值
* @param keys list中map的key数组集合
* @param columnNames excel的列名
* */
public static Workbook createWorkBook(String excelName,List<Map<String, Object>> list, String[] keys, String[] columnNames) {
// 创建excel工作簿
HSSFWorkbook wb = new HSSFWorkbook();
// 创建第一个sheet(页),并命名
Sheet sheet = wb.createSheet(excelName);
// 创建第一行
Row firstRow = sheet.createRow(0);
//设置列名
for(int i=0;i<columnNames.length;i++){
Cell cell = firstRow.createCell(i);
cell.setCellValue(columnNames[i]);
}
//设置每行每列的值
for (int i = 0; i < list.size(); i++) {
// Row 行,Cell 方格 , Row从1开始,因为第一行用来存放了列名,cell从0开始
// 创建一行,在页sheet上
Row row = sheet.createRow( i+1);
// 在row行上创建一个方格
for(int j=0;j<keys.length;j++){
Cell cell = row.createCell(j);
cell.setCellValue(list.get(i).get(keys[j]) == null?" ": list.get(i).get(keys[j]).toString());
}
}
return wb;
}
}
接下来是controller
,这里一开始我用的是post方法,但是这种方法本地不知道怎么测试,后来我改成了get方法,将post方法注释了。
其实表结构确定了,接下来主要是数据的封装。也就是要构建一个List<Map<String, Object>> datas
,由于每个人要封装的数据不一样,这里就不对mapper,entity
再做叙述。
其实我个菜鸡一直不知道原来这里也可以用response的,所以看了很多相关博文都不知道怎么下手,然后走投无路尝试了一下发现可以用hhh。这里我点一下,避免一些和我一样在努力学习但是还是比较菜的小伙伴不知道。
/**
* export excel
*/
@RequestMapping(value = "/export")
// public void export(@RequestBody GoalExportEntity request,HttpServletResponse response) {
public void export(HttpServletResponse response) {
String excelName = "公司指标";
String[] columnName = new String[]{"考核对象","总计","1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"};
String[] keys = new String[]{"name","total","1","2","3","4","5","6","7","8","9","10","11","12"};
try{
//设置excel表的数据:
List<Map<String, Object>> datas = new ArrayList<>();
// List<GoalSettingEntity> list = goalMapper.findByIdAndYearCombine(request.getGoalId(), request.getYear());
List<GoalSettingEntity> list = goalMapper.findByIdAndYearCombine(13, 2018);
for (GoalSettingEntity entity : list) {
Map<String, Object> map = JsonUtil.toObjectMap((entity.getGoalInfo()));
Integer total = 0;
for (Object s : map.values()) {
total += (Integer)s;
}
map.put("total", total.toString());
map.put("name",entity.getName());
datas.add(map);
}
Workbook workBook = ExcelUtil.createWorkBook(excelName, datas, keys, columnName);
response.setHeader("content-Type", "application/vnd.ms-excel");
response.setHeader("Content-disposition", "attachment;filename=createList.xls");//默认Excel名称
response.flushBuffer();
ServletOutputStream outputStream = response.getOutputStream();
workBook.write(outputStream);
workBook.close();
outputStream.close();
} catch (Exception e){
e.printStackTrace();
}
}