前言

产品经理有一个需求,就是将cosmosDB里的数据,导出到Excel中.

1.新建一个.net core web api controller

添加引用:EPPlus.Core

 Install-Package EPPlus.Core

命名空间:

using OfficeOpenXml;

2.在HomeController里添加Export的方法

这里会遇到几个坑:

第一个是使用HttpResponseMessage的时候,返回的不是一个文件,而是一个HttpResponseMessage 类型的json;

第二个是 返回的File的时候,注意要加上stream.position=0;

第三个是将stream保存在内存(小文件),有些虚机不一定有C盘,所以创建物理路径是存在risk,暂存在内存避免crash。要是大文件还是另寻他法,万一out of memory。

这里我们使用IActionResult返回类型。

    [HttpGet]
[Route("export")]
public async Task<IActionResult> Export()
{
string fileName = $"{Guid.NewGuid().ToString()}.xlsx"; //store in memory rather than pysical directory
var stream = new MemoryStream();
var messages = await ConversationManager.GetConversationMessagesAsync();
var columns = new ConversationMessage();
using (ExcelPackage package = new ExcelPackage(stream))
{
// add worksheet
ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Conversation Message");
//add head
worksheet.Cells[1, 1].Value = "From Id";
worksheet.Cells[1, 2].Value = "To Id";
worksheet.Cells[1, 3].Value = "Message";
worksheet.Cells[1, 4].Value = "Time";
worksheet.Cells[1, 5].Value = "Attachment";
worksheet.Cells[1, 6].Value = "Conversation Id"; //add value
var rowNum = 2; // rowNum 1 is head
foreach (var message in messages)
{
worksheet.Cells["A" + rowNum].Value = message.FromId;
worksheet.Cells["B" + rowNum].Value = message.ToId;
worksheet.Cells["C" + rowNum].Value = message.Message;
worksheet.Cells["D" + rowNum].Value = message.MsgTime;
worksheet.Cells["E" + rowNum].Value = message.Attachment;
worksheet.Cells["F" + rowNum].Value = message.ConversationId;
rowNum++;
}
package.Save();
}
stream.Position = 0;
return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", fileName);
}

3.说明

最后在浏览器打开api,成功下载:



这里highlighted的部分就是代码中的Worksheets,还可以对表头进行加粗上色之类的,暂时没有这个需求就不深入了。

一开始使用如下方式:

[HttpGet]
public HttpResponseMessage DownloadFile(string fileName)
{
if (!string.IsNullOrEmpty(fileName))
{
string filePath = "/images/";
string fullPath = AppDomain.CurrentDomain.BaseDirectory + filePath + "/" + fileName;
if (File.Exists(fullPath))
{ HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
var fileStream = new FileStream(fullPath, FileMode.Open);
response.Content = new StreamContent(fileStream);
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
response.Content.Headers.ContentDisposition.FileName = fileName;
return response;
}
} return new HttpResponseMessage(HttpStatusCode.NotFound);
}

ContentDisposition会出现为null的情况,就没有FileName,所以这一步就已经exception了。

但貌似并不能成功下载(打开api,直接下载并显示在浏览器下方)

