最近几天做公司项目,应客户需求需要将表单的数据下载本地存成.xls文件。之前做毕设的时候,就有类似这方面的功能需

求,但是当时也没有做就搁浅了下来,这次补上。



一、业务开发描述

有一个功能需求是做一了一个表格,在上方输入框栏目输入相关数据以后,点击开始计算,依照相关公式计算出数据,并存至数据库,然后点击导出数据按钮,导出数据为.xls格式的文件。

其实做这部分需求的时候,有一个领悟,发现有时候做程序是以程序员的思维去做程序,如何如何实现等,但是如果自己将来要带团队的话,对功能需求应该是以客户的角度来审查思考,这样对于功能的理解会更加透彻和更亲近于客户,毕竟好的产品是要留给客户是要的,只有做出客户满意的产品,才是最有意义的。

二、前台jsp页面及js源码相关

2.1开始计算

首先,在输入框输入数据,然后点击开始计算,在这地方遇到了一个小坑,有一个js校验方法。

校验描述:

平台考核权重+现场考核权重<=100

给这两个输入框添加onchange()事件进行校验判断:

function regs(){
var ptkhQz = $("#ptkhQz").val();
var xckcQz = $("#xckcQz").val();
//本意为:如果平台考核权重和现场考核权重都不为空,则进行下面的判断
//这地方我发现一直有bug,它总是在我输入第一个的时候就弹出校验信息,没有走第一个if判断
//后来排查发现,输入框输入的数据如果为空,其是空字符串,即""这种形式
//后来将代码重新修改为:(ptkhQz!=""&&xckcQz!="")即可成功运行
if(ptkhQz!=null&&xckcQz !=null){
if(Number(ptkhQz)+Number(xckcQz)>100){
$.alert('平台考核权重与现场考察权重值之和大于100,请重新输入!');
}
}
}

2.2数据导出

下面的表格计算出数据以后,点击数据导出功能模块,导出.xls格式的数据。

jsp:首先在页面下方添加一个隐藏的iframe标签,这样当点击数据导出的时候,弹窗。

<iframe id="hidden_frame1" style='display: none'></iframe>

js:

<script type="text/javascript">
function exportResult() {
//上方输入框输入的数据,根据id取值
var ptkhQz = $("#ptkhQz").val();
var xckcQz = $("#xckcQz").val();
//收集数据
var gridData = ajaxgrid.collectData(false,"all") ;
var dataArr = [] ;
dataArr.push(gridData) ;
//实现方式:先是执行后台exportData方法,生成excel格式的文件,然后在执行下面的download的方法,下载该excel文件
$.request({
//首先导出数据,生成一份excel文件
action:"exportData",
data:dataArr,
params:{'ptkhQz':ptkhQz, 'xckcQz':xckcQz},
success:function(response){
var filePath = response.getParameter("filePath");
//下载至本地
$("#hidden_frame1").attr("src", "gjSubsidyMoneyList.do?action=download&filePath=" + filePath);
}
}) ;
}
</script>

三、后台action

后台action实现接口:

    implements ServletResponseAware

    @Override
public void setServletResponse(HttpServletResponse arg0) {
this.response = arg0;
}

然后添加两个对象,并添加他们的set和get方法

    private HttpServletResponse response;
private String filePath;
//添加set,get方法

exportData方法,导出excel文件:

    public void exportData() throws Exception{
List<GjSubsidyMoney> dataList = dataWrap.getDataList();
String localName = ApplicationUtil.getAppConfig().getAppExtProp().get("fileTempPath") + "/" + "补贴资金.xls";
//执行servicel中的导出数据方法,传入相关参数
gjSubsidyMoneyService.exportData(xckcQz, dataList, localName);
responseData.setParameter("filePath", localName);
}

download方法,下载.xls格式的文件:

public void download() {
File file = null;
InputStream fin = null;
ServletOutputStream out = null;
try {
file = new File(filePath);
fin = new FileInputStream(file); response.setCharacterEncoding("utf-8");
response.setContentType("application/vnd.ms-excel");
String defaultname = "补贴资金.xls";
String fileName = new String(defaultname.getBytes("utf-8"), "ISO8859_1");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName); out = response.getOutputStream();
byte[] buffer = new byte[512]; // 缓冲区
int bytesToRead = -1;
// 通过循环将读入的Word文件的内容输出到浏览器中
while((bytesToRead = fin.read(buffer)) != -1) {
out.write(buffer, 0, bytesToRead);
}
} catch(Exception e) {e.printStackTrace();}
finally {
if(fin != null)
try {
fin.close();
if(out != null) out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

四、servicel中的导出数据方法及设置excel格式

public void exportData(BigDecimal ptkhQz, BigDecimal xckcQz, List<GjSubsidyMoney> dataList, String filePath) throws Exception {
HrExcelUtil excelUtil = new HrExcelUtil("补贴资金");
//创建列及列的宽度,该地方创建了20列,每个列的宽度为5
excelUtil.setColumnWidth(new int[] { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5 }); //创建行,列、行的开始行列号都是从0开始
excelUtil.createRow();
//第一行第一列的内容
excelUtil.addValue("XX年度贵州省公交优先得分说明和补贴资金分配表");
//第一行第二列的内容
excelUtil.addValue("");
excelUtil.addValue("");
excelUtil.addValue("");
excelUtil.addValue("");
excelUtil.addValue("");
excelUtil.addValue("");
excelUtil.addValue("");
excelUtil.addValue("");
excelUtil.addValue("");
excelUtil.addValue("");
excelUtil.addValue("");
excelUtil.addValue("");
excelUtil.addValue("");
excelUtil.addValue("");
excelUtil.addValue("");
excelUtil.addValue("");
excelUtil.addValue("");
excelUtil.addValue("");
excelUtil.addValue("");
//合并单元格:
//参数说明:第一个参数:合并单元格的开始行号,第二个参数:合并单元格的结束行号
//第三个参数:合并单元格的开始列号 第四个参数:合并单元格的结束列号
excelUtil.mergeRegion(0, 0, 0, 19); for (int i = 0; i < dataList.size(); i++) {
GjSubsidyMoney subsidyMoney = dataList.get(i);
//创建一行
excelUtil.createRow();
//总共有20列,从左右往右,依次给每一个列进行相关赋值操作
excelUtil.addValue(i + ""); // 序号
excelUtil.addValue(GjCommonUtil.getDropLabel(subsidyMoney.getSubsidyCity()+"")); // 城市
excelUtil.addValue(subsidyMoney.getTotalRecord() + ""); // 年度总得分
} excelUtil.createExcel(filePath);
}

至此,该功能需求实现完成。

Java方式导出EXCEL表格的更多相关文章

  1. java后端导出excel表格

    转载 :https://www.cnblogs.com/zhaoyuwei/p/9038135.html 不需要在实体类些@Excel(name = "登录名", width = ...

  2. .NET环境下导出Excel表格的两种方式和导入两种类型的Excel表格

    一.导出Excel表格的两种方式,其中两种方式指的是导出XML数据类型的Excel(即保存的时候可以只需要修改扩展名为.xls)和真正的Excel这两种. using System; using Sy ...

  3. java导出excel表格

    java导出excel表格: 1.导入jar包 <dependency> <groupId>org.apache.poi</groupId> <artifac ...

  4. Java代码导入导出 Excel 表格最简单的方法

    import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStrea ...

  5. java 实现用户自由选择字段实现导出EXCEL表格

    package com.thinkgem.jeesite.common.utils.excel; import java.io.File; import java.io.OutputStream; i ...

  6. java中使用jxl导出Excel表格详细通用步骤

    该方法一般接收两个参数,response和要导出的表格内容的list. 一般我们将数据库的数据查询出来在页面进行展示,根据用户需求,可能需要对页面数据进行导出. 此时只要将展示之前查询所得的数据放入s ...

  7. 重构:以Java POI 导出EXCEL为例

    重构 开头先抛出几个问题吧,这几个问题也是<重构:改善既有代码的设计>这本书第2章的问题. 什么是重构? 为什么要重构? 什么时候要重构? 接下来就从这几个问题出发,通过这几个问题来系统的 ...

  8. 【转载】Java导入导出excel

    转自:https://blog.csdn.net/jerehedu/article/details/45195359 目前,比较常用的实现Java导入.导出Excel的技术有两种Jakarta POI ...

  9. PHP导入导出excel表格图片(转)

    写excel的时候,我用过pear的库,也用过pack压包的头,同样那些利用smarty等作的简单替换xml的也用过,csv的就更不用谈了.呵呵.(COM方式不讲了,这种可读的太多了,我也写过利用wp ...

随机推荐

  1. hashmap有一个loadFactory为什么是0.75从泊松分布解析看看

    简述: 写这篇文章是看到网上的一篇面试题,有面试官问hashmap有一个loadFactory为什么是0.75  我先解释一下 0.75上下文,当一个hashmap初始数组大小暂时不考虑扩容情况,初始 ...

  2. C++作用域限定符:private/public与protected

    C++的作用域限定符其实涉及到了C++特性中的封装和继承. public/private:涉及类的封装特性.对于一个类需要对外展示的部分,我们可以将其声明为public,对于不希望对外展示的,我们将其 ...

  3. ASP.NET Core Controller与IOC的羁绊

    前言 看到标题可能大家会有所疑问Controller和IOC能有啥羁绊,但是我还是拒绝当一个标题党的.相信有很大一部分人已经知道了这么一个结论,默认情况下ASP.NET Core的Controller ...

  4. 第14章节 BJROBOT karto 算法构建地图【ROS全开源阿克曼转向智能网联无人驾驶车】

    建地图前说明:请确保你的小车已经校正好 IMU.角速度.线速度,虚拟机配置好 ROS 网络的前提进行,否则会造成构建地图无边界.虚拟机端无法正常收到小车主控端发布的话题数据等异常情况!! 1.把小车平 ...

  5. 3D动漫人物代码

    <div id="page_end_html"> <script src="https://eqcn.ajz.miesnfu.com/wp-conten ...

  6. Serverless 如何应对 K8s 在离线场景下的资源供给诉求

    本文整理自腾讯云云原生产品团队的专家产品经理韩沛在 Techo 开发者大会云原生专题的分享内容--Kubernetes 混部与弹性容器.本次分享主要分为三部分:基于 K8s 的应用混部.提升应用混部效 ...

  7. CopyOnWriteArrayList设计思路与源码分析

    CopyOnWriteArrayList实现了List接口,RandomAccess,Cloneable,Serializable接口. CopyOnWriteArrayList特性 1.线程安全,在 ...

  8. xtrabackup迁移mysql5.7.32

    问题描述:利用外部xtrabackup工具来做迁移mysql数据库,或者恢复数据库 xtrabackup迁移mysql 1.环境 mysql源库 mysql目标迁移库 IP 192.168.163.3 ...

  9. 【MYSQL】MySQL5.6.37二进制安装

    最近有个项目要用到mysql 于是在mysql的论坛中找到了一个5.6.37版本的 下面介绍怎么安装和使用mysql 下载地址: https://dev.mysql.com/downloads/mys ...

  10. oracle 存储过程和包的权限

    GRANT CREATE ANY PROCEDURE TO MONKEY --創建,查看,替換的權限 GRANT EXECUTE ANY PROCEDURE TO MONKEY --執行和查看的權限 ...