生成 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 {

    @Autowired
    private 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

时间: 2024-10-12 03:36:34

生成 excel 直接用 httpServletResponse 输出的相关文章

java生成excel表格和pdf并实现下载弹出框

今天在pdf和excel中都实现了在浏览器弹出下载框 将之前在网上查找的生成excel表格代码稍微修改下: public class CreateSimpleExcelToDisk { /** * @功能:手工构建一个简单格式的Excel */ private static List<News> getNews() throws Exception { List<News> data = new ArrayList<News>(); NewsDao dao = new

PHP 使用 PHPExcel 库生成 Excel 文件

PHPExcel 是用来操作Office Excel 文档的一个PHP类库,它基于微软的OpenXML标准和PHP语言.可以使用它来读取.写入不同格式的电子表格,如 Excel (BIFF) .xls, Excel 2007 (OfficeOpenXML) .xlsx, CSV, Libre/OpenOffice Calc .ods, Gnumeric, PDF, HTML等等 调用代码示例: $php_excel = new PHPExcel(); $properties = $php_exc

extjs4 前台导出grid数据 生成excel,数据量大后台无法接收到数据

最近做的一个web项目使用的是extsj4 框架,需要一个导出excel功能,通过extjs4 自带的导出方法实现.在前台生成excel的代码,form提交传递到后台输出.前台grid数据超过1000行后导出数据后台无法接收.网上搜索了很多是tomcat传输数据大小默认为2m导致的,将tomcat的server.xml中的 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20

java生成Excel及操作Excel

JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该API非Windows操作系统也可以通过纯Java应用来处理Excel数据表.因为它是使用Java编写的,所以我们在Web应用中可以通过JSP.Servlet来调用API实现对Excel数据表的访问. 下载: 官方网站 http://www.andykhan.com/jexcelapi/ 下载最新版本(本人下的是jexcelapi_2_6

java使用f1j9swing来生成excel文件

工程需要引入 f1j9swing.jar包 package sinosoft_xsy; import java.io.IOException; import com.f1j.ss.BookModelImpl; import com.f1j.ss.CellFormat; import com.f1j.ss.Constants; import com.f1j.ss.WriteParams; import com.f1j.util.F1Exception; public class Sinosoft

如何在扫描完二维码后, 直接用Facebook App进到粉丝专页而不是网页版

假设我们推广了一枚二维码, 用户扫面二维码就用通过手机浏览器进入点专页,而不是facebook app, 是不是觉得很麻烦呢? 有没有办法解决呢?答案当然是有的! 一.取得Facebook粉丝专页id 代码 首先我们必须取得Facebook id 代码才能完成后面的动作,一般来说如果你的粉丝专页还没有取短网址的话, 你可以直接在网址列中就可以找到你的Facebook粉丝专页的id(如图红框所示) 但如果你已经取了短网址, 那你必须在网址列输入http://graph.facebook.com/{

使用PHP Excel类读取和生成excel文件

使用PHP来生成Excel的方法有很多,比如使用最简单的回车符,制表符来生成,或者直接使用html 的table格式,但这些方式兼容性都有所欠缺.测试了一下PHPExce类,发现太l强大了,可以输出非常复杂的excel表格,另外说一下还可以读取 Excel文件.闲话少说,放出简要代码: <?php require_once './Classes/PHPExcel.php'; $objExcel = new PHPExcel();   $objWriter = new PHPExcel_Write

通过 NPOI 生成 Excel

HSSFWorkbook hssfworkbook; ISheet sheet1; public void BuildExcel() { hssfworkbook = new HSSFWorkbook(); // 新建一个Excel页签 sheet1 = hssfworkbook.CreateSheet("Sheet1"); // 创建新增行 for (var i = 0; i < 10;i++ ) { IRow row1 = sheet1.CreateRow(i); for (

直接用SQL语句把DBF导入SQLServer

直接用SQL语句把DBF导入SQLServer   在SQLServer中执行 SELECT * into bmk FROM OpenDataSource( ’Microsoft.Jet.OLEDB.4.0’,’Data Source=”e:share”;User ID=Admin;Password=;Extended properties=dBase 5.0’)...bmk 这样就可以把e:share中的bmk.dbf表导入到Sqlserver中, 速度是最快的 ---------------