当前位置:

首页 > 编程开发 > 如何从服务端使用Java下载Excel模板文件?

如何从服务端使用Java下载Excel模板文件?

方法一生成excel模板@RequestMapping("/downloadExcel")publicvoiddownloadExcel(HttpServletResponseresponse,HttpServletRequestrequest){String[]excelHeader={"姓名","手机号(必填)","渠道名","产品名","手机操作系统(IOS/安卓)","是否是XX数据"};Listlist=newArrayList();Object[]obj1={"张三","173*****311

本文目录

    方法一

    生成excel模板

    @RequestMapping("/downloadExcel")
    public void downloadExcel(HttpServletResponse response, HttpServletRequest request) {
            String [] excelHeader = {"姓名","手机号(必填)","渠道名","产品名","手机操作系统(IOS/安卓)","是否是XX数据"};
            List list = new ArrayList<>();
            Object[] obj1 = {"张三","173*****311‬","a1","A","IOS","是"};
            Object[] obj2 = {"李四","138*****742","a2","B","安卓","否"};
            list.add(obj1);
            list.add(obj2);
            FileExport.exportExcel(excelHeader, list, "XXX模板", response, request);
        }

    FileExport工具类:

    package com.abc.common.utils.file;
    
    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFCellStyle;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.hssf.util.HSSFColor;
    import org.apache.poi.ss.usermodel.BorderStyle;
    import org.apache.poi.ss.usermodel.Font;
    import org.apache.poi.ss.usermodel.HorizontalAlignment;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.UnsupportedEncodingException;
    import java.net.URLEncoder;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.List;
    import java.util.Map;
    
    /**
     * 文件导出工具
     * @author abc
     * @date 2019/01/08
     */
    public class FileExport {
        
        private static final Logger logger = LoggerFactory.getLogger(FileExport.class);
    
        /** CSV文件列分隔符 */
        private static final String CSV_COLUMN_SEPARATOR = ",";
    
        private static final String CSV_COLUM_TABLE = "\t";
    
        /** CSV文件列分隔符 */
        private static final String CSV_RN = "\r\n";
    
        /**
         * 导出Excel文件
         * 
         * @param excelHeader
         *            导出文件中表格头
         * @param list
         *            导出的内容
         * @param response
         *            HttpServletResponse对象,用来获得输出流向客户端写导出的文件
         * @param sheetName
         *            Excel的sheet名称,加上时间戳作为导出文件的名称
         */
        public static void exportExcel(String [] excelHeader, List list, String sheetName, HttpServletResponse response, HttpServletRequest request) {
            HSSFWorkbook wb = new HSSFWorkbook();
            HSSFSheet sheet = wb.createSheet(sheetName);
            HSSFRow row = sheet.createRow((int) 0);
            /******设置单元格是否显示网格线******/
            sheet.setDisplayGridlines(false);
            
            /******设置头单元格样式******/
            HSSFCellStyle style = wb.createCellStyle();
            style.setAlignment(HorizontalAlignment.CENTER);
            Font fontHeader = wb.createFont();
            fontHeader.setBold(true);
            fontHeader.setFontHeight((short) 240);
            style.setFont(fontHeader);
            style.setBorderBottom(BorderStyle.THIN);
            style.setBorderLeft(BorderStyle.THIN);
            style.setBorderRight(BorderStyle.THIN);
            style.setBorderTop(BorderStyle.THIN);
            
            /******设置头内容******/
            for (int i = 0; i < excelHeader.length; i++) {
                HSSFCell cell = row.createCell(i);
                cell.setCellValue("  " +excelHeader[i] + "  ");
                cell.setCellStyle(style);            
            }   
            
            /******设置内容单元格样式******/
            HSSFCellStyle styleCell = wb.createCellStyle();
            Font fontCell = wb.createFont();
            fontCell.setColor(HSSFColor.BLACK.index);
            styleCell.setAlignment(HorizontalAlignment.CENTER);
            styleCell.setFont(fontCell);
            styleCell.setBorderBottom(BorderStyle.THIN);
            styleCell.setBorderLeft(BorderStyle.THIN);
            styleCell.setBorderRight(BorderStyle.THIN);
            styleCell.setBorderTop(BorderStyle.THIN);
            /******设置单元格内容******/
            for (int i = 0; i < list.size(); i++) {
                row = sheet.createRow(i + 1);
                /******设置行高******/
                row.setHeightInPoints(20);
                Object[] obj = (Object[]) list.get(i);            
                for (int j = 0; j < excelHeader.length; j++) {
                    styleCell.setWrapText(false);
                    HSSFCell cell = row.createCell(j);
                    if (obj[j] != null){
                         cell.setCellValue(obj[j].toString());
                    }else{
                        cell.setCellValue(""); 
                    }            
                    //if(obj[j].toString().length()>20)
                    //    styleCell.setWrapText(true);
                    cell.setCellStyle(styleCell);
                    sheet.autoSizeColumn(j);
                }   
            } 
            
            OutputStream ouputStream = null;
            try {
                
                String encoding = "UTF-8";
                /** 获取浏览器相关的信息 */
                String userAgent = request.getHeader("user-agent");
                /** 判断是否为msie浏览器 */
                if (userAgent.toLowerCase().indexOf("msie") != -1){
                     encoding = "gbk";
                }
    
                response.setCharacterEncoding(encoding);
                response.setContentType("application/vnd.ms-excel"); 
                String fileName = sheetName;
                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMMSS");
                fileName += (dateFormat.format(new Date())).toString()+".xls";
                response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, encoding));
                ouputStream = response.getOutputStream();   
                wb.write(ouputStream);     
                ouputStream.flush();  
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    if(ouputStream!=null) {
                        ouputStream.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    
        /**
         * 导出CSV文件
         * @param dataList 集合数据
         * @param colNames 表头部数据
         * @param mapKey 查找的对应数据
         */
        public static boolean doExport(List> dataList, String colNames, String mapKey, OutputStream os) {
            try {
                StringBuffer buf = new StringBuffer();
    
                String[] colNamesArr = null;
                String[] mapKeyArr = null;
    
                colNamesArr = colNames.split(",");
                mapKeyArr = mapKey.split(",");
    
                /******完成数据csv文件的封装******/
                /******输出列头******/
                for (int i = 0; i < colNamesArr.length; i++) {
                    buf.append(colNamesArr[i]).append(CSV_COLUMN_SEPARATOR);
                }
                buf.append(CSV_RN);
    
                if (null != dataList) {
                    /******输出数据******/
                    for (int i = 0; i < dataList.size(); i++) {
                        for (int j = 0; j < mapKeyArr.length; j++) {
                            buf.append(dataList.get(i).get(mapKeyArr[j])).append(CSV_COLUM_TABLE).append(CSV_COLUMN_SEPARATOR);
                        }
                        buf.append(CSV_RN);
                    }
                }
                /******写出响应******/
                os.write(buf.toString().getBytes("GBK"));
                os.flush();
                return true;
            } catch (Exception e) {
                logger.error("doExport错误...", e);
            }
            return false;
        }
        
        /**
         * 设置响应格式
         * @param fileName
         * @param response
         * @throws UnsupportedEncodingException
         */
        public static void responseSetProperties(String fileName, HttpServletResponse response) throws UnsupportedEncodingException {
            /******设置文件后缀******/
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
            String fn = fileName + sdf.format(new Date()).toString() + ".csv";
            /******读取字符编码******/
            String utf = "UTF-8";
    
            /******设置响应******/
            response.setContentType("application/ms-txt.numberformat:@");
            response.setCharacterEncoding(utf);
            response.setHeader("Pragma", "public");
            response.setHeader("Cache-Control", "max-age=30");
            response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fn, utf));
        }
    }

    导出CSV文件

    @GetMapping("/exportFailureRecord")
    public void exportFailureRecord(String batchNumber, HttpServletResponse response) {
            if (StringUtils.isBlank(batchNumber)) {
                log.warn("失败记录导出失败,批次号为空...");
                return;
            }
    
            //这里根据你的业务查询出数据
            List list = importFailureRecordService.selectList(new EntityWrapper()
                    .eq("is_delete", 0)
                    .eq("batch_number", batchNumber));
            if (CollectionUtil.isEmpty(list)) {
                log.warn("未查询到可导出的数据...");
                return;
            }
            log.info("===========查询到{}条可导出数据==============", list.size());
    
            String sTitle = "用户姓名,手机号,失败原因";
            String fName = "xxx失败记录数据_";
            String mapKey = "userName,userPhone,failureReason";
    
            List> dataList = new ArrayList<>();
            for (ImportFailureRecord data : list) {
                Map map = new HashMap<>();
                map.put("userName", data.getUserName() == null ? "" : data.getUserName());
                map.put("userPhone", data.getUserPhone() == null ? "" : data.getUserPhone());
                map.put("failureReason", data.getFailureReason() == null ? "" : data.getFailureReason());
                dataList.add(map);
            }
            try (final OutputStream os = response.getOutputStream()) {
                log.info("=============失败记录导出开始============");
                FileExport.responseSetProperties(fName, response);
                FileExport.doExport(dataList, sTitle, mapKey, os);
                log.info("=============失败记录导出结束============");
            } catch (Exception e) {
                log.error("导出失败记录数据失败", e);
            }
        }

    方法二

    /**
     * 描述:下载外部案件导入模板
     * @param response
     * @param request
     * @author songfayuan
     * 2018年6月7日下午5:03:59
     */
        @RequestMapping("/downloadExcel")
        @ResponseBody
        public void downloadExcel(HttpServletResponse response,HttpServletRequest request) {
            //方法一:直接下载路径下的文件模板(这种方式貌似在SpringCloud和Springboot中,打包成JAR包时,无法读取到指定路径下面的文件,不知道记错没,你们可以自己尝试下!!!)
            try {
                //获取要下载的模板名称
                String fileName = "ApplicationImportTemplate.xlsx";
                //设置要下载的文件的名称
                response.setHeader("Content-disposition", "attachment;fileName=" + fileName);
                //通知客服文件的MIME类型
                response.setContentType("application/vnd.ms-excel;charset=UTF-8");
                //获取文件的路径
                String filePath = getClass().getResource("/template/" + fileName).getPath();
                FileInputStream input = new FileInputStream(filePath);
                OutputStream out = response.getOutputStream();
                byte[] b = new byte[2048];
                int len;
                while ((len = input.read(b)) != -1) {
                    out.write(b, 0, len);
                }
                //修正 Excel在“xxx.xlsx”中发现不可读取的内容。是否恢复此工作薄的内容?如果信任此工作簿的来源,请点击"是"
                response.setHeader("Content-Length", String.valueOf(input.getChannel().size()));
                input.close();
                //return Response.ok("应用导入模板下载完成");
            } catch (Exception ex) {
                logger.error("getApplicationTemplate :", ex);
                //return Response.ok("应用导入模板下载失败!");
            }
            
            
            //方法二:可以采用POI导出excel,但是比较麻烦(这里类似方法一)
            /*try {
                Workbook workbook = new HSSFWorkbook();
                request.setCharacterEncoding("UTF-8");
                response.setCharacterEncoding("UTF-8");
                response.setContentType("application/x-download");
        
                
                String filedisplay = "导入模板.xls";
             
                filedisplay = URLEncoder.encode(filedisplay, "UTF-8");
                response.addHeader("Content-Disposition", "attachment;filename="+ filedisplay);
                
                // 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet  
                Sheet sheet = workbook.createSheet("导入模板");
                // 第三步,在sheet中添加表头第0行
                Row row = sheet.createRow(0);
                // 第四步,创建单元格,并设置值表头 设置表头居中 
                CellStyle style = workbook.createCellStyle();  
                style.setAlignment(CellStyle.ALIGN_CENTER); // 创建一个居中格式 
                
                Cell cell = row.createCell(0);  
                cell.setCellValue("商品名称");  
                cell.setCellStyle(style); 
                sheet.setColumnWidth(0, (25 * 256));  //设置列宽,50个字符宽
                
                cell = row.createCell(1);  
                cell.setCellValue("商品编码");  
                cell.setCellStyle(style); 
                sheet.setColumnWidth(1, (20 * 256));  //设置列宽,50个字符宽
                
                cell = row.createCell(2);  
                cell.setCellValue("商品价格");  
                cell.setCellStyle(style);  
                sheet.setColumnWidth(2, (15 * 256));  //设置列宽,50个字符宽
                
                cell = row.createCell(3);  
                cell.setCellValue("商品规格");  
                cell.setCellStyle(style);  
                sheet.setColumnWidth(3, (15 * 256));  //设置列宽,50个字符宽
                
                // 第五步,写入实体数据 实际应用中这些数据从数据库得到
                row = sheet.createRow(1);
                row.createCell(0, Cell.CELL_TYPE_STRING).setCellValue(1);  
                row.createCell(1, Cell.CELL_TYPE_STRING).setCellValue(2); 
                row.createCell(2, Cell.CELL_TYPE_STRING).setCellValue(3);   //商品价格
                row.createCell(3, Cell.CELL_TYPE_STRING).setCellValue(4);  //规格
            
                // 第六步,将文件存到指定位置  
                try  
                {  
                    OutputStream out = response.getOutputStream();
                    workbook.write(out);
                    out.close();  
                }  
                catch (Exception e)  
                {  
                    e.printStackTrace();  
                }  
            } catch (Exception e) {
                e.printStackTrace();
            }*/
        }

    模板位置:

    如何从服务端使用Java下载Excel模板文件?

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Excel Java
    相关文章 更多
    Java单元测试入门:使用JUnit 5编写第一个测试用例
    Java单元测试入门:使用JUnit 5编写第一个测试用例

    面向初学者的JUnit 5实用入门指南。从测试概念、Maven依赖配置,到手把手编写首个单元测试用例及断言验证,助你掌握Java单元测试的核心流程。

    Java变量未初始化报错解析:局部变量与成员变量默认值差异
    Java变量未初始化报错解析:局部变量与成员变量默认值差异

    深入解析Java中局部变量未初始化编译报错与成员变量自动赋予默认值的机制差异,涵盖JVM内存分配、编译期确定性赋值检查与实际排查修复方案。

    Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat
    Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat

    详细讲解在Java中获取当前系统时间并进行格式化输出的两种核心方案:基于Java 8全新日期时间API的DateTimeFormatter与传统遗留的SimpleDateFormat,包含完整代码示例、线程安全机制对比及生产选型建议。

    Java中final与static final常量的定义及初始化规则
    Java中final与static final常量的定义及初始化规则

    深入解析Java中final变量与static final常量的定义、内存语义、初始化时机及合法赋值路径,涵盖编译期常量优化与实战避坑指南。

    Java抽象方法与接口方法的区别及选型建议
    Java抽象方法与接口方法的区别及选型建议

    深入对比Java中抽象类抽象方法与接口方法的语法演进、设计意图及运行期差异,并提供清晰的架构选型决策流程与实战范例。

    Java实现HTTP请求与JSON解析的完整代码示例
    Java实现HTTP请求与JSON解析的完整代码示例

    本文提供Java标准库HttpClient发起HTTP GET/POST请求并结合Jackson进行JSON数据反序列化与序列化的完整代码示例与工程实践指南。

    Java递归出现StackOverflowError的原因分析及栈空间优化方案
    Java递归出现StackOverflowError的原因分析及栈空间优化方案

    详细分析Java递归调用出现StackOverflowError的原因,结合代码说明线程栈、栈帧和递归深度之间的关系,并介绍终止条件排查、迭代改写、减少栈帧开销以及通过-Xss调整JVM栈空间的方法。

    Java空指针异常(NPE)的代码排查与修复实例
    Java空指针异常(NPE)的代码排查与修复实例

    针对Java中常见的NullPointerException(NPE),本文从堆栈日志定位、典型代码触发场景、具体修复代码对比到防御体系进行系统讲解,提供实用且易上手的排查与修复方案。

    selenium上传文件教程本地文件路径设置方法
    selenium上传文件教程本地文件路径设置方法

    深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

    PDF表格怎么转换成Excel?如何免费将PDF表格转成Excel?
    PDF表格怎么转换成Excel?如何免费将PDF表格转成Excel?

    大家有没有遇到过PDF里的表格无法直接编辑的情况?这时候,将其转换为Excel再进行数据整理就会方便很多。下面,我给大家详细介绍3种完整的操作方法,每一步都配有对应的操作截图,同时还会说明普通PDF和扫描版表格在处理上的区别。 方法一:用极轻PDF转换Excel极轻PDF(pdf.cn)的PDF转E

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。

    为什么要购买正版软件?
    01 官方授权

    授权来源透明,订单与许可信息可随时查询。

    02 即时交付

    付款成功后自动发放激活信息,支持订单追踪。

    03 中文协助

    安装、激活、迁移与续费问题都有专人响应。

    04 长期可用

    提供升级提醒与授权管理,换机时也能轻松迁移。

    网站备案号:苏ICP备2026018738号-1 联系邮箱:bd@zhengruan.com 网站地图

    Copyright ©2018-2026