导出excel文件在工作中还是比较常见的的,能够实现的方式有很多
看客:博主有没有最最最简单的方式呢
我:有啊,用真心就可以
来看看我们怎么用真心实现,这里介绍使用POI依赖的HSSF组件实现导出excel文件,为什么介绍这种方式呢,,,问得好,因为我只会这种。。。
准备工作就不多说了,从底层开始咱们捋一遍就好,开始
要用的POI依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
pojo层创建类,其属性和数据库表字段相同,我这里使用的是User类,含有id、userName、address和roleId四个属性
mapper层我使用Mybatis实现查询所有数据
@Mapper
public interface UserMapper {
@Select("select * from user")
List<User> getAllUsers();
}
service业务层创建接口和实现类,我这里实现类只作了返回从数据库层查询的所有数据,讲道理这里不该这么做,业务层应该就是封装业务的嘛,但是为了更方便理解和学习,我们把导出excel文件的一些设置放在了controller层,大家之后可以自己想想试试,怎么都放在业务层实现
@Service
public class UserServiceImpl implements UserService{
@Resource
private UserMapper userMapper;
@Override
public List<User> getAllUser() {
return userMapper.getAllUsers();
}
}
controller层,创建一个返回值为空的方法,方法参数为HttpServletResponse类型,这个参数不会从前端接收任何值,就是为导出excel文件做一些最后的设置的和写出的,直接上代码,总共分五步(前两步很弱智,中间两步都一样,最后一步固定用法,简简单单。。),具体解释大家看注解
@Controller
public class controller {
@Resource
private UserService userService;
@RequestMapping("/exportExcel")
@ResponseBody
public void exportExcel(HttpServletResponse response){
// 1. 实例HSSFWorkbook对象
HSSFWorkbook workbook1 = new HSSFWorkbook();
// 2. 创建一个excel文件里的sheet表格
HSSFSheet sheet = workbook1.createSheet();
// 3. 设置sheet表格里的第一行
HSSFRow row0 = sheet.createRow(0);
// 设置第一行每个单元格的值
row0.createCell(0).setCellValue("用户id");
row0.createCell(1).setCellValue("用户姓名");
row0.createCell(2).setCellValue("用户地址");
row0.createCell(3).setCellValue("用户角色id");
// 4. 获得数据库里的数据,也即要导出的数据
List<User> userList = userService.getAllUsers();
// 循环将他们放入第二、三、四、五......行
for (int i = 0; i < userList.size(); i++) {
User user = userList.get(i);
HSSFRow row = sheet.createRow(i + 1);
// 放入每行的对应单元格
row.createCell(0).setCellValue(user.getId());
row.createCell(1).setCellValue(user.getUserName());
row.createCell(2).setCellValue(user.getAddress());
row.createCell(3).setCellValue(user.getRoleId());
}
// 5. 设置导出文件的格式、名字以及写出
try {
response.setContentType("application/vnd.ms-excel;charset=utf-8");
// user_Excel.xls为导出文件的名字
response.setHeader("Content-Disposition","attachment;filename=user_Excel.xls");
OutputStream out = response.getOutputStream();
workbook1.write(out);
// 关闭输出流
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
前端创建一个form表单或者ajax或者…没有要求当然怎么简单怎么来!超链接,走起!
<a th:href="@{/exportExcel}">导出excel</a>
导出结果:
最后说一点注意,如果把对HSSFWorkbook对象的设置放在业务层的话,业务层的返回值要是HSSFWorkbook类型的,controller调用该业务方法接收的变量类型也为HSSFWorkbook类型
HSSF组件还有很多用法,对字体、行高的设置等等;合并单元格也可以使用POI依赖实现,像这样
CellRangeAddress cellRange = new CellRangeAddress(开始行, 结束行, 开始列, 结束列);
// 将要合并的单元格设置到sheet表
sheet.addMergedRegion(cellRange);
大家自己探索吧,加油!