Java 根据Excel模板 导出Excel报表
工作中肯定会有的报表导出的功能,咱先来理下思路
- 先定义好模板文件,存放到一个有权限访问的目录内
- 根据模板路径,获取模板文件
/*** 根据模板的路径获取模板文件对象* 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();}
- 读取报表需要的数据
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);}
处理数据,使其符合模板的数据格式,方便渲染数据(也可以直接单元格逐个填充,则可省略该步骤)
填充数据
// 读取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;
- 关键的下载步骤:
/*** 导出并下载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();}}
- 涉及的关键代码
/*** 根据坐标获取单元格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报表相关推荐
- java 根据excel模板导出excel
java 根据excel模板导出excel 由于项目需求,最近做了一个需要根据查询接口导出excel表格数据的需求 pom依赖: <dependency><groupId>or ...
- java 分析excel模板,java 根据excel模板导出excel
java 根据excel模板导出excel 由于项目需求,最近做了一个需要根据查询接口导出excel表格数据的需求 pom依赖: org.apache.poi poi 3.16 org.apache. ...
- 使用EasyPoi利用excel模板导出excel表格下载
前言:使用excel模板导出excel的好处在于可以事先在模板上定义颜色.格式等,适用于模板设计得比较灵活复杂的场景 一.添加jar包 <dependency><groupId> ...
- .Net NPOI 根据excel模板导出excel、直接生成excel
一.根据Excel模板导出excel 1.导入NPOI.dll 2.DAL中添加类ExportExcel.cs using NPOI.SS.UserModel; using System; usin ...
- springboot+poi开发excel导出 加载Excel模板导出 Excel批量导出详解
提到Excel导出功能,可能很多人都使用springmvc框架做过,笔者今天要给大家分享的是基于springBoot开发Excel复杂模板导出功能(所谓复杂模板指在模板里的特定表头里有不同的单元格合并 ...
- java easypoi使用模板导出Excel,合并单元格
工作几年,每年都有java数据导出Excel的需求,从最初的POI到公司封装的工具再到阿里的EasyExcel.总是有这个那个的小痛点,最近发现easypoi比较满足工作需求,可以很好的导出数据并处理 ...
- thinkphp6 生成下载动态Excel模板,导出excel文件
1,安装 phpexcel composer require phpoffice/phpexcel 安装成功后,vendor文件夹下会有phpoffice文件夹 2,common.php 中加入导出e ...
- freemarker根据word模板导出动态word(Excel模板导出Excel)
1.创建word模板 将需要替换的位置用"${}"代替,如下图: 2.将做好的模板文件保存为xml文件 3.打开xml文件,查看"${unitName}"是否在 ...
- .Net Core 读取Excel 模板 导出 Excel 文件
var exportTemplatePath = "./Template/cxtemplate.xlsx";var newName = $"xxx进度表汇总-{Syste ...
最新文章
- 【Qt】dumpbin详解
- python初学者之网络爬虫_Python初学者之网络爬虫(二)
- Redis Cluster 介绍与搭建
- eclipse java8报错_eclipse4.3安装支持Java8插件,之后就报错无法打开eclipse,求解?
- DELPHI加密字串(异或运算加密)
- 网易云信入选杭州市优质产品推荐目录!
- 摆摊吗?我卖锅,你修手机。
- 2019诺贝尔化学奖: 二战老兵的传奇人生
- LeetCode-145:二叉树的后序遍历
- hdu 1588 Gauss Fibonacci
- http抓包实践--(三)--HTTP协议中的缓存
- 软件开发介绍-尚硅谷视频学习随记
- 基于互联网的环境影响评价数据服务平台
- 计算机一定要学五笔打字吗,学习五笔打字大概要多长时间
- 多糖水凝胶的交联方式及分析方法
- win10 如何更换即将过期的产品密钥
- 25岁社招进阿里,从电商到有赞新零售,他仅1年就打开了马云一直想做的新领域!...
- Android应用推广渠道分享
- MySQL 主从幂等复制slave_exec_mode=IDEMPOTENT
- java的几种基本数据类型及其大小