上一篇写了关于SSM使用POI解析Excel数据并实现批量导入到数据库 ,这里记录一下怎么将查询出来的数据导出到Excel。
需要引入的包,在上一篇博客中有介绍,这里直接贴代码。
本来想写在工具类里的,结果涉及到数据的读取和添加感觉不如直接写在Controller里方便。
Controller类代码
这里使用的导出格式是.xls
,也就是office2003+支持的,.xlsl
是2007+版本支持的,使用xlsl的话,里面引用的包和创建表格文件的语句是不一样的。
@RequestMapping("/exportFile")
//@ResponseBody
public void exportFile(String macId, String boxId, String payType,
HttpServletResponse response) {
Map<String, String> map = new HashMap<String, String>();
map.put("macId", macId);
map.put("boxId", boxId);
map.put("payType", payType);
List<Order> orderList = orderService.selectOrderList(map); // 需要导出的数据
System.out.println("orderList:" + orderList);
if (orderList != null && orderList.size() > 0) {
String fileName = "OrderReportForm.xls";
try {
response.setHeader(
"Content-disposition",
"attachment;filename="
+ new String(fileName.getBytes("gb2312"),
"ISO8859-1"));
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}// 设置文件头编码格式
response.setContentType("APPLICATION/OCTET-STREAM;charset=UTF-8");// 设置类型
response.setHeader("Cache-Control", "no-cache");// 设置头
response.setDateHeader("Expires", 0);// 设置日期头
// 这里是表格的头部
String[] titles = { "订单编号", "流水单号", "商品名称", "商品价格", "商品进价", "交易时间",
"设备编号", "柜子ID", "支付方式" };
try {
// 第一步,创建一个workbook,对应一个Excel文件
HSSFWorkbook workbook = new HSSFWorkbook();
// 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet
HSSFSheet hssfSheet = workbook.createSheet("sheet1");
// 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short
HSSFRow row = hssfSheet.createRow(0);
// 第四步,创建单元格,并设置值表头 设置表头居中
HSSFCellStyle hssfCellStyle = workbook.createCellStyle();
// 居中样式
hssfCellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
HSSFCell hssfCell = null;
for (int i = 0; i < titles.length; i++) {
hssfCell = row.createCell(i);// 列索引从0开始
hssfCell.setCellValue(titles[i]);// 列名1
hssfCell.setCellStyle(hssfCellStyle);// 列居中显示
}
// 第五步,写入实体数据
for (int i = 0; i < orderList.size(); i++) {
row = hssfSheet.createRow(i + 1);
Order order = orderList.get(i);
// 第六步,创建单元格,并设置值
row.createCell(0).setCellValue(order.getTrade_no());
row.createCell(1).setCellValue(order.getOut_trade_no());
row.createCell(2).setCellValue(order.getGoods_name());
row.createCell(3).setCellValue(order.getTotal_price() + "");
row.createCell(4).setCellValue(order.getGoods_net_price() + "");
row.createCell(5).setCellValue(order.getPay_time());
row.createCell(6).setCellValue(order.getMac_id() + "");
row.createCell(7).setCellValue(order.getBox_id() + "");
row.createCell(8).setCellValue(order.getPay_type());
}
// 第七步,将文件输出到客户端浏览器
try {
workbook.write(response.getOutputStream());
response.getOutputStream().flush();
response.getOutputStream().close();
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
System.out.println("导出信息失败!");
e.printStackTrace();
}
}else{
System.out.println("查询结果为空!");
}
}
js提交导出Excel,提交的时候加入了条件查询:
<script type="text/javascript">
$(function(){
$("#export").click(function(){
var macId = $("#macId").val();
var boxId = $("#boxId").val();
var payType = $("#payType").val();
var href = "order/exportFile.do" + "?macId=" + macId + "&boxId=" + boxId + "&payType=" + payType;
window.location.href = href;
return false;
})
});
</script>
<input id="export" type="button" class="scbtn" value="导出Excel" />
刚开始是使用的ajax提交的,但是不知道哪里出错了,没有报错,但是没有导出文件,直接在url里面访问,是可以正常导出表格的,于是便换成了使用window.location.href
这里有一个bug,就是文件名不能为中文,否则IE浏览器导出的文件名是乱码的,而Chrome浏览器则是正常的。我查了一下之后发现是IE浏览器对url编码的问题,修改这个感觉有点麻烦,还不如直接使用英文命名。
这个只是一个简单的demo,导出的excel格式比较简单,如果对excel的格式有要求的,可以参考这篇博客,里面对poi的插件中常用的类都有说明,可以在ExcelUtil 里面添加对应的功能