先看看我们要实现的效果图

1:导入maven依赖

     <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.5.1</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency>

2:请求类

@Slf4j
@Api(tags = "文档下载",value = "文档下载")
@RestController
@RequestMapping("/api/download/file")
public class DownloadFileController {@PostMapping("/word")@ApiOperation("下载word模板")public void word(HttpServletRequest request, HttpServletResponse response){//自定义标题行1String attendanceGroup="考勤组别:  10167-风控中心  (注意:导入模板必须严格按照现有格式,否则无法识别到PeopleSoft考勤管理后台)";//自定义标题行2String shift="排班信息:  班次Z1(总部周六班):08:30-18:30  班次B4(班次4):08:30-17:30  班次C4(班次14):20:00-次日08:00  班次E7(班次37):21:00-次日09:00  班次H7(班次67):15:00-22:00 班次WY(物业假期班):08:30-17:30  班次B0(班次206):08:30-次日09:00  班次B1(班次207):15:00-次日06:00";WordUtil.createWord(request, response,attendanceGroup,shift);}
}

3:逻辑处理层

@Slf4j
public class WordUtil {/*** 创建排班word文档* @param request* @param response*/public static void createWord(HttpServletRequest request, HttpServletResponse response,String attendanceGroup,String shift){//日期List<String> allDay = getMonthAllDay(LocalDate.now());//所有行数据List<Map<String,Object>> rows = new ArrayList<>();//自定义模板数据for (int i = 1; i <= 5; i++) {Map<String, Object> map = new LinkedHashMap<>();map.put("id",i);map.put("employeeId","XC0000".concat(i+""));map.put("employeeRecord","0");map.put("employeeName","张".concat(i+""));map.put("employeeProject","新城控股");map.put("departmentName","开发部");map.put("positionName","Java开发工程师");for (String day : allDay) {String name = "date".concat(day);map.put(name,"");}rows.add(map);}int row = 2 + rows.size();ExcelWriter writer = null;ServletOutputStream out = null;//表结构try {writer = ExcelUtil.getWriter();//自定义列名别名writer.addHeaderAlias("id", "序号");writer.addHeaderAlias("employeeId", "员工ID");writer.addHeaderAlias("employeeRecord", "员工记录");writer.addHeaderAlias("employeeName", "员工姓名");writer.addHeaderAlias("employeeProject", "员工项目");writer.addHeaderAlias("departmentName", "部门名称");writer.addHeaderAlias("positionName", "岗位名称");//读取数据作为列名for (String day : allDay) {String name = "date".concat(day);writer.addHeaderAlias(name,day.concat("(").concat(getWeekOfDate(day)).concat(")"));}writer.setOnlyAlias(true);int size = 6 + allDay.size();//合并单元格后的标题行,使用默认标题样式  6+allDay.size():合并单元格的长度writer.merge(size,attendanceGroup);writer.merge(size,shift);//一次性写出内容,强制输出标题writer.write(rows, true);//设置样式setWordStyle(writer,size,row);// 设置文件后缀SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");String fn = "排版导入模板" + sdf.format(new java.util.Date()) + ".xls";// 读取字符编码String utf = "UTF-8";//转流下载response.setContentType("application/vnd.ms-excel;charset=utf-8");response.setHeader("Content-Disposition","attachment;filename=" + URLEncoder.encode(fn, utf));out = response.getOutputStream();//将Excel 刷出到输出流writer.flush(out, true);}catch (Exception e){log.error("create word error:{}",e);}finally {//关闭writer,释放内存if (ObjectUtil.isNotNull(writer)){writer.close();}//关闭输出Servlet流if (ObjectUtil.isNotNull(out)){IoUtil.close(out);}}log.info("create word success");}/*** 获取当前时间本月的所有日期(yyyy-MM-dd)* @param date 当前时间* @return List<String>*/private static List<String> getMonthAllDay(LocalDate date){List<String> allDates = CollUtil.newArrayList();int year = date.getYear();log.info("year:{}",year);int month = date.getMonthValue();log.info("month:{}",month);Calendar cal = Calendar.getInstance();cal.clear();cal.set(Calendar.YEAR,year);cal.set(Calendar.MONTH,month-1);cal.set(Calendar.DAY_OF_MONTH,1);int maxDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);log.info("maxDay:{}",maxDay);for (int i = 1; i <= maxDay; i++) {String day = new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime());allDates.add(day);cal.add(Calendar.DAY_OF_MONTH,1);}return allDates;}/*** 设置表格样式* @param writer*/private static void setWordStyle(ExcelWriter writer,int size,int row) throws Exception{CellStyle headCellStyle = writer.getHeadCellStyle();//设置表头左对齐headCellStyle.setAlignment(HorizontalAlignment.LEFT);//设置表格内容自适应writer.autoSizeColumnAll();Sheet sheet = writer.getSheet();//默认取第一行数据,解决中文自适应宽度不足问题if (sheet != null && sheet.getRow(1) != null) {int physicalNumberOfCells = sheet.getRow(1).getPhysicalNumberOfCells();for (int i = 0; i < physicalNumberOfCells; i++) {// 调整每一列宽度sheet.autoSizeColumn((short) i);// 解决自动设置列宽中文失效的问题sheet.setColumnWidth(i, sheet.getColumnWidth(i) * 17 / 10);}}//自定义下拉框数据 可读取数据库塞入List<String> strings=new ArrayList<>();strings.add("A1");strings.add("A2");strings.add("A3");strings.add("B1");String string=strings.stream().collect(Collectors.joining(","));//结果 "A1,A2,A3,B1"CellRangeAddressList list=new CellRangeAddressList(3,row,7,size);//3到row行、7到size列添加下拉框writer.addSelect(list,string);}/*** 获取日期星期* @param dateStr* @return*/private static String getWeekOfDate(String dateStr) {String[] weekDays = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };Calendar cal = Calendar.getInstance();cal.setTime(DateUtil.parse(dateStr));int w = cal.get(Calendar.DAY_OF_WEEK) - 1;return w<0?weekDays[0]:weekDays[w];}
}

java 实现自定义数据模板下载Execl相关推荐