.Net core Web API导出数据到Excel的更多相关文章

  1. ASP.NET Core Web API 如何 数据分页 以及遇到'OFFSET' 附近有语法错误

    最近领导叫我做的一个B/S端的小项目,突发奇想想用到core web api 今天写数据分页的时候,就想着 用linq分页查询吧,直接上代码 _context.Skip(Size * (PageNum ...

  2. 使用 ASP.NET Core MVC 创建 Web API——响应数据的内容协商(七)

    使用 ASP.NET Core MVC 创建 Web API 使用 ASP.NET Core MVC 创建 Web API(一) 使用 ASP.NET Core MVC 创建 Web API(二) 使 ...

  3. .net core web api 与httpclient发送和接收文件及数据

    客户端 HttpClient var url = $"https://localhost:44323/api/values/posttest?resource_source=yangwwme ...

  4. List多个字段标识过滤 IIS发布.net core mvc web站点 ASP.NET Core 实战:构建带有版本控制的 API 接口 ASP.NET Core 实战:使用 ASP.NET Core Web API 和 Vue.js 搭建前后端分离项目 Using AutoFac

    List多个字段标识过滤 class Program{  public static void Main(string[] args) { List<T> list = new List& ...

  5. ASP.NET Core WEB API 使用element-ui文件上传组件el-upload执行手动文件文件,并在文件上传后清空文件

    前言: 从开始学习Vue到使用element-ui-admin已经有将近快两年的时间了,在之前的开发中使用element-ui上传组件el-upload都是直接使用文件选取后立即选择上传,今天刚好做了 ...

  6. 加快ASP。NET Core WEB API应用程序。第2部分

    下载source from GitHub 使用各种方法来增加ASP.NET Core WEB API应用程序的生产力 介绍 第1部分.创建测试RESTful WEB API应用程序第2部分.增加了AS ...

  7. 导出数据到Excel --使用ExcelReport有感

    先看图,这是几个月前用NPOI写的导出数据到Excel,用了上百行代码,而且难控制,导出来也比较难看 excel打开的效果 下面是我用ExcelReport类库导出到Excel的操作 1.首先引用Ex ...

  8. ASP.NET Core Web API Cassandra CRUD 操作

    在本文中,我们将创建一个简单的 Web API 来实现对一个 “todo” 列表的 CRUD 操作,使用 Apache Cassandra 来存储数据,在这里不会创建 UI ,Web API 的测试将 ...

  9. 在Mac下创建ASP.NET Core Web API

    在Mac下创建ASP.NET Core Web API 这系列文章是参考了.NET Core文档和源码,可能有人要问,直接看官方的英文文档不就可以了吗,为什么还要写这些文章呢? 原因如下: 官方文档涉 ...

随机推荐

  1. ubuntu12.04:jdk7:手动安装

    总的原则:将jdk-7u10-linux-x64.tar.gz压缩包解压至/usr/lib/jdk,设置jdk环境变量并将其修改为系统默认的jdk 将jdk-7u5-linux-x64.tar.gz拷 ...

  2. Tomcat的缺省是多少,怎么修改

     Tomcat的缺省端口号是8080. 修改Tomcat端口号: 1.找到Tomcat目录下的conf文件夹 2.进入conf文件夹里面找到server.xml文件 3.打开server.xml文件 ...

  3. 初识Java——日期的格式化

    import java.util.*; class DateTest{ static{ System.out.println("谢谢使用!");//代码块,在初始化类时,先执行代码 ...

  4. Day8 接口与归一化设计

    接口:在程序的使用中,我不能把程序的主体直接提供给使用者,一般是提供一个接口. 为什么要使用接口: 1,接口提取了一群共同的函数,可以把接口当做一个函数的集合. 2,让子类去实现接口中的函数. 归一化 ...

  5. SVN中与资源库同步时报告了错误。1 中的 0 个资源已经同步

    SVN中与资源库同步时报告了错误.1 中的 0 个资源已经同步 原因: 文件被lock, 此时再次提交则出错,解决办法就是clean释放锁即可再次提交: 解决方案: 右键项目–>team–> ...

  6. IE的变态

    1.它自身的内容动态调试功能太简陋. 2.另存成静态网页调试,发现网页代码和原先后台写的根本不一样,能稍微守点规矩行不?

  7. Apriori算法-频繁项集-关联规则

    计算频繁项集: 首先生成一个数据集 def loadDataSet():     return [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]] 测试数据集da ...

  8. Kudu vs HBase

    本文由  网易云发布. 背景 Cloudera在2016年发布了新型的分布式存储系统--kudu,kudu目前也是apache下面的开源项目.Hadoop生态圈中的技术繁多,HDFS作为底层数据存储的 ...

  9. HTML 学习笔记 day one

    HTML学习笔记 day one Chapter one 网站开发基础 1.2网站的基本架构 网站的基本要素:内容,页面,超链接 动态网页和静态网页的区别在于:动态网页会自动更新,后缀名是.asp或者 ...

  10. html 标签内联元素和块元素分类【转】

    常见的块状元素与内联元素 块状元素 内联元素 address - 地址 blockquote - 块引用 center - 居中对齐 dir - 目录列表 div - 常用块级容易,也是CSS lay ...