记录一下学习到的poi导出excel文件方法
文章目录
- 在实际工作中,可能需要对表格进行导出,形成本地excel文件。
- 本章例子中使用的实体类
- 第一步,获取实体类的集合
- 第二步,将实体类集合放入表格中
- 编写response,让网络能够知道下载该excel文件(文件名也在这里确定)
- 设置一张表的内容,并将数据放入
- 完整一点的Controller顺序
在实际工作中,可能需要对表格进行导出,形成本地excel文件。
本章例子中使用的实体类
@Data
public class TrackInfoDto {
private long uid;
private String userName;
private long shopId;
private String shopName;
/**
* 是否私信
*/
private String send;
/**
* 访问页面描述
*/
private String description;
/**
* 操作时间
*/
private Date operateTime;
}
第一步,获取实体类的集合
对于我们生成的表,一个表就是一个实体类。我们先获取到该类的集合。至于获取表格中的哪些数据,则可以通过你自己写的分页方法,来确定你想要获取的数据。
所以如果想要导出指定范围的数据,可以在前端再加上一个条件筛选,将条件传递到后端后,进行实体类集合的获取。
第二步,将实体类集合放入表格中
编写response,让网络能够知道下载该excel文件(文件名也在这里确定)
对于表格的形式,我们要通过response的首部参数来设置,使我们的网络请求可以将其识别为导出为excel。
private void creatResponseWithFileName(HttpServletResponse response,String fileName){
try {
//去除首部空行
response.reset();
//response参数设置
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-disposition", "attachment; filename=" + new String(fileName.getBytes("UTF-8"), "iso8859-1") + ".xls");
response.setHeader("Cache-Control", "no-cache");
response.setCharacterEncoding("UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
设置一张表的内容,并将数据放入
private void exportTrackInfoExcel(List<TrackInfoDto> trackInfoList, HttpServletResponse response) {
//利用输出流,写入excel文件
OutputStream outputStream = null;
BufferedOutputStream bos = null;
try {
outputStream = response.getOutputStream();
bos = new BufferedOutputStream(outputStream);
//HSSFWorkbook,poi工具类提供的操作excel表的方法
HSSFWorkbook wb = new HSSFWorkbook();
//设置当前子表的名称(一张表里可以有很多张子表)
HSSFSheet sheet = wb.createSheet("circleTag");
//设置好<th>
String[] titles = new String[]{"用户名","uid","浏览商家","商家id","页面类型","浏览时间","私信状态"};
int rowNum = 0; //全局表格行数
HSSFRow titleRow = sheet.createRow(rowNum++); //操作表格中的某一行
for (int i = 0; i < titles.length; i++) {
HSSFCell cell = titleRow.createCell(i); //操作表格中的某一行的某一列
cell.setCellValue(titles[i]); //设置列的值
sheet.setColumnWidth(i, 20 * 256);
}
//<th>设置好后,开始向表格中插入数据
//遍历每一行每一列,将实体类的每一个属性,填入对应列。一行一个实体类。
if (trackInfoList != null && trackInfoList.size() > 0) {
for (int i = 0; i < trackInfoList.size(); i++) {
int cellNum = 0; //列值
TrackInfoDto trackInfoDto = trackInfoList.get(i); //具体的实体
try{
HSSFRow row = sheet.createRow(rowNum++); //创建行操作者
HSSFCell cell_1 = row.createCell(cellNum++); //创建该行的第一列操作者
cell_1.setCellValue(trackInfoDto.getUserName()); //第一列设置用户名属性
HSSFCell cell_2 = row.createCell(cellNum++);//创建该行的第二列操作者
cell_2.setCellValue(String.valueOf(trackInfoDto.getUid()));//第二列设置用户id属性
//下面相同,就不重复介绍了
HSSFCell cell_3 = row.createCell(cellNum++);
cell_3.setCellValue(trackInfoDto.getShopName());
HSSFCell cell_4 = row.createCell(cellNum++);
cell_4.setCellValue(String.valueOf(trackInfoDto.getShopId()));
HSSFCell cell_5 = row.createCell(cellNum++);
cell_5.setCellValue(trackInfoDto.getDescription());
HSSFCell cell_6 = row.createCell(cellNum++);
cell_6.setCellValue(DateUtil.dateToString(trackInfoDto.getOperateTime(),DateUtil.DEFAULT_DATETIME_FORMAT_SEC));
HSSFCell cell_7 = row.createCell(cellNum++);
cell_7.setCellValue(trackInfoDto.getSend());
}catch (Exception e){
logger.error("customer_manager_record_export_error:");
}
}
}
wb.write(bos);
bos.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (bos != null) {
bos.close();
}
if (outputStream != null) {
outputStream.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
完整一点的Controller顺序
1.前端发送请求
2.后端接收到
@RequestMapping(value = "/admin/circle/customer/manage/record/excelexport", method = RequestMethod.GET)
public void recordExcelExport(HttpServletRequest request, HttpServletResponse response){
/**设置好数据获取范围**/
/**获取到实体类集合**/
//例如:List<TrackInfoDto> trackInfoList = pageInfo.getItems();
//然后就进入表格操作
String fileName = "" ; //这里自己弄
creatResponseWithFileName(response,fileName);
exportTrackInfoExcel(trackInfoList,response);
}