  1. Java使用自定义Excel模板填充数据

    Java使用自定义Excel模板填充数据 上期我们说到使用POI简单的制作一个Excel,这里我们教林外一种方法,就是把Excel写好定为模板,直接填充数据. 老样子还是要添加POM依赖 <de ...

  2. java使用自定义HTML模板发送邮件——记录开发篇1

    java使用自定义HTML模板发送email VO接收参数 @Data public class EmailVo {@ApiModelProperty("收件人列表")@NotNu ...

  3. 开源Java cms系统MCms模板下载与使用且升级一套旧的皮肤

    1. 模板的安装与使用 1.1. 从store下载模板 开源与开发版本默认结合store,从右上角的store入口进入. 注意:企业版政务版没有store入口,可使用开源下载. 使用在我们平台注册的账 ...

  4. php 自定义打印模板下载,PHP – 创建自定义模板系统?

    我已经在这里搜索过,令人惊讶的是我找不到答案.我发现了一个类似的线程,但没有真正的解决方案.复杂的部分是循环,如果我不需要循环我可以只是做一个常规替换. 所以,我有一个带有一些标记的.html文件,如 ...

  5. java tcp 自定义数据包_通过TCP接收数据包

    如果您想要使用标识字段,则不使用标准TCP . 对于应用程序,TCP连接呈现为流 . 您无权访问基本数据包 . 此外,在标准TCP连接中,标识字段是随机的16位字段 . 0x0d没有填充此宽度,很可能 ...

  6. java/kafka的使用,生产者 ,发布/发送消息,自定义数据/json数据,实战。

    kafka(卡夫卡生产者)的使用. 发送JSON数据请查看:kafka发送JSON消息,接受JSON消息 一,创建生产者 MyProducer.java . package com.kuxingsen ...

  7. divi模板下载_Java Math类静态double IEEEremainder(double divi,double divisor)的示例

    divi模板下载 数学类静态double IEEEremainder(double divi,double divisor) (Math Class static double IEEEremaind ...

  8. Java jxl在excel模板中动态加入数据,及前端下载excel的例子

    写了一个小demo,把这样一个流程跑通,前端通过点击一个下载按钮,根据前端显示的数据,下载Excel文件到本地. 先分析一下整个流程 前端通过ajax的post请求,传递json字符串到后台. 后台接 ...

  9. Java动态插入数据到html模板并下载为html解决方案

    Java动态插入数据到html模板并导出html解决方案 需求 前端页面数据点击下载为一个html,还必须可以打开关闭表格,有颜色样式之类可复制的,所以canvas画成一个pdf导出显然是不行了: 目 ...

最新文章

  1. oracle rac安装
  2. Android JNI 和 NDK
  3. HTML中的camera标签,详解HTML5 使用video标签实现选择摄像头功能
  4. 多边形对角线条数(C语言)
  5. 单片机点灯不难,但你会网页点灯吗?
  6. Python快速学习03:运算 缩进和选择
  7. mysql5.5中的MaxValue关键字
  8. 关于OpenCV的基本数据类型
  9. QT4 designer的使用 QT国际化
  10. 武汉区块链软件技术公司区块链将如何应用于会员生态系统?
  11. 微信小程序 | 实现活动报名登记
  12. 数学建模学习笔记(三十一)模糊评价法
  13. java小说网站源码_基于java的小说网站代码(全)
  14. Score UVA - 1585
  15. 无锡科技职业学院院长孙兴洋应邀到美和易思作专题讲座
  16. 蛋白质降解技术中常用的蛋白酶(一)
  17. 深圳计师需要全国计算机证吗,深圳入户需要什么技师证
  18. Android小项目-简易刷题app
  19. c语言不报错但输不出正确结果,正则表达式,c++_C语言 正则表达式结果不对?,正则表达式,c++ - phpStudy...
  20. ROS-2Dslam算法比较

热门文章

  1. 江南大学计算机与科学研究生分数线,江南大学2021考研分数线已公布
  2. 写一个类似大众点评的城市选择控件
  3. mysql mvcc
  4. 永磁直驱风力发电机并网仿真模型,单位功率因数控制,进行弱磁控制
  5. 一文了解主流在线公共 MQTT 服务器
  6. 拓嘉辰丰电商:拼多多“快团团”买赠常见玩法
  7. 科目二☞坡道定点停车和起步
  8. remove.bg - 自动抠图、一键去除图片背景的免费在线工具
  9. 安装Ubuntu 18.04 遇到32位兼容问题
  10. 【阴沟翻船】AVPlayer设置完毕马上调用play方法会导致播放没声音