生成 excel 直接用 httpServletResponse 输出

  之前写过一篇文章 《超详细的java生成excel文件并下载》,该文章虽然够详细,也行得通,但还是有一定的缺陷,该文章可以拆分成两个部分,一是指定位置生成excel文件,二是根据地址下载文件。缺陷的部分是会产生中间文件,而这个中间文件我们并不需要,如果每次下载的时候都会生成一个这样的文件,那久而久之岂不是浪费空间,而且生成文件之后再读取输出这样也耗时间。所以今天就对之前的文章进行优化处理下。

        

package com.test.demo.controllers;import com.test.demo.domain.entities.Address;
import com.test.demo.services.ExcelService;
import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.format.Colour;
import jxl.format.*;
import jxl.format.VerticalAlignment;
import jxl.write.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.List;/*** @author dyh* @create 2018-11-15 下午10:20* @desc excle表格功能编写**/
@RestController
@RequestMapping("/excel")
public class ExcelController {@Autowiredprivate ExcelService excelService;/*** 下载文件** @return*/@RequestMapping({"/download"})public void download() {ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletResponse response = requestAttributes.getResponse();HttpServletRequest request = requestAttributes.getRequest();// 文件名String filename = "地址列表.xls";OutputStream out = null;try {// 下面几行是为了解决文件名乱码的问题httpServletResponse.setHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes(), "iso-8859-1"));httpServletResponse.setContentType("application/vnd.ms-excel;charset=UTF-8");httpServletResponse.setHeader("Pragma", "no-cache");httpServletResponse.setHeader("Cache-Control", "no-cache");httpServletResponse.setDateHeader("Expires", 0);out = httpServletResponse.getOutputStream();// 创建写工作簿对象,这里直接采用流输出,而不会再生成一个文件WritableWorkbook workbook = Workbook.createWorkbook(out);// 工作表WritableSheet sheet = workbook.createSheet("地址列表", 0);// 设置字体;WritableFont font = new WritableFont(WritableFont.ARIAL, 14, WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.BLACK);WritableCellFormat cellFormat = new WritableCellFormat(font);// 设置背景颜色;
            cellFormat.setBackground(Colour.WHITE);// 设置边框;
            cellFormat.setBorder(Border.ALL, BorderLineStyle.DASH_DOT);// 设置文字居中对齐方式;
            cellFormat.setAlignment(Alignment.CENTRE);// 设置垂直居中;
            cellFormat.setVerticalAlignment(VerticalAlignment.CENTRE);// 分别给1,5,6列设置不同的宽度;sheet.setColumnView(0, 15);sheet.setColumnView(4, 60);sheet.setColumnView(5, 35);// 给sheet电子版中所有的列设置默认的列的宽度;sheet.getSettings().setDefaultColumnWidth(20);// 给sheet电子版中所有的行设置默认的高度,高度的单位是1/20个像素点,但设置这个貌似就不能自动换行了// sheet.getSettings().setDefaultRowHeight(30 * 20);// 设置自动换行;cellFormat.setWrap(true);// 单元格Label label0 = new Label(0, 0, "ID", cellFormat);Label label1 = new Label(1, 0, "省", cellFormat);Label label2 = new Label(2, 0, "市", cellFormat);Label label3 = new Label(3, 0, "区", cellFormat);Label label4 = new Label(4, 0, "详细地址", cellFormat);Label label5 = new Label(5, 0, "创建时间", cellFormat);sheet.addCell(label0);sheet.addCell(label1);sheet.addCell(label2);sheet.addCell(label3);sheet.addCell(label4);sheet.addCell(label5);// 给第二行设置背景、字体颜色、对齐方式等等;WritableFont font2 = new WritableFont(WritableFont.ARIAL, 14, WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.BLACK);WritableCellFormat cellFormat2 = new WritableCellFormat(font2);// 设置文字居中对齐方式;
            cellFormat2.setAlignment(Alignment.CENTRE);// 设置垂直居中;
            cellFormat2.setVerticalAlignment(VerticalAlignment.CENTRE);cellFormat2.setBackground(Colour.WHITE);cellFormat2.setBorder(Border.ALL, BorderLineStyle.THIN);cellFormat2.setWrap(true);// 记录行数int n = 1;// 查找所有地址List<Address> addressList = excelService.findAll();if (addressList != null && addressList.size() > 0) {// 遍历for (Address a : addressList) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String createTime = sdf.format(a.getCreateTime());Label lt0 = new Label(0, n, a.getId() + "", cellFormat2);Label lt1 = new Label(1, n, a.getProvince(), cellFormat2);Label lt2 = new Label(2, n, a.getCity(), cellFormat2);Label lt3 = new Label(3, n, a.getArea(), cellFormat2);Label lt4 = new Label(4, n, a.getAddress(), cellFormat2);Label lt5 = new Label(5, n, createTime, cellFormat2);sheet.addCell(lt0);sheet.addCell(lt1);sheet.addCell(lt2);sheet.addCell(lt3);sheet.addCell(lt4);sheet.addCell(lt5);n++;}}//开始执行写入操作
            workbook.write();//关闭流
            workbook.close();out.close();} catch (Exception e) {e.printStackTrace();}}
}    

  上面的代码就是关键的文件,至于一些其它的配置,以及可用的demo,可在前一篇文章 《超详细的java生成excel文件并下载》 上下载下来稍稍一下。

转载于:https://www.cnblogs.com/dyh2025/p/9966793.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464320.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

获取网站投资(融资成功)的20个自我检查

1、web2.0提了也白提web2.0这是一个概念&#xff0c;打着web2.0的概念&#xff0c;只是说技术如何如何2.0&#xff0c;战略如何2.0&#xff0c;其实意 义真的不大。投资人需要的是一个网民能够接受&#xff0c;并且很有特点的网站&#xff0c;能够满足网民的某个需求&#xff0…

MYSQL AB复制原理

Mysql复制&#xff08;replication&#xff09;是一个异步的复制&#xff0c;从一个Mysql instace&#xff08;称之为Master&#xff09;复制到另一个Mysql instance&#xff08;称之Slave&#xff09;。实现整个复制操作主要由三个进程完成的&#xff0c;其中两个进程在Slave&…

TCP拥塞控制详解

为了防止网络的拥塞现象 &#xff0c;TCP提出了一系列的拥塞控制机制。最初由V. Jacobson在1988年的论文中提出的TCP的拥塞控制由“慢启动(Slow start)”和“拥塞避免(Congestion avoidance)”组成&#xff0c;后来TCP Reno版本中又针对性的加入了“快速重传(Fast retransmit)”…

北航博士,研究所月入两万

大家好&#xff0c;看到张老师的一篇文章&#xff0c;说的一位研究生大哥的心路历程&#xff0c;分享给大家。作者&#xff1a;易贝贝https://www.zhihu.com/question/64371326/answer/2251105460文章转自&#xff1a;大鱼机器人北航博士&#xff0c;2019 年 7 月毕业&#xff…

分号是不是c语言的一部分,问什么C程序里总是提示缺少分号;,而明明有分号?...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼if(lpNULL)printf("********还没存入图书********\n");else{for(s0;s<5;s){while(( szp->snumber[s]!lp->number )&&(lp->next!NULL))lplp->next;if( szp->snumber[s]lp->number){printf(&…

django使用用户名或手机号码登录

django有自己的认证系统&#xff0c;会自动根据用户名和密码进行验证。如果需要使用用户名或手机登录的话&#xff0c;需要重写django的认证后台&#xff0c;并且设置到配置文件中。 重写django的认证后台 class UsernameMobileAuthBackend(ModelBackend):"""用…

ArcUser 2006第2期拾零

前天收到了上半年的两期ArcUser&#xff0c;其中第二期的主题是Imagery In GIS。这一期的“聚焦”是“Using Imagery”&#xff0c;其中包含5篇文章&#xff1a;Leverage Imagery in ArcGISMobile GIS and Digital PhotomappingThe Key to the Present is the PastUnderstandin…

工作的习惯,看到好收藏下

转载的&#xff0c;读过了感觉有收获&#xff0c;分享下。1&#xff0c;当时公司招了大批应届本科和研究生毕业的新新人类。平均年龄25岁。那个新的助理&#xff0c;是经过多次面试后&#xff0c;我亲自招回来的一个女孩。名牌大学本科毕业&#xff0c;聪明&#xff0c;性格活泼…

TCP传输过程中丢包问题

TCP协议本身是保证传输的数据完整性不会丢数据的。如果通信中发现缺少数据或者丢包&#xff0c;那么&#xff0c;最大的可能在于程序发送的过程或者接收的过程出现问题。例如服务器给客户端发大量数据&#xff0c;Send的频率很高&#xff0c;那么就有可能在Send时发生错误&…

c语言随机迷宫生成器,作为新手该如何快速上手 C++

1.C 实现基数树使用 C 实现Radix树&#xff1a;一种基于二进制表示的键值的查找树&#xff0c;尤其适合处理非常长的、可变长度的键值&#xff0c;Patricia 的基本思想是构建一个二叉树。2.C 实现并行计算的K-Means聚类算法使用 C 实现一个完整的面向对象的可并行K-Means算法。…

薪资是跳出来的,不是涨出来的!

下面的内容是转自朱老师的公众号&#xff0c;他说的观点我是认同的&#xff0c;之前在一个国外的论坛&#xff0c;有个老外总结了程序员的涨薪情况&#xff0c;里面就有提到&#xff0c;如果想拿到比较好的薪水&#xff0c;靠的还是跳槽。当然&#xff0c;他还总结了很多其他方…

团队Alpha冲刺(三)

目录 组员情况组员1(组长)&#xff1a;胡绪佩组员2&#xff1a;胡青元组员3&#xff1a;庄卉组员4&#xff1a;家灿组员5&#xff1a;凯琳组员6&#xff1a;丹丹组员7&#xff1a;家伟组员8&#xff1a;政演组员9&#xff1a;鸿杰组员10&#xff1a;刘一好组员11&#xff1a;何…

收缩数据库

http://codehunter008.cnblogs.com/archive/2005/05/08/150998.aspxhttp://wuchang.cnblogs.com/archive/2004/10/13/51835.html 转载于:https://www.cnblogs.com/passrift/archive/2006/09/26/515292.html

我的助理辞职了!——给不听话的下属看看~

喜欢收藏下&#xff0c;以后给新人看。 是本人转载的&#xff0c;与诸位分享、交流。1&#xff0c;当时公司招了大批应届本科和研究生毕业的新新人类。平均年龄25岁。那个新的助理&#xff0c;是经过多次面试后&#xff0c;我亲自招回来的一个女孩。名牌大学本科毕业&#xf…

快速排序非递归算法c语言实现,数据结构与算法----3.5 非递归的快速排序方法

[c]代码库#include using namespace std;#include using namespace std;typedef int KeyType;struct LElemType{KeyType key;};struct SElemType{int a;int b;};struct SList{LElemType *r;int length;};const int StackInitSize10;const int StackInc15;struct SStack{SElemTy…

C++类中成员变量的初始化总结

C类中成员变量的初始化总结 1. 普通的变量&#xff1a; 一般不考虑啥效率的情况下 可以在构造函数中进行赋值。考虑一下效率的可以再构造函数的初始化列表中进行。 1 class CA 2 { 3 public: 4 int data; 5 public: 6 CA(); 7 }; 8 9 CA::CA():data(0) //……#1……

今天把房子定下来了

今天同学L跟我说&#xff0c;今天付了定金&#xff0c;把买房子的事给定下了。先说下疫情这两年的房价在疫情之前&#xff0c;2019年那时候&#xff0c;深圳经历了一波房价上涨&#xff0c;那时候的房价上涨是我完全没有预料到的&#xff0c;但是在2015年房价的那一波房价上涨&…

11月16日 个人战立会议内容报告

昨天我们采访了学校学生&#xff0c;确定了软件初步的需求性。 今天是11.16&#xff0c;我们去图书馆查阅了资料。 我们的PM孙杨凯对所查询的资料进行了整理&#xff0c;成员王博武对资料进行了分析&#xff0c;我主要通过资料分析确定软件大纲&#xff0c;软件初步的功能确定。…

探讨C#中字符串的加密

探讨C#中字符串的加密C#中字符串的加密可以用DSA和RSA&#xff0c;先要将字符串转换为字节数组&#xff0c;这与编码有关。再选择签名方式&#xff0c;有RSA和DSA&#xff0c;sign便是出来的签名结果。  可以用DSA和RSA&#xff0c;如&#xff1a;using System;  using Sys…

Minify框架分析,主要功能类简介

主要功能类简介 config.php 默认缩小应用程序的配置 index.php&#xff1a;为实施默认缩小的前端控制器请勿编辑&#xff01;通过config.php和groupsConfig.php配置实用程序 Minify&#xff1a;缩小 - 联合收割机&#xff0c;minifies&#xff0c;和缓存的JavaScript和…