前言

产品经理有一个需求,就是将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. LeetCode(40)-Merge Sorted Array

    听到初爱有感 开头啰嗦两句,刚在做算法题目的时候,听到了杨宗纬的<初爱>,突然有了一种本科时候的感觉,想想自己现在研二了,青春喂了狗,我果断喝了一罐啤酒,循环这首歌到吐-.. 题目: Gi ...

  2. 八、Join 连接查询

    文档目录 开发中...

  3. Validate Binary Search Tree(一定掌握的方法)

    Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as ...

  4. 修改was数据源

    本机的RAD运行的工程可以通过修改jpa中的persistence中的jni修改数据源: 对于通过was控制台部署的ear需要在was控制台:资源--jdbc 修改数据源

  5. memocache 分布式搭建

    memcached+magent实现memcached集群   首先说明下memcached存在如下问题 本身没有内置分布式功能,无法实现使用多台Memcache服务器来存储不同的数据,最大程度的使用 ...

  6. tomcat启动非常慢;连接oracle数据库失败,jdbc错误日志提示connection reset;测试主机间网络互通及数据库端口都正常

      [判断确认:这时候大家可能要去检查一下/dev/random 这个设备档案.可以用cat /dev/random 来看它的内容,如果你发现他一直没显示任何内容﹝可能是乱码数字之类的﹞,那就是它出问 ...

  7. 从__acrt_first_block == header 谈起,记录dll链接不一致的问题

    最近写了一个postgresql的数据库连接池dll.写的比较随意,某个头文件如下: #pragma once #include "common.h"#include " ...

  8. python---用户登录程序

    需求: 1. 用户登录,判断用户名密码是否正确 2. 密码输入三次不对则锁定账号 3. 锁定账号无法登录 分析: 1. 输入账号,判断账号是否存在,即账号是否在账号文件中存在: 2. 如果账号存在,则 ...

  9. svn Server sent unexpected return value (403 Forbidden) in response to CHECKOUT

    今天,提交資料到公司svn服務器,但是一直提示 Server sent unexpected return value (403 Forbidden) in response to CHECKOUT ...

  10. Codeforces Round #479 (Div. 3) C. Less or Equal

    题目地址:http://codeforces.com/contest/977/problem/C 题解:给一串数组,是否找到一个数x,找到k个数字<=x,找到输出x,不能输出-1.例如第二组,要 ...