废话不多说,直接上代码!
一、添加依赖

 <!-- excel导出相关依赖 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.0.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.0.0</version></dependency>

二、定义文件导出的工具类
使用poi导出excel表有一套完整的流程,与其说是流程,其实翻译成我们日常建立文件的过程就很好理解了,但是这一套过程大都是重复性的工作,为了方便复用和减少代码的冗余,我们将其封装为工具类,用时将关键参数传入即可!
在封装工具类之前,首先了解一个poi的各个对象的含义,这样有助于理解工具类中的各个步骤:
1、HSSFWorkbook ------一个excel文件

2、HSSFSheet --------一个sheet
3、HSSFRow ----一个行
4、HSSFCell------一个列
5、HSSFCellStyle----样式
按照众所周知的步骤,我们首先要建立一个文件,然后创建一个sheet,然后是定义行,定义列,填充内容,那就开干吧:

package com.wwy.util;import java.util.List;
import java.util.Map;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
/*** 文件导出的工具类* @author wwy* @date 2019年12月31日* @version v0.0.1**/public class ExportUtil{/*** * @param sheetName sheet名* @param title 表头* @param field 字段名* @param values 值* @return*/public static HSSFWorkbook Export(String sheetName,String[] title,List<Map<String,Object>> values) {//创建一个excel文件对象HSSFWorkbook hwb=new HSSFWorkbook();//新建一个sheetHSSFSheet sheet=hwb.createSheet(sheetName);//新建第0行HSSFRow row=sheet.createRow(0);    //新建列HSSFCell cell=null;//存入表头内容,并设置表头样式//定义样式HSSFCellStyle style = getStyle(hwb);    style.setFont(titleFont(hwb));for(int i=0;i<title.length;i++) {cell=row.createCell(i);cell.setCellValue(title[i]);cell.setCellStyle(style);//设置列宽sheet.setColumnWidth(i, 7000);}//将内容放入文件对象中,并设置样式HSSFCellStyle style2 = getStyle(hwb);  style2.setFont(valueFont(hwb));for(int i=0;i<values.size();i++) {//每一行的数据Map<String,Object> value=values.get(i);row=sheet.createRow(i+1);if(value!=null&&value.size()!=0) {    //遍历数据,将数据存入到文件对象中for(int j=0;j<title.length;j++) {cell=row.createCell(j);cell.setCellValue(value.get(title[j])+"");cell.setCellStyle(style2);}}    }return hwb;}/*** 设置表头字体* @param h* @return*/private static HSSFFont titleFont(HSSFWorkbook h) {HSSFFont font = h.createFont();//字体font.setFontName("黑体");//字号font.setFontHeightInPoints((short)14);//颜色font.setColor(HSSFFont.COLOR_RED);//加粗font.setBold(true);return font;}/*** 设置内容字体* @param h* @return*/private static HSSFFont valueFont(HSSFWorkbook h) {HSSFFont font = h.createFont();//字体font.setFontName("仿宋_GB2312");//字号font.setFontHeightInPoints((short)14);return font;}/*** 设置统一样式* @param h* @return*/@SuppressWarnings("static-access")private static HSSFCellStyle getStyle(HSSFWorkbook h) {//新建样式HSSFCellStyle style=h.createCellStyle();//设置水平居中style.setAlignment(HorizontalAlignment.CENTER);//设置垂直居中style.setVerticalAlignment(style.getVerticalAlignmentEnum().CENTER);//设置边框style.setBorderBottom(style.getBorderBottomEnum().THIN);style.setBorderLeft(style.getBorderBottomEnum().THIN);style.setBorderRight(style.getBorderBottomEnum().THIN);style.setBorderTop(style.getBorderBottomEnum().THIN);//设置自动换行style.setWrapText(true);return style;}
}

工具类写的稍微有点点复杂,主要是为了把常用的样式都写进去,方便参考

三、业务逻辑
接下来就是我们常写的controller、service、dao层的书写,当然重点是在servcie层,
1、controller层代码

package com.wwy.test.exporttest.controller;import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import com.wwy.entry.APIEntry;
import com.wwy.test.exporttest.service.ExportService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;/*** 导出订单的excel表的controller* @author wwy* @date 2019年12月31日* @version v0.0.1**/
@RestController
@RequestMapping("export")
@Api(tags = "excel导出")
public class ExportController {@Autowired
private ExportService service;
@PostMapping("get")
@ApiOperation("导出")
public APIEntry get(@RequestBody List<Long> ids,HttpServletResponse response,HttpServletRequest request) {return service.get(ids,response,request);
}
}

3、service层代码

package com.wwy.test.exporttest.service.impl;import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import com.wwy.entry.APIEntry;
import com.wwy.test.exporttest.mapper.ExportMapper;
import com.wwy.test.exporttest.service.ExportService;
import com.wwy.util.ExportUtil;
import lombok.extern.slf4j.Slf4j;/*** excel导出的service层* @author wwy* @date 2019年12月31日* @version v0.0.1**/
@Slf4j
@Service
public class ExportServiceImpl implements ExportService{@Autowiredprivate ExportMapper mapper;private static final String[] TITLE = {"订单ID","分销商昵称","商品名","客户昵称","商品数量","商品总价","代理总价","订单状态","快递单号"};@Overridepublic APIEntry get(List<Long> id,HttpServletResponse response,HttpServletRequest request) {// 设置字符集response.reset();response.setCharacterEncoding("UTF-8");//校验参数if(id==null||id.size()==0) {id=null;log.info("导出全部");}//从数据库中查询数据List<Map<String,Object>> list=mapper.get(id);//验证数据if(list==null||list.size()==0) {return APIEntry.ERROR("没有数据");}for(Map<String,Object> map:list) {//将订单状态代号更换成汉字// 订单状态(未支付-1,未发货0,发货1,签收2)String state=map.get("订单状态")+"";switch(state) {case "-1":map.put("订单状态", "未支付");break;case "0":map.put("订单状态", "未发货");break;case "1":map.put("订单状态", "发货");break;case "2":map.put("订单状态", "签收");}}//导出HSSFWorkbook hssfWorkBook = ExportUtil.Export("订单", TITLE, list);//实现下载OutputStream out=null;try {//获取输出流out=response.getOutputStream();//输出hssfWorkBook.write(out);//设置响应头response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode("订单.xls", "UTF-8"));log.info("下载成功");return APIEntry.OK(URLEncoder.encode("filename="+"订单.xls", "UTF-8"));} catch (IOException e) {log.error("下载失败");e.printStackTrace();return APIEntry.ERROR("下载失败");//嵌套try{}catch ,保证流正常关闭}finally {try {out.close();hssfWorkBook.close();} catch (IOException e) {out=null;hssfWorkBook=null;e.printStackTrace();}}      }
}

4、sql语句
这里贴出来sql语句主要是为上面使用自定义表头做说明,在sql语句中将查询出的字段使用相应的表头作为别名就可以完美映射

 <select id="get" resultType="java.util.HashMap">select jt_order.order_id 订单ID,user.nick_name 分销商昵称,commodity.commodity_name 商品名,customer.cname 客户昵称,jt_order.number 商品数量,jt_order.sum_amount 商品总价,jt_order.actual_amount 代理总价,jt_order.state 订单状态,jt_order.courier 快递单号from
jt_order left join commodity
on jt_order.commodity_id=commodity.commodity_id
left join user
on jt_order.dis_id=user.user_id
left join customer
on jt_order.customer_id=customer.customer_id
<if test="ids!=null">
where jt_order.order_id in
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</if>
</select>

java完成excel导出下载相关推荐

  1. java实现Excel导出下载功能(返回pdf流)

    需要引入Jar包 com.spire.xls.Workbook 这种方式只能导出三页(因为收费) Jar包地址 提取码:ut4n public Result<?> teamSourceEx ...

  2. java中Excel导出echart图片

    java中Excel导出echart图片 1.在生成echart的前端代码生成图片代码后Echart.setOption(captestRcapEchartOption, true);后面加上以下代码 ...

  3. VUE+JAVA实现EXCEL模板下载

    一.项目场景: VUE+JAVA实现EXCEL模板下载 二.功能背景 本人作为一个开发小白,今天接到一个小需求系统需要导入数据,也就十几个字段,我和老板说了,让客户一个一个去输入吧!然后我就被经理叫去 ...

  4. java实现excel导出合并单元格

    随着数据的不断增长,很多时候需要将数据导出到Excel中进行分析.处理和展示.而Java作为一种流行的编程语言,自然也提供了很多实现Excel导出的方法.本文将介绍如何使用Java实现Excel导出, ...

  5. 记一次java实现excel导出

    新年过完了哦,小子我又来了,大家新年过的还快乐吗?反正我是只感觉到了"快,",没有感觉到"乐". 2021年的第一天,就接到新需求了.对,就是那个谁,来来,给个 ...

  6. Java之Excel导出工具类使用教程

    前言: 本工具类经过PostMan和web页面严格测试可用,经过了多个版本迭代优化,可以直接使用,也方便大家根据自己的业务需求,修改定制自己的导出工具. 市面上有很多封装好的导出工具(如:阿里的eas ...

  7. java的Excel导出方式总结

    一.使用hutool导出excel 1.1 hutool介绍 hutool功能很强大,http请求到json处理.excel的导入导出.定时任务.IO.缓存.数据库操作等都提供了简单而方便的api供我 ...

  8. java实现excel打包下载

    最近公司让我做一个报表的打包下载功能,以前从来没有接触过,从问了下度娘,实现其功能的方式很多,其中我找到一篇博文就写得非常好,本人也是根据博文所讲做的,但是现在找不到他的链接地址了,,在这里就本人所做 ...

  9. thinkphp3.2.3 excel导出,下载文件,包含图片

    关于导出后出错的问题 https://segmentfault.com/q/1010000005330214 https://blog.csdn.net/ohmygirl/article/detail ...

最新文章

  1. 国庆特惠!超全技术栈来袭!视觉/激光SLAM+点云处理+三维重建+多传感器融合...
  2. SourceTree -- Installation has failed
  3. shell 学习笔记(18)
  4. seaborn 笔记:load_dataset
  5. 压缩感知(I) A Compressed Sense of Compressive Sensing (I)
  6. 工业用微型计算机笔记(2)-二进制有符号数
  7. Android应用截图嵌入到真实设备
  8. Could not load java.net.BindException错误解决
  9. python正则表达式提取字符串的字母_Python正则表达式提取一部分字符串
  10. Django中的admin
  11. linux关机方法有哪些?有何区别_茅台酒都有哪些容量?一升装的与一斤装的到底有何区别?...
  12. python矩阵运算_python 矩阵运算
  13. 腾讯云函数转华为云函数
  14. AWS Route53里使用Godady注册的域名
  15. 2011年华为企业业务的15件大事
  16. 关于dash的基础学习
  17. 10个不得不买的高科技智能机器人
  18. Atitit 通过教育提升阶层 不同阶层的不同教育专业分类 目录 1. 顶层婆罗门教育专业 1 1.1. 价值观教育 意识形态 宗教 (哲学 教育学 ) 1 1.2. (11)法学 管理学 公
  19. 华清远见-重庆中心-数据库阶段技术总结:
  20. 计算机应用基础蓝色方框在哪,计算机应用基础Word2010综合测试操作步骤参考自测题步骤...

热门文章

  1. Linux Watchdog/看门狗
  2. JAVA练习15-数组中重复的数字
  3. 粉象生活宇漫:贴吧引流实战教程
  4. windows程序设计读书笔记四
  5. OPENJUDGE 1.7 11:潜伏者
  6. VS2005下MFC开发的ActiveX控件的部分总结 inf 篇
  7. 百度UEditor编辑器,合入PHP网站
  8. 4rx4 服务器内存2rx4_866426-001 M393A4K40BB1-CRC0Q 32GB 2Rx4三星HPE服务器内存
  9. windows开机启动项设置
  10. Caff-Opencv——图像分类(01)