工作中肯定会有的报表导出的功能,咱先来理下思路

  1. 先定义好模板文件,存放到一个有权限访问的目录内
  2. 根据模板路径,获取模板文件
 /*** 根据模板的路径获取模板文件对象* classpath根目录下:/template/report.xlsx*/private File getTemplateFile(String template) throws URISyntaxException {URL resource = Thread.currentThread().getContextClassLoader().getResource("/");Path classpath = Paths.get(resource.toURI());Path path = Paths.get(classpath.toString(), template);return path.toFile();}
  1. 读取报表需要的数据
 private List<Report> getReport(Long reportId, String day) {Map<String,Object> key=new HashMap<>(2);key.put("day",day);key.put("reportId",reportId);return dao.select("xxx.xxx",key);}
  1. 处理数据,使其符合模板的数据格式,方便渲染数据(也可以直接单元格逐个填充,则可省略该步骤)

  2. 填充数据

     // 读取excel模板文件File reportFile = getTemplateFile(report.getTemplatePath());// 拼装excel报表文件XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(reportFile));if (Objects.nonNull(workbook)) {if (CollectionUtils.isNotEmpty(modelList)) {// 逐个sheet填充数据sheetProcessorHolder.process(modelList,workbook);}}// 设置第一个sheet为活动sheetworkbook.setActiveSheet(0);return workbook;
  1. 关键的下载步骤:
 /*** 导出并下载excel报表文件** @param reportId* @param day* @param response Http的响应对象,用于向用户输出excel文件流下载使用*/public void exportExcel(String day, HttpServletResponse response) throws Exception {XSSFWorkbook workbook = getProcessor(report).process(report, day);String fileName = buildFileName(day);response.setHeader("Content-disposition", String.format("attachment; filename=%s.xlsx", URLEncoder.encode(fileName, "UTF-8")));response.setContentType("application/msexcel");try (ServletOutputStream outputStream = response.getOutputStream()) {workbook.write(outputStream);outputStream.flush();}}
  1. 涉及的关键代码
/*** 根据坐标获取单元格A2,B4...** @param sheet* @param cell   单元格列坐标A,B,C...* @param rowNum 单元格行坐标1,2,3...* @return*/
private XSSFCell getXssfCell(XSSFSheet sheet, String cell, int rowNum) {CellReference reference = new CellReference(String.format("%s%d", cell, rowNum));XSSFRow row = sheet.getRow(reference.getRow());if (Objects.nonNull(row)) {return row.getCell(reference.getCol());}return null;
}

XSSFCell cell = getXssfCell(sheet, column, row);
// 单元格内赋值
cell.setCellValue(value);
// 设置单元格的公式:SUM(B2:B6)
cell.setCellFormula(formula);//强制执行该sheet中所有公式sheet.setForceFormulaRecalculation(true);
/*** 插入一行** @param sheet* @param starRow* @param rows* @return*/
protected XSSFRow insertRow(XSSFSheet sheet, int starRow, int rows) {//参数:// startRow-要开始移位的行// endRow-要结束移位的行// n-要移位的行数// copyRowHeight-是否在移位期间复制行高// resetOriginalRowHeight-是否将原始行的高度设置为默认值sheet.shiftRows(starRow, sheet.getLastRowNum(), rows, true, false);// 所有行下移,并复制上一行的所有列的样式、公式for (int i = 0; i < rows; i++) {XSSFRow sourceRow = sheet.getRow(starRow - 1 - i);XSSFRow targetRow = sheet.createRow(starRow + i);targetRow.setHeight(sourceRow.getHeight());for (int cn = sourceRow.getFirstCellNum(); cn < sourceRow.getLastCellNum(); cn++) {XSSFCell sourceCell = sourceRow.getCell(cn);XSSFCell targetCell = targetRow.createCell(cn);targetCell.setCellStyle(sourceCell.getCellStyle());}}return sheet.getRow(starRow);
}

调用上面的插入1行的代码

List list = ....
for (int i = 0; i < list.size(); i++) {int rowNum = i + 2;  //行号,1开始int rowIndex = i + 1;  // 行的索引,0开始XSSFRow row;if (rowIndex == 1) {    //第一行都是表头,所以从第二行开始插入数据row = sheet.getRow(rowIndex);} else {// 当插入的行号大于第二行,则创建新行并复制上一行所有列的样式,公式等row = insertRow(sheet, rowIndex, 1);}后面的处理....
}
 // 获取行的有效使用的总列数int cellCount = row.getPhysicalNumberOfCells();

