webapi导出excel没反应_webapi导出excel - CSDN
精华内容
参与话题
  • /// /// 5.2、考场总表导出 /// [Route("ExamRoomExport")] [HttpGet] public FileResult ExamRoomExport(int examId) { #region 生成xls var lstTitle = new List { "考场", "科目时间", "监考老师", "座位号", ...
            /// 
            /// 5.2、考场总表导出
            /// 
            [Route("ExamRoomExport")]
            [HttpGet]
            public FileResult ExamRoomExport(int examId)
    
            {
            
                #region 生成xls
                var lstTitle = new List { "考场", "科目时间", "监考老师", "座位号", "姓名", "准考证", "学生班级" };//, 
                IWorkbook book = new HSSFWorkbook();
                ISheet sheet = book.CreateSheet("Sheet1");
                IRow rowTitle = sheet.CreateRow(0);
                ICellStyle style = book.CreateCellStyle();
                style.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;//垂直居中  
                for (int i = 0; i < lstTitle.Count; i++)
                {
    
                    rowTitle.CreateCell(i).SetCellValue(lstTitle[i]);
    
                }
                var list = data.GetListResultStudent(examId);
                if (list != null)
                {
                    list.OrderBy(o => o.RoomId);
                    int start = 0;//记录同组开始行号
                    int end = 0;//记录同组结束行号
                    string temp = "";//记录上一行的值
                    for (int i = 0; i < list.Count; i++)
                    {
    
                        IRow row = sheet.CreateRow(i + 1);
                        
                        row.CreateCell(0).SetCellValue(list[i].RoomName);
                        row.CreateCell(1).SetCellValue(list[i].ExamTime.ToLongDateString() + list[i].ExamTime.ToLongTimeString());
                        row.CreateCell(2).SetCellValue(list[i].TeacherName);
                        row.CreateCell(3).SetCellValue(list[i].ZuoWeiNumber);
                        row.CreateCell(4).SetCellValue(list[i].StudentName);
                        row.CreateCell(5).SetCellValue(list[i].ZhunNumber);
                        row.CreateCell(6).SetCellValue(list[i].ClassName);
    
                       
                        
    
                        row.GetCell(0, MissingCellPolicy.CREATE_NULL_AS_BLANK).SetCellType(CellType.String);
                        var cellText = row.Cells[0].StringCellValue;//获取当前行 第1列的单元格的值
    
                        if (cellText == temp)//上下行相等,记录要合并的最后一行
                        {
                            end = i;
                        }
                        else//上下行不等,记录
                        {
                            if (start != end)
                            {
                                //设置一个合并单元格区域,使用上下左右定义CellRangeAddress区域
                                //CellRangeAddress四个参数为:起始行,结束行,起始列,结束列
                                CellRangeAddress region = new CellRangeAddress(start + 1, end + 1, 0, 0);
                                sheet.AddMergedRegion(region);
                            }
                            start = i;
                            end = i;
                            temp = cellText;
                        }
                    }
                }
    
                #endregion
                for (int i = 0; i < 7; i++)
                {
                    sheet.AutoSizeColumn(i);//i:根据标题的个数设置自动列宽
                }
                
                MemoryStream ms = new MemoryStream();
                book.Write(ms);
                ms.Seek(0, SeekOrigin.Begin);
    
                return File(ms, "application/vnd.ms-excel", "考场总表导出.xls");
    
    
            }
    展开全文
  • 文件流方式导出Excel表格

    千次阅读 2019-01-10 16:51:06
    之前做的项目都是在不调用后台接口的情况下,将json数据导出到excel表格,纯前端去实现导出Excel,最近做的项目,需要向后台传递不同的参数值,后台查询出符合条件的数据,以文档流的格式返回前端,前端再导出为Excel...

           之前做的项目都是在不调用后台接口的情况下,将json数据导出到excel表格,纯前端去实现导出Excel,最近做的项目,需要向后台传递不同的参数值,后台查询出符合条件的数据,以文档流的格式返回前端,前端再导出为Excel,经查阅资料,用了两种方法实现,亲测有效。有什么写的不好的地方,望指出,大家一起进步!

       

     上图是后台返回的数据,此时前端需要把查询到的数据导出为excel格式,这里介绍两种方法:

    第一种:

     getExcel() {
                    const url = 'URL地址';
                    this.$http.post(url, this.filter, {
                        responseType: 'blob'
                    }).then(res => {
                        let blob = new Blob([res.data], {
                            type: "application/vnd.ms-excel",
                        });    
                        let objectUrl = URL.createObjectURL(blob);     
                        window.location.href = objectUrl;
                    }).catch(err => {
                        console.warn(err);
                    });
                },

    注意设置responseType!!!

    Blob() 构造函数返回一个新的 Blob 对象。 blob的内容由参数数组中给出的值的串联组成。

    语法:var aBlob = new Blob( array, options );

    Blob.type:一个字符串,表明该Blob对象所包含数据的MIME类型。如果类型未知,则该值为空字符串。

    具体可参考MDN文档:Blob - Web API 接口 | MDN

    此方法的缺陷:下载的excel文档的名字是创建的blob的url,且无法使创建的url为固定值,在每次调用 createObjectURL() 方法时,都会创建一个新的 URL 对象

    第二种:

     //导出Excel
                getExcel() {
                    const url = '你的URL';
                    this.$http.post(url, params, {
                        responseType: 'blob'
                    }).then(res => {
                        let blob = new Blob([res.data], {
                            type: 'application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
                        })
                        if (window.navigator.msSaveOrOpenBlob) {
                            navigator.msSaveBlob(blob);
                        } else {
                            let elink = document.createElement('a');
                            elink.download = "报表.xls";
                            elink.style.display = 'none';
                            elink.href = URL.createObjectURL(blob);
                            document.body.appendChild(elink);
                            elink.click();
                            document.body.removeChild(elink);
                        }
                    }).catch(err => {
                        console.warn(err);
                    });
                },

    第二种方法可以自己设置导出excel的名称。利用a链接,最后记得对a 链接进行移除。

    之前写的 elink.download = "报表.xlsx";在自己电脑上没有问题,但是有两个同事反应说,导出的Excel下载之后无法打开。出现以下报错:

    后来发现是版本问题 ,XLSX是高版本
    07版以后的扩展名都是.xlsx ,是用新的基于XML的压缩文件格式取代了其目前专有的默认文件格式,在传统的文件名扩展名后面添加了字母x(即.docx取代.doc、.xlsx取代.xls,等等),使其占用空间更小,可以向下兼容xls。改为xls之后就没有问题了。

    你学会了吗?

    展开全文
  • 服务端定义一个导出功能的关键代码Java 定义一个export的功能函数,以下为关键代码(接口中的一部分处理逻辑):response.reset(); response.setContentType(&quot;application/vnd.ms-excel;charset=utf-8&...

    导出Excel功能

    从服务端到浏览器的简单处理, 仅供参考

    服务端定义一个导出功能的关键代码

    Java 定义一个export的功能函数,以下为关键代码(接口中的一部分处理逻辑):

    @Override
    public byte[] export(String startdate, String enddate, Integer type, String name,
     HttpServletResponse response) {
        // other logic omitted here ...
    
        // set response args,it used for open download
        response.reset();
        response.setContentType("application/vnd.ms-excel;charset=utf-8");
        try {
            response.setHeader("Content-Disposition", "attachment;filename=" + 
            new String((name+ ".xls").getBytes(), "iso-8859-1"));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        try {
            workList.write(output); // write
        } catch (IOException e) {
            e.printStackTrace();
        }
        return output.toByteArray();
    }
    

    前端处理

    1. 方式1:使用ng1实现,在自定义指令中来通过接口接收数据流 [ 存在兼容问题的方式 ]

    指令如下:

    angular.module('yourNgApp')
        .directive('sysExport', function ($http, $document) {
            return {
                templateUrl: "app/system/export/export.directive.html",
                restrict: 'EA',
                replace: true,
                scope: {
                    item: '='
                },
                link: function (scope, element) {
                    // 访问请求的函数
                    function getExport(postData) {
                        // 拼出自己的url
                        var url = '/api/course/export?startdate=' + 
                        postData.startdate + '&enddate=' + postData.enddate + 
                        '&type=' + postData.type + '&name=' + postData.name;
                        // 注意下面的responseType 一定要有哦!
                        var finalPostData = {
                            url: url,
                            method: 'POST',
                            responseType: "arraybuffer",
                            headers: {'Content-type': 'application/json'}
                        };
                        $http(finalPostData)
                            .success(function (data) {
                                var blob, fileName, blobArgs;
                                blobArgs = {type: 'application/vnd.ms-excel application/x-excel'};
                                blob = new Blob([data], blobArgs);
                                var a = $document[0].createElement('a');
                                a.download = postData.name + '.xls';
                                a.href = URL.createObjectURL(blob);
                                a.click();
                            })
                            .error(function (e) {
                                console.log(e);
                            });
                    }
    
                    element.on('click', function () {
                        getExport(scope.item);
                    });
                }
            };
        });
    
    • 至此可实现通过指令的点击事件来下载excel格式了。
    • 因为导出功能多用于后台管理,适用性不是很普遍,所以兼容问题可协商,所以前台使用了Blob对象。
    • 为了节约服务器资源可通过此种方式通过点击来下载,而不是将导出的文件单独存放到服务器上通过返回excel所在的url地址来进行下载。

    2)方式2:直接通过a链接访问,[兼容性好]

    示例:

    <a href="/api/course/export?startdate={{cl.startdate}}&enddate={{cl.enddate}}&type={{cl.type}}&name={{cl.name}}" class="btn btn-success">导出</a>
    

    扩展

    总结

    上面前端用到的都是一些H5高级API 适用性不是很高, 但也临时解决了一些问题,只作为尝试 :)
    通过a链接的方式请求, 直接在服务器端完成文件的操作,点击后直接下载,兼容良好,但不适合大文件的传输下载。

    展开全文
  • easyexcel导出遇到的两个坑

    千次阅读 2019-03-13 10:50:05
    使用easyexcel大数据量导出时,需要依赖org.apache.poi的3.17版的jar包,而poi3.17与3.8/3.9版本之间方法变动比较大,会导致easyexcel不能正常使用。所以需要确保poi为3.17版本的 &lt;dependency&gt; ...

    问题一:poi的jar版本过低问题

    使用easyexcel大数据量导出时,需要依赖org.apache.poi的3.17版的jar包,而poi3.17与3.8/3.9版本之间方法变动比较大,会导致easyexcel不能正常使用。所以需要确保poi为3.17版本的

    		<dependency>
    			<groupId>com.xxx</groupId>
    			<artifactId>xxx-framework</artifactId>
    			<version>1.0.5</version>
    			<exclusions>
    		        <exclusion>
    		            <groupId>javax.servlet</groupId>
    		            <artifactId>servlet-api</artifactId>
    		        </exclusion>
    		        <exclusion>
    		        	<groupId>org.apache.poi</groupId>
    					<artifactId>poi</artifactId>
    		        </exclusion>
    		        <exclusion>
    		        	<groupId>org.apache.poi</groupId>
    					<artifactId>poi-ooxml</artifactId>
    		        </exclusion>
        		</exclusions>
    		</dependency>

    排除掉3.9版本的poi之后正常:

    问题二:导出结束后报:java.io.IOException: Stream closed

    在使用springboot构建项目时,使用zipkin进行链路跟踪,springboot内部容器可能使用的是undertow,因此导致此错误。

    将容器undertow排除:

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
               <groupId>io.zipkin.java</groupId>
               <artifactId>zipkin-server</artifactId>
               <exclusions>
                   <exclusion>
                       <groupId>org.springframework.boot</groupId>
                       <artifactId>spring-boot-starter-undertow</artifactId>
                   </exclusion>                    
               </exclusions>
            </dependency> 

     

    展开全文
  • 为什么 Vue 更符合这个时代的大势所趋

    万次阅读 多人点赞 2020-06-17 09:10:06
    不久前,尤雨溪发布了 Vue 3.0 Beta 版本。 发布之后我们对社区里的前端开发者做了一次调查沟通,大家普遍认为 Vue 已经具备了商业项目开发的必备条件,如语法精炼、优雅而简洁、代码的可读性高、成熟的组件模块化...
  • 四大主流BI工具比较

    万次阅读 2016-12-23 22:21:13
    项目 MicroStrategy BO Oracle BIEE Congnos8  产品功能 安装部署 客户端无任何安装;服务端的安装全程自动化,没有专用的设置参数的输入,较容易安装。...安装过程类似于安装Oracle数据库,且
  • webmagic采集CSDN的Java_WebDevelop页面

    万次阅读 2016-05-23 10:26:24
    使用webmagic采集博客类的网站示例
  • R语言常用packages(常用R包)

    万次阅读 多人点赞 2019-02-01 17:16:48
    新浪微博(网页版搜索):Jenny爱学习 微信公众号:R语言数据分析与实践 更新时间:Feb 1st,2019   ... R语言由近几年随着数据挖掘、机器学习在国内兴起而大热,现在R已经发展成为一个社区语言,有者非常多的...
  • 原文链接地址:https://alibaba-easyexcel.github.io/index.html 是个非常好的参考文档,比网上其他网有写的都靠谱、动态更新、详细 ... Easy Excel ... 读ExcelExcel ... 根据参数只导出指定...
  • a标签实现下载文件或称导出文件

    万次阅读 2018-11-02 17:01:43
    简单的下载示例: &lt;a href="url"&gt;&lt;/a&gt; &lt;img src="url" /&gt;...export function exportfile_goods(jsonobj){ // 导出商品文件 ...
  • 1、平台架构 OneNET在物联网的基本架构如下图所示,作为PaaS层,OneNET为SaaS层和设备层搭建连接桥梁,为终端层提供设备接入,为SaaS层提供应用开发能力。 2、优势特点 2.1、高并发可用 ...支撑高并发应用及终端接...
  • DotNet 资源大全中文版(Awesome最新版)
  • WEB开发文档2 总结

    万次阅读 2007-09-20 21:58:00
    http://blog.donews.com/lvjiyong/archive/2006/06/29/931071.aspx 怎样将后台生成的在内存中的图象显示到客户端 Microsoft IE WebControls下载地址 如何在DATAGRID中使用JAVASCRIPT脚本控制 DataGrid中连接到...
  • codeproject

    万次阅读 2007-03-26 07:31:00
    ApplicationsCrafting a C# forms Editor From scratchhttp://www.codeproject.com/csharp/SharpFormEditorDemo.asp建立一个类似C#的环境, 实现控件拖拉,属性 Packet Capture and Analayzer网络封包截获...
  • TypeScript VS JavaScript 深度对比

    万次阅读 2018-01-08 11:55:34
    TypeScript 和 JavaScript 是目前项目开发中较为流行的两种脚本语言,我们已经熟知 TypeScript 是 JavaScript 的一个超集,但是 TypeScript 与 JavaScript 之间又有什么样的区别呢?在选择开发语言时,又该如何抉择...
  • Mac实用软件及功能吐血总结

    万次阅读 2018-03-26 11:13:39
    本人一年半来跟踪Mac志(http://www.isofts.org/category/software-for-mac-os-x/)、MacGG(http://www.macgg.com/archives/category/mac软件),潜心测试,用心总结出以下mac实用软件列表,尤其适合程序员……软件...
  • 父母都是做出纳相关的工作,希望我能给他们做个简单的进销存,在上班的时候使用。开发一个不需要花钱买服务器,不需要依赖网络(更新除外),单机版的程序,对于前端出身的我来说,那么electron或nwjs是最好的选择。...
  • Mac实用软件及功能总结

    万次阅读 2014-09-17 09:36:55
    zh'zhuang 转载▼ 本人一年半来跟踪Mac志(http://www.isofts.org/category/software-for-mac-os-x/)、MacGG(http://www.macgg.com/archives/category/mac软件)... ...软件介绍多摘自以上两个网站,在此表示感谢。
  • 关系型数据库  关系数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。现实世界中的各种实体以及实体之间的各种联系均用关系模型来表示。关系模型是由埃德加·科德于...
1 2 3 4 5 ... 20
收藏数 438
精华内容 175
关键字:

webapi导出excel没反应