第一步:Maven导入Excel poi依赖
没有maven可以自行下载poi包导入
<!--导入excel依赖包poi-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.10-FINAL</version>
</dependency>
第二步:创建ExcelExport工具类
关于Excel表格的格式可以自己搜索HSSFSheet等格式参数,自行设置
import org.apache.poi.hssf.usermodel.*;
import sun.misc.BASE64Encoder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;
/**
* 工具类:将数据导出为excel表
*/
public class ExcelUtil {
/**
* @param sheetName 工作表的名字
* @param column 列名
* @param data 需要导出的数据 ( map的键定义为列的名字 一定要和column中的列明保持一致 )
* @param response
*/
public static void exportExcel(String sheetName, List<String> column, List<Map<String,Object>> data, HttpServletRequest request, HttpServletResponse response){
//创建工作薄
HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
//创建sheet
HSSFSheet sheet = hssfWorkbook.createSheet(sheetName);
//创建一个居中格式
HSSFCellStyle style = hssfWorkbook.createCellStyle();
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//创建表头,设置表头居中,单元格宽度自适应,在此基础上把宽度调至1.5倍
HSSFRow headRow = sheet.createRow(0);
HSSFCell cell = null;
for (int i = 0; i < column.size(); i++){
cell = headRow.createCell(i);
cell.setCellValue(column.get(i));
cell.setCellStyle(style);
sheet.autoSizeColumn(i, true);
//调整列的宽度
sheet.setColumnWidth(i, sheet.getColumnWidth(i) * 30 / 10);
}
//添加单元格数据
for (int i = 0; i < data.size(); i++) {
HSSFRow dataRow = sheet.createRow(sheet.getLastRowNum() + 1);
for (int x = 0; x < column.size(); x++) {
dataRow.createCell(x).setCellValue(data.get(i).get(column.get(x))==null?"":data.get(i).get(column.get(x)).toString());
}
}
response.setContentType("application/vnd.ms-excel");
try {
//获取浏览器名称
String agent=request.getHeader("user-agent");
String filename=sheetName+".xls";
//不同浏览器需要对文件名做特殊处理
if (agent.contains("Firefox")) { // 火狐浏览器
filename = "=?UTF-8?B?"
+ new BASE64Encoder().encode(filename.getBytes("utf-8"))
+ "?=";
filename = filename.replaceAll("\r\n", "");
} else { // IE及其他浏览器
filename = URLEncoder.encode(filename, "utf-8");
filename = filename.replace("+"," ");
}
//推送浏览器,弹出下载提示
response.setHeader("Content-Disposition","attachment;filename="+filename);
hssfWorkbook.write(response.getOutputStream());
} catch (Exception e) {
e.printStackTrace();
}
}
}
第三步:测试
使用的是SpringBoot,通过@ResponseBody传到前端,弹出下载界面
@Controller
public class ExcelController {
@Autowired
private UserMapper userMapper;
@RequestMapping("/user/download")
@ResponseBody
public void export(HttpServletRequest request, HttpServletResponse response) {
//查询数据库中需要导出的数据
List<User> userList = userMapper.selectList(null);
//创建excel表头
List<String> column = new ArrayList<>();
column.add("序号");
column.add("姓名");
column.add("年龄");
column.add("邮箱");
//表头对应的数据
List<Map<String, Object>> data = new ArrayList<>();
//遍历获取到的需要导出的数据,k要和表头一样
for (int i = 0; i < userList.size(); i++) {
Map<String, Object> dataMap = new HashMap<>();
User user = userList.get(i);
dataMap.put("序号", user.getId());
dataMap.put("姓名", user.getName());
dataMap.put("年龄", user.getAge());
dataMap.put("邮箱", user.getEmail());
data.add(dataMap);
}
//调用导出工具类
ExcelUtil.exportExcel("工作人员表", column, data, request, response);
}
}
发送 localhost:8080/user/download请求后,自动就会弹出下方的下载窗口
(不会使用SpringBoot的会可以自行创建函数来测试使用)