Java 根据Excel模板 导出Excel报表相关推荐

  1. java 根据excel模板导出excel

    java 根据excel模板导出excel 由于项目需求,最近做了一个需要根据查询接口导出excel表格数据的需求 pom依赖: <dependency><groupId>or ...

  2. java 分析excel模板,java 根据excel模板导出excel

    java 根据excel模板导出excel 由于项目需求,最近做了一个需要根据查询接口导出excel表格数据的需求 pom依赖: org.apache.poi poi 3.16 org.apache. ...

  3. 使用EasyPoi利用excel模板导出excel表格下载

    前言:使用excel模板导出excel的好处在于可以事先在模板上定义颜色.格式等,适用于模板设计得比较灵活复杂的场景 一.添加jar包 <dependency><groupId> ...

  4. .Net NPOI 根据excel模板导出excel、直接生成excel

    一.根据Excel模板导出excel 1.导入NPOI.dll  2.DAL中添加类ExportExcel.cs using NPOI.SS.UserModel; using System; usin ...

  5. springboot+poi开发excel导出 加载Excel模板导出 Excel批量导出详解

    提到Excel导出功能,可能很多人都使用springmvc框架做过,笔者今天要给大家分享的是基于springBoot开发Excel复杂模板导出功能(所谓复杂模板指在模板里的特定表头里有不同的单元格合并 ...

  6. java easypoi使用模板导出Excel,合并单元格

    工作几年,每年都有java数据导出Excel的需求,从最初的POI到公司封装的工具再到阿里的EasyExcel.总是有这个那个的小痛点,最近发现easypoi比较满足工作需求,可以很好的导出数据并处理 ...

  7. thinkphp6 生成下载动态Excel模板,导出excel文件

    1,安装 phpexcel composer require phpoffice/phpexcel 安装成功后,vendor文件夹下会有phpoffice文件夹 2,common.php 中加入导出e ...

  8. freemarker根据word模板导出动态word(Excel模板导出Excel)

    1.创建word模板 将需要替换的位置用"${}"代替,如下图: 2.将做好的模板文件保存为xml文件 3.打开xml文件,查看"${unitName}"是否在 ...

  9. .Net Core 读取Excel 模板 导出 Excel 文件

    var exportTemplatePath = "./Template/cxtemplate.xlsx";var newName = $"xxx进度表汇总-{Syste ...

最新文章

  1. 【Qt】dumpbin详解
  2. python初学者之网络爬虫_Python初学者之网络爬虫(二)
  3. Redis Cluster 介绍与搭建
  4. eclipse java8报错_eclipse4.3安装支持Java8插件,之后就报错无法打开eclipse,求解?
  5. DELPHI加密字串(异或运算加密)
  6. 网易云信入选杭州市优质产品推荐目录!
  7. 摆摊吗?我卖锅,你修手机。
  8. 2019诺贝尔化学奖: 二战老兵的传奇人生
  9. LeetCode-145:二叉树的后序遍历
  10. hdu 1588 Gauss Fibonacci
  11. http抓包实践--(三)--HTTP协议中的缓存
  12. 软件开发介绍-尚硅谷视频学习随记
  13. 基于互联网的环境影响评价数据服务平台
  14. 计算机一定要学五笔打字吗,学习五笔打字大概要多长时间
  15. 多糖水凝胶的交联方式及分析方法
  16. win10 如何更换即将过期的产品密钥
  17. 25岁社招进阿里,从电商到有赞新零售,他仅1年就打开了马云一直想做的新领域!...
  18. Android应用推广渠道分享
  19. MySQL 主从幂等复制slave_exec_mode=IDEMPOTENT
  20. java的几种基本数据类型及其大小

热门文章

  1. 7-10 兔子繁衍问题
  2. kb931125—rootsupd_微软kb931125根证书更新程序
  3. 基于JavaGUI实现的单机斗地主游戏
  4. 新手必知:建设网站的基本步骤_转载
  5. facebook app
  6. MSIC-AND-CRYPTO
  7. msm8953 android7.1 配置笔记
  8. macOS Ventura 13.0.1 (22A400)官方原版dmg镜像
  9. JDBC连接数据库详细步骤
  10. AutoHotkey入门