java通过模板导出excel的一个实例

2023-05-16

写之前,大家请先下好poi的相关jar包,网上遍地都是,不多说

<input type="button" id="exportBtn" class="CommonBtn" value="导出Excel" />  这个是按钮

这个是相关事件

// 导出按钮
$('#exportBtn').click(function(){
txtBeginDate = $('#txtBeginDate').datebox('getValue');
txtEndDate = $('#txtEndDate').datebox('getValue');
window.location.href='${CTX_ROOT}/TBoilerrunlogController?method=getExcelByBoiler&begin='+txtBeginDate+'&end='+txtEndDate+'';
});  //我是转向spring mvc的controllor里面了,我这里还给传了俩个值,一个是开始时间,一个是结束时间


controllor代码如下:

@RequestMapping(params = "method=getExcelByBoiler")
@ResponseBody
public String getExcelByBoiler(HttpServletRequest request,
HttpServletResponse response) {
String begin="";
String end="";
if(request.getParameter("begin")!=null && request.getParameter("end") !=null){
begin=request.getParameter("begin");
end = request.getParameter("end");
}

try {
String path =request.getServletContext().getRealPath("")
+ "/excelTemplate/统计.xls";   //这个是我的excel模板
InputStream in = new FileInputStream(new File(path));
SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //为了转时间
HSSFWorkbook work = new HSSFWorkbook(in);
// 得到excel的第0张表
HSSFSheet sheet = work.getSheetAt(0);
// 得到第1行的第一个单元格的样式
HSSFRow rowCellStyle = sheet.getRow(2);
HSSFCellStyle columnOne = rowCellStyle.getCell(0).getCellStyle();
HSSFCellStyle columnOne1 = rowCellStyle.getCell(1).getCellStyle();
HSSFCellStyle columnOne2 = rowCellStyle.getCell(4).getCellStyle();
// 这里面的行和列的数法与计算机里的一样,从0开始是第一
// 填充title数据

HSSFRow row = sheet.getRow(0);
HSSFCell cell = row.getCell(2);
cell.setCellValue("一号机组启停统计(" + begin + "~" + end + ")");
int i = 2;// 计数器
List<Map<String, Object>> list = this.getBoilerRunlog("GL1",begin,end);
// 创建每个单元格,添加样式,最后合并
work.getSheetAt(0).shiftRows(3, 3, list.size() - 1); // 把第三行移动到列表的长度-1的地方  这个地方我是要把模板的第四行放到最后一行
int numberbegin = 0;// 统计
int numberend = 0;// 统计
for (Map map : list) {
row = sheet.createRow(i);// 得到行
cell = row.createCell(0);// 得到第0个单元格
if (!(map.get("actiondatetime") == null)) {
cell.setCellValue(simpleFormat.format(map.get("actiondatetime")));
} else {
cell.setCellValue("");
}
cell.setCellStyle(columnOne);// 填充样式


cell = row.createCell(1);
if (!(map.get("actionstatus") == null)) {
cell.setCellValue(map.get("actionstatus").toString());
} else {
cell.setCellValue("");
}
cell.setCellStyle(columnOne1);// 填充样式
cell = row.createCell(2);
if (!(map.get("logmemo") == null)) {
cell.setCellValue(map.get("logmemo").toString());
} else {
cell.setCellValue("");
}
cell.setCellStyle(columnOne1);// 填充样式
cell = row.createCell(3);
if (!(map.get("rundays") == null)) {
cell.setCellValue(map.get("rundays").toString());
numberbegin++;
} else {
cell.setCellValue("");
}
cell.setCellStyle(columnOne1);// 填充样式
cell = row.createCell(4);
if (!(map.get("stophours") == null)) {
cell.setCellValue(map.get("stophours").toString());
numberend++;
} else {
cell.setCellValue("");
}
cell.setCellStyle(columnOne2);// 填充样式
// .....给每个单元格填充数据和样式
i++;
}
HSSFRow row1 = sheet.getRow(list.size() + 2);
HSSFCell cell1 = row1.getCell(0);
cell1.setCellValue("启停共" + (numberbegin+numberend) + "次," +  "其中启" + numberbegin
+ "次,停" + numberend + "次");//
/*******************************sheet二*******************************************/
HSSFSheet sheet1 = work.getSheetAt(1);
// 得到第1行的第一个单元格的样式
HSSFRow rowCellStyle1 = sheet1.getRow(2);
HSSFCellStyle columnOne01 = rowCellStyle1.getCell(0).getCellStyle();
HSSFCellStyle columnOne02 = rowCellStyle1.getCell(1).getCellStyle();
HSSFCellStyle columnOne03 = rowCellStyle1.getCell(4).getCellStyle();
HSSFRow row2 = sheet1.getRow(0);
HSSFCell cell2 = row2.getCell(2);
cell2.setCellValue("二号机组启停统计(" + begin + "~" + end + ")");
int j = 2;// 计数器
List<Map<String, Object>> list2 = this.getBoilerRunlog("GL2",begin,end);
// 创建每个单元格,添加样式,最后合并
work.getSheetAt(1).shiftRows(3, 3, list2.size() - 1); // 把第三行移动到列表的长度-1的地方
int numberbegin1 = 0;// 统计
int numberend1 = 0;// 统计
for (Map map : list2) {
row2 = sheet1.createRow(j);// 得到行
cell2 = row2.createCell(0);// 得到第0个单元格
if (!(map.get("actiondatetime") == null)) {
cell2.setCellValue(simpleFormat.format(map.get("actiondatetime")));
} else {
cell2.setCellValue("");
}
cell2.setCellStyle(columnOne01);// 填充样式
cell2 = row2.createCell(1);
if (!(map.get("actionstatus") == null)) {
cell2.setCellValue(map.get("actionstatus").toString());
} else {
cell2.setCellValue("");
}
cell2.setCellStyle(columnOne02);// 填充样式
cell2 = row2.createCell(2);
if (!(map.get("logmemo") == null)) {
cell2.setCellValue(map.get("logmemo").toString());
} else {
cell2.setCellValue("");
}
cell2.setCellStyle(columnOne02);// 填充样式
cell2 = row2.createCell(3);
if (!(map.get("rundays") == null)) {
cell2.setCellValue(map.get("rundays").toString());
numberbegin1++;
} else {
cell2.setCellValue("");
}
cell2.setCellStyle(columnOne02);// 填充样式
cell2 = row2.createCell(4);
if (!(map.get("stophours") == null)) {
cell2.setCellValue(map.get("stophours").toString());
numberend1++;
} else {
cell2.setCellValue("");
}
cell2.setCellStyle(columnOne03);// 填充样式
// .....给每个单元格填充数据和样式
i++;
}
HSSFRow row3 = sheet1.getRow(list2.size() + 2);
HSSFCell cell3 = row3.getCell(0);
cell3.setCellValue("启停共" + (numberbegin1+numberend1) + "次," +  "其中启" + numberbegin1
+ "次,停" + numberend1 + "次");//


/****************************输出流*****************************************/
String address = simpleFormat.format(new Date());
OutputStream os = response.getOutputStream();// 取得输出流
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-disposition",
"attachment;filename=jzqttj_"+address+".xls");
work.write(os);
os.close();
} catch (FileNotFoundException e) {
System.out.println("文件路径错误");
e.printStackTrace();
} catch (IOException e) {
System.out.println("文件输入流错误");
e.printStackTrace();
}
return null;
}


这个大概思路就是,我把提前写好的excel模板的要遍历的那一行每个cell(单元格)的样式复制出来,然后在接下来的每行每个cell都给赋予相关的样式

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java通过模板导出excel的一个实例 的相关文章

  • 如何在java中以编程方式访问网页

    有一个网页 我想从中检索某个字符串 为此 我需要登录 单击一些按钮 填充文本框 单击另一个按钮 然后就会出现字符串 我怎样才能编写一个java程序来自动执行此操作 是否有任何有用的库用于此目的 Thanks Try HtmlUnit htt
  • setSize() 不起作用?

    我有一个程序 需要两个按钮 一个是常规按钮 另一个具有根据鼠标悬停而变化的图片 目前 由于图片很大 JButton自定义也很大 我可以更改自定义的大小并保持图像 和翻转图像 成比例吗 我尝试过 setSize 但它没有任何作用 对于任何反馈
  • 如何生成源代码来创建我正在调试的对象?

    我的典型场景 我处理的遗留代码有一个错误 只有生产中的客户端才会遇到 我附加了一个调试器并找出如何重现该问题their系统给定their输入 但是 我还不知道为什么会发生错误 现在我想在本地系统上编写一个自动化测试来尝试重现然后修复错误 最
  • Java中单击和双击的区别

    我搜索论坛并看到以下代码 public void mouseClicked MouseEvent e if e getClickCount 2 System out println and it s a double click wasDo
  • JP QL - 一对多关系中的过滤结果

    我在尝试构建 JPQL 查询时陷入困境 并希望比我拥有更多 JPA 经验的人能够提供帮助 考虑以下两个实体 class Author String name OneToMany mappedBy author Set
  • 给定一个 IP 地址列表,如何找到最小值、最大值?

    在Java中 我有一个ip地址的数组列表 我如何找到最小值和最大值 我已经使用了 Collection min 但在以下情况下它不起作用 192 168 0 1 lt min 192 168 0 250 192 168 0 9 lt max
  • HTTPURLConnection 不遵循从 HTTP 到 HTTPS 的重定向

    我不明白为什么JavaHttpURLConnection不遵循从 HTTP 到 HTTPS URL 的 HTTP 重定向 我使用以下代码来获取页面https httpstat us https httpstat us import java
  • json文件格式的升级路径

    我们将 Java 应用程序的用户首选项存储在 JSON 文件中 使用Jackson http jackson codehaus org 随着我们继续开发该应用程序 我们将添加首选项 重命名首选项并删除过时的首选项 当用户将应用程序升级到下一
  • VBA 中的 If 和 Or 多个语句

    我想将包含 14 列的 Excel 文件重新分配到正确的列 包含 12 000 行 为此 我必须使用一些 If And Or 语句将数字放入矩阵中 但显然我没有从中得到正确的东西 它使我的所有单元格为零 而具有值的单元格应保留该值 我哪里出
  • 动态更新 LookAndFeel 值

    我希望能够动态更新 Swing GUI 的 LookAndFeel 属性 在本例中 我有一个简单的 Swing Awt 游戏 运行最初为 Nimbus 的游戏LookAndFeel 在启动后的各个时刻 我只想更改 比方说 一个细节 应用程序
  • “传输协议线程失败” – “套接字为 EOF”,使用 Java 进行 J2SSH 连接

    我正在尝试通过我的 Java 代码建立 SSH 连接 但遇到异常 我通过 Putty Winscp 工具测试了我的连接 它工作正常 问题出在我的 Java 代码上 SEVERE The Transport Protocol thread f
  • 更改 WireMock __files 目录

    来自docs http wiremock org docs stubbing 要从文件中读取正文内容 请将文件放在 files 下 目录 默认情况下 这应该位于 src test resources 下 从 JUnit 规则运行时 当独立运
  • 如何在调整大小时更改 JLabel 字体大小以填充 JPanel 可用空间?

    这里有一个类似的问题 如何更改 JLabel 的字体大小以获取最大大小 https stackoverflow com questions 2715118 how to change the size of the font of a jl
  • 调整 Java 类以提高 CPU 缓存友好性

    在设计java类时 对于实现CPU缓存友好性有哪些建议 到目前为止我学到的是应该尽可能多地使用 POD 即 int 而不是整数 这样 在分配包含对象时 数据将被连续分配 例如 class Local private int data0 pr
  • 如何在 JUnit 中缩短(或隐藏)包名称?

    我在 JUnit 中有很长的包名称 这使得很难看到正在运行哪些测试 不幸的是 使用 Eclipse 的 缩写包名称 不起作用 有没有办法隐藏或者最好缩短它们 None
  • 无法实例化类对象的类型 (Java)

    这是我收到错误的代码 在 new 之后的第二个 Killer 处 String classes new String 5 kills 0 Brian Moser kills 1 James Doakes kills 2 Lila Tourn
  • 告诉 JAXB 使用注释将 解组为 Date 类

    将 JAXB 与 Java First 一起使用时 类型的字段 属性java util Date编组和解编为xs dateTime一切都按预期进行 但是如果字段 属性的类型是Object JAXB 解组xs dateTimeto XMLGr
  • 在单元格中查找以逗号分隔的多个值并返回以逗号分隔的多个值

    如果有人可以帮忙的话 我们将此表称为 1 我想在此处执行查找 可以将工作表 2 中 B 列的值引入工作表 1 中的 B 列 返回的多个值也应该用逗号分隔 我在这里尝试使用 textjoin 公式 但它搞砸的地方是 例如它将 A12 计为 A
  • 按字母顺序对组合框值进行排序

    我的 Excel 用户表单中有一个组合框 按字母顺序排序的最简单方法是什么 它的值是在 vba 中硬编码的 新的值只是添加到底部 因此它们不按任何顺序排列 当前正在使用用户表单 以便我们的用户可以将数据从我们的数据库导入到 Excel 中
  • Spring验证非空元素的字符串列表

    我有一个模型类 其中包含字符串列表 该列表可以为空 也可以包含元素 如果它有元素 这些元素不能为空 举个例子 假设我有一个名为 QuestionPaper 的类 它有一个 QuestionId 列表 其中每个都是一个字符串 class Qu

随机推荐

  • linux环境下常用的查找命令find、which、grep

    文章目录 前言find命令格式具体示例 locate命令格式具体示例 whereis命令格式具体示例 which命令格式具体示例 grep命令格式具体示例 总结 前言 查找是运维工作的很重要的一部分 xff0c 不管是文件查找 xff0c
  • 网络编程学习(9)/ FTP项目(3) ——目录切换、目录查看功能

    网络编程学习 xff08 9 xff09 FTP项目 xff08 3 xff09 目录切换 目录查看功能 调用功能函数以及对参数数量进行判断客户端 96 server 文件夹下 FTPClient py 96 状态码的变化服务端 96 li
  • [入门] 用java输出一个HelloWorld并运行

    你好 陌生人 今天是我第一次写博客 内容与知识等方面都不成熟 请见谅 如何在java里运行一个HelloWorld文本 首先 创建一个记事本 取名为HelloWorld 后缀名为java 然后打开记事本输入 public class Hel
  • 标识符与数据类型

    标识符 Java 语言中 xff0c 对各种变量 方法和类等要素命名时使用的字符序列称为标识符 Java 标识符有如下命名规则 xff1a 标识符由字母 下划线 美元符 或数字组成 标识符应以字母 下划线 美元符开头 Java 标识符大小写
  • 线程运行的几个状态

    1 创建状态 New 创建一个新的线程对象 已经有了空间和其他资源 2 就绪状态 Runnable 属于等待状态或可运行状态 若其他线程调用了该对象start 方法 从而启动线程 处于就绪状态的线程 等待cpu的使用权限执行 3 阻塞状态
  • Javaweb转发

    概念 请求转发 xff1a request getRequestDispatcher 要转发的URL地址 forward request response 是一次请求 xff0c 转发后请求对象会保存 xff0c 但是它的地址不会发生变化
  • Javaweb重定向

    概念 首先向客户浏览器发送一个http请求 当服务器接收后发送一个响应状态码302 对应一个新的浏览器地址 新的浏览器地址发现有一个302响应状态码 跳转到对应地址 可以这样理解 浏览器要访问oneServlet 可是oneServlet搬
  • 面试题总结(一)

    1 char型变量中能不能存贮一个中文汉字 为什么 char型变量是用来存储Unicode编码的字符的 xff0c unicode编码字符集中包含了汉字 xff0c 所以 xff0c char型变量中当然可以存储汉字啦 不过 xff0c 如
  • SSM整合

    什么是ssm 通常指的是spring springmvc和mabatis 1 xff09 Spring Spring 是一个开源框架 xff0c Spring 是于 2003 年兴起的一个轻量级的 Java 开发框架 xff0c 由 Rod
  • 在这个艰难的环境下,我裸辞了

    2022年 xff0c 疫情期间 xff0c 工作了22年的我 xff0c 从软件研发管理的相关工作中 xff0c 辞职创业 xff0c 开启我的独立咨询顾问生涯 很多人不解和迷惑 xff0c 也有朋友关切的询问我的近况 xff0c 就差用
  • 反射的简要

    什么是反射 Java反射机制是在运行状态中 xff0c 对于任意一个类 xff0c 都能够知道这个类的所有属性和方法 xff0c 对于任意一个对象 xff0c 都能够调用它的任意一个方法和属性 xff0c 这种动态获取的信息以及动态调用对象
  • Lenovo system X3650 M5安装Windows Server 2008 R2简易教程

    目标 xff1a 在Lenovo System X3650上安装Windows Server 2008 R2 xff08 建议安装windows server 2012 R2 xff09 准备工具 U盘和空白光盘 xff0c DVD刻录机
  • 空间相关分析(一) 空间权重矩阵

    之前的博客分享了各行政区shp文件的制作方法 xff0c 在拿到shp文件后就可以进行空间相关分析啦 今天来介绍一下相关理论的基础 空间权重矩阵的创建 目录 定义介绍Geoda创建空间权重矩阵Arcgis创建空间权重矩阵 定义介绍 根据地理
  • 加深对RxJava线程切换的理解之ObserveOn和SubscribeOn

    这几天看到一篇些文章 xff0c 关于RxJava线程切换的 xff0c 说到RxJava的线程切换 xff0c 就一定会涉及ObserveOn和SubscribeOn两个方法 网上对于ObserveOn和SubscribeOn的调用顺序
  • 记录一次kali linux的安装以及远程桌面的配置

    1 选择图形界面安装 2 简单起见 xff0c 选择中文 xff0c 英文的同理 xff1a 3 毫无疑问选择中国 4 汉语 xff1a 5 这里我会点击取消选择手动配置网络 以上是我的网络配置 xff0c 请依据需要自己进行自己的网络配置
  • 【数据库】SQL sever常用快捷键

    我常用的 xff1a ctrl 43 e xff1a 执行 ctrl 43 k 43 c xff1a 注释 ctrl 43 k 43 u xff1a 取消注释 ctrl 43 f xff1a 快速查找 ctrl 43 h xff1a 快速替
  • java中Collections常用方法总结(包括sort,copy,reverse等)

    1 sort Collection 方法的使用 含义 xff1a 对集合进行排序 strong 例 xff1a 对已知集合c进行排序 strong public class Practice public static void main
  • Java编写的查找一个字符串在另一个字符串中出现的次数

    span class token keyword public span span class token keyword static span span class token keyword int span span class t
  • java调用chatGpt API接口代码实操

    话不多说 xff0c 直接上代码 span class token keyword import span span class token namespace java span class token punctuation span
  • java通过模板导出excel的一个实例

    写之前 xff0c 大家请先下好poi的相关jar包 xff0c 网上遍地都是 xff0c 不多说 lt input type 61 34 button 34 id 61 34 exportBtn 34 class 61 34 Common