`

web项目导出excel表格

 
阅读更多
该功能涉及到两个知识点,一是制作excel相关插件的使用,二是导出文件,spring-mvc该如何配置
先说excel插件的使用,这次使用的是org.apache.poi包,版本是3.9,下面粘完整能运行的代码
maven依赖
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.9</version>
</dependency>

插件的实体类,也可以理解为参数,这里采用了build设计模式,好处是初始化了一些默认值,使用的时候代码写的方便。针对表格导出,我觉得三个参数足够了,标题、表头以及数据,所以,这三个参数构造方法我设计的必传,其它使用默认参数
package com.util;

import java.util.List;

public class ExcelParam {
    String name;
    int width;
    String font;
    String[] headers;
    /**
     * 导出数据的样式
     * 1:String left;
     * 2:String center
     * 3:String right
     * 4 int  right
     * 5:float ###,###.## right
     * 6:number: #.00% 百分比 right
     */
    int[] ds_format;
    /**
     * 每列表格的宽度,默认为256 * 14
     */
    int[] widths;
    List<String[]> data;

    private ExcelParam() {

    }
    //使用Builder模式,设置默认参数和必填参数
    public static class Builder {
        String name;
        int width = 256 * 14;
        String font = "微软雅黑";
        String[] headers;
        int[] ds_format;
        int[] widths;
        List<String[]> data;

        public Builder(String name) {
            this.name = name;
        }

        public Builder font(String font) {
            this.font = font;
            return this;
        }

        public Builder width(int width) {
            this.width = width;
            return this;
        }

        public Builder headers(String[] headers) {
            this.headers = headers;
            return this;
        }

        public Builder ds_format(int[] ds_format) {
            this.ds_format = ds_format;
            return this;
        }

        public Builder widths(int[] widths) {
            this.widths = widths;
            return this;
        }

        public Builder data(List<String[]> data) {
            this.data = data;
            return this;
        }

        public ExcelParam build() {
            ExcelParam excelParam = new ExcelParam();
            excelParam.name = this.name;
            excelParam.data = this.data;
            excelParam.widths = this.widths;
            excelParam.ds_format = this.ds_format;
            excelParam.headers = this.headers;
            excelParam.font = this.font;
            excelParam.width = this.width;
            return excelParam;
        }
    }
}
package com.ucredit.util;

import org.apache.poi.hssf.usermodel.*;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;

public class ExcelUtil {
    private ExcelUtil() {
    }

    public static void export(ExcelParam excelParam, HttpServletResponse response) throws IOException {
        if (excelParam.widths == null) {
            excelParam.widths = new int[excelParam.headers.length];
            for (int i = 0; i < excelParam.headers.length; i++) {
                excelParam.widths[i] = excelParam.width;
            }
        }
        if (excelParam.ds_format == null) {
            excelParam.ds_format = new int[excelParam.headers.length];
            for (int i = 0; i < excelParam.headers.length; i++) {
                excelParam.ds_format[i] = 1;
            }
        }
        //创建一个工作薄
        HSSFWorkbook wb = new HSSFWorkbook();
        //创建一个sheet
        HSSFSheet sheet = wb.createSheet("excel");
        int rowCount = 0;
        if (excelParam.headers != null) {
            HSSFRow row = sheet.createRow(rowCount);
            //表头样式
            HSSFCellStyle style = wb.createCellStyle();
            HSSFFont font = wb.createFont();
            font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
            font.setFontHeightInPoints((short) 11);
            style.setFont(font);
            style.setAlignment(HSSFCellStyle.ALIGN_CENTER);

            for (int i = 0; i < excelParam.headers.length; i++) {
                sheet.setColumnWidth(i, excelParam.widths[i]);
                HSSFCell cell = row.createCell(i);
                cell.setCellValue(excelParam.headers[i]);
                cell.setCellStyle(style);
            }
            rowCount++;
        }
        HSSFCellStyle style = wb.createCellStyle();
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        //表格主体  解析list
        for (int i = 0; i < excelParam.data.size(); i++) {  //行数
            HSSFRow row = sheet.createRow(rowCount);
            for (int j = 0; j < excelParam.headers.length; j++) {  //列数
                HSSFCell cell = row.createCell(j);
                cell.setCellValue(excelParam.data.get(i)[j]);
                cell.setCellStyle(style);
            }
            rowCount++;
        }
        //设置文件名
        String fileName = excelParam.name + ".xls";
        response.setContentType("application/vnd.ms-excel");
        response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
        response.setHeader("Pragma", "No-cache");
        OutputStream outputStream = response.getOutputStream();
        wb.write(outputStream);
        outputStream.flush();
        outputStream.close();
    }
}

其实从这个方法就能看出,文件最后导出,实际上是往response中的outputStream中写入文件,之后的工作是由浏览器来完成的
controller层写法
    @RequestMapping(value = "download")
    public void download(@RequestParam String username,
                         @RequestParam String operation_module,
                         @RequestParam String operation_type,
                         @RequestParam String start_time,
                         @RequestParam String end_time,
                         HttpServletResponse response) throws Exception {
        List<OperationLogEntity> list = operationLogDao.get(username, operation_module, operation_type, start_time, end_time);
        String[] heads = {"序号", "账号", "姓名", "操作类型", "操作模块", "处理员工号码", "处理结果", "登录IP", "时间", "所在城市"};
        List<String[]> data = new LinkedList<>();
        for (int i = 0; i < list.size(); i++) {
            OperationLogEntity entity = list.get(i);
            String[] temp = new String[10];
            temp[0] = String.valueOf(i + 1);
            temp[1] = entity.getUsername();
            temp[2] = entity.getName();
            temp[3] = entity.getOperation_type();
            temp[4] = entity.getOperation_module();
            temp[5] = entity.getProcess_number();
            temp[6] = entity.getProcess_result();
            temp[7] = entity.getIp();
            temp[8] = DateUtils.getDateBeforeOrAfterStrCN(entity.getOperation_time(), 0);
            temp[9] = entity.getCity();
            data.add(temp);
        }
        ExcelParam param = new ExcelParam.Builder("操作日志").headers(heads).data(data).build();
        ExcelUtil.export(param, response);
    }

实际使用
//这样写很简洁
ExcelParam param = new ExcelParam.Builder("操作日志").headers(heads).data(data).build();
分享到:
评论

相关推荐

    2010-2023年新质生产力测算dofile.do

    1、资源内容地址:https://blog.csdn.net/2301_79696294/article/details/144633369 2、数据特点:今年全新,手工精心整理,放心引用,数据来自权威,且标注《数据来源》,相对于其他人的控制变量数据准确很多,适合写论文做实证用 ,不会出现数据造假问题 3、适用对象:大学生,本科生,研究生小白可用,容易上手!!! 4、课程引用: 经济学,地理学,城市规划与城市研究,公共政策与管理,社会学,商业与管理

    DBN-ELM深度置信网络融合极限学习机多输入单输出回归预测(Matlab完整源码和数据)

    1.Matlab实现DBN-ELM深度置信网络融合极限学习机多输入单输出回归预测(Matlab完整源码和数据)。 2.输出对比图、误差图,运行环境Matlab2023b及以上。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 5.作者介绍:机器学习之心,博客专家认证,机器学习领域创作者,2023博客之星TOP50,主做机器学习和深度学习时序、回归、分类、聚类和降维等程序设计和案例分析,文章底部有博主联系方式。从事Matlab、Python算法仿真工作8年,更多仿真源码、数据集定制私信.

    2024 Java offer 收割指南.pdf

    2024 Java offer 收割指南.pdf

    2011-2023年各省金融监管水平数据(含原始数据+计算过程+计算结果)

    2011-2023年各省金融监管水平数据(含原始数据+计算过程+计算结果) 1、时间:2011-2023年 2、来源:国家统计J、统计NJ 3、指标:金融业增加值、金融监管支出、金融监管水平 4、计算方法:金融监管水平=金融监管支出/金融业增加值

    花生好坏缺陷识别数据集,7262张图片,支持coco json格式的标注,识别准确率在95.7%

    花生好坏缺陷识别数据集,7262张图片,支持coco json格式的标注,识别准确率在95.7% 两种标签: Good,Bad 花生好坏缺陷识别数据集,7262张图片,支持yolo,coco json,pasical voc xml格式的标注,识别准确率在95.7% 详情查看地址:https://backend.blog.csdn.net/article/details/144983881

    Java项目-基于SSM的进销存管理系统.zip

    Java项目-基于SSM的进销存管理系统

    学术海报模板.pptx

    学术海报模板

    基于springboot+vue的基于工程教育认证的计算机课程管理平台(Java毕业设计,附源码,部署教程).zip

    该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:HTML + Vue.js 后端框架:Spring Boot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven

    毕业设计基于Python+vue的共享单车时空数据分析与管理系统源码.zip

    毕业设计基于Python+vue的共享单车时空数据分析与管理系统源码.zip,个人大四毕业设计项目、经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 毕业设计基于Python+vue的共享单车时空数据分析与管理系统源码.zip毕业设计基于Python+vue的共享单车时空数据分析与管理系统源码.zip毕业设计基于Python+vue的共享单车时空数据分析与管理系统源码.zip毕业设计基于Python+vue的共享单车时空数据分析与管理系统源码.zip毕业设计基于Python+vue的共享单车时空数据分析与管理系统源码.zip毕业设计基于Python+vue的共享单车时空数据分析与管理系统源码.zip毕业设计基于Python+vue的共享单车时空数据分析与管理系统源码.zip毕业设计基于Python+vue的共享单车时空数据分析与管理系统源码.zip毕业设计基于Python+vue的共享单车时空数据分析与管理系统源码.zip毕业设计基于Pytho

    基于支持向量机的语音情感识别MATLAB代码

    matlab代码资源。基于支持向量机的语音情感识别MATLAB代码。基于支持向量机(SVM)的语音情感识别是一种监督学习技术,它通过在特征空间中寻找最优分割超平面来区分不同情感类别。SVM算法通过最大化分类边界的间隔,提高模型的泛化能力,有效处理高维语音特征数据。这种方法能够识别语音中的情感特征,如快乐、悲伤或愤怒,广泛应用于呼叫中心情感分析和人机交互系统。

    单相PET电力电子变压器 输入级单相pwm整流器双闭环控制 输出400V 中间级移相全桥 输出500V 输出级单相逆变器 220交流电 开关频率10k

    单相PET电力电子变压器 输入级单相pwm整流器双闭环控制 输出400V 中间级移相全桥 输出500V 输出级单相逆变器 220交流电 开关频率10k

    基于springboot的点餐平台网站lw+ppt

    包含项目论文和毕业答辩PPT,详情请看博客:https://blog.csdn.net/2401_87429224/article/details/144995193 论文主要包括以下内容: 1、中英文摘要; 2、目录; 3、绪论,包括背景、意义、开发工具、国内外现状等; 4、系统分析,包括可行性分析、设计原则、需求分析、业务流程分析等; 5、系统设计,包括功能设计、数据库设计等; 6、系统实现,包括各模块实现; 7、软件测试,包括测试环境、测试条件、运行情况等。

    Android天气预报APP

    在Android平台上开发一款天气预报应用是一项常见的任务,它涉及到多个技术层面,包括用户界面设计、数据获取、数据解析以及实时更新等。以下是对这个"较简单的天气预报APP"可能涉及的关键知识点的详细解释: 1. **Android Studio**:作为Android应用开发的主要集成开发环境(IDE),Android Studio提供了丰富的工具来帮助开发者编写、调试和发布应用。它内置了Gradle构建系统,使得项目管理和依赖管理更加方便。 2. **布局设计**:UI设计是天气应用的重要部分,通常会使用XML布局文件来定义各个屏幕的组件和布局。例如,可能包含一个用于显示城市名的TextView,一个用于展示当前温度的ImageView,以及用于显示未来几天预报的RecyclerView。 3. **数据获取**:天气信息通常来自于网络API,如OpenWeatherMap或AccuWeather等。开发者需要编写HTTP请求代码,使用像OkHttp或者Retrofit这样的网络库来获。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    云计算的文件,上次漏的

    云计算的文件,上次漏的

    基于springboot+vue的知识管理系统(Java毕业设计,附源码,部署教程).zip

    该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:HTML + Vue.js 后端框架:Spring Boot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven

    永磁同步电机+SMO滑膜观测算法+simulink仿真

    永磁同步电机+SMO滑膜观测算法+simulink仿真

    hi3518e-v200 demo

    hi3518e-v200 demo

    UE与网页交互的WebUI插件和像素流插件发参收参写法

    使用WebUI插件,UE与网页发参收参写法; 使用像素流插件,UE与网页发参收参写法。

    2种方法SCL编写和CFC编写5个电机逆启顺停的顺控程序 方法一:使用西门子的电机功能块和联锁块编写5个电机逆启顺停的顺控程序 方法二、使用SCL编写逆启顺停的功能块,然后在CFC调用,采用SFC方式

    2种方法SCL编写和CFC编写5个电机逆启顺停的顺控程序 方法一:使用西门子的电机功能块和联锁块编写5个电机逆启顺停的顺控程序 方法二、使用SCL编写逆启顺停的功能块,然后在CFC调用,采用SFC方式连线,构成逆启顺停功能程序

Global site tag (gtag.js) - Google Analytics