ASP.NETCore -----导出Excel文件并下载
本事例分为nopi(安装DotNetCore.NPOI)下载和EPPlus(EPPlus.Core.dll)下载,其中npoi下载演示的是根据执行的模板进行数据下载
npoi帮助类NpoiExcelUtility
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Threading.Tasks; namespace ASPNETCoreExcel
{
public class NpoiExcelUtility
{
private string _xlsPath = string.Empty;
private HSSFWorkbook _workBook = null; /// <summary>
/// 构造函数
/// </summary>
/// <param name="xlsPath">xls保存路径</param>
/// <param name="TempletFileName">xls模板路径</param>
public NpoiExcelUtility(string xlsPath, string TempletFileName)
{
_xlsPath = this.CheckFilePath(xlsPath); FileStream file = new FileStream(TempletFileName, FileMode.Open, FileAccess.Read);
_workBook = new HSSFWorkbook(file);
} /// <summary>
/// 将DataTable保存到sheet里
/// </summary>
/// <param name="dt"></param>
/// <param name="sheet"></param>
private void DataTableToExcel(DataTable dt, ISheet sheet)
{
ICellStyle style = _workBook.CreateCellStyle();
style.Alignment = HorizontalAlignment.Left;
style.VerticalAlignment = VerticalAlignment.Center; ICellStyle colStyle = _workBook.CreateCellStyle();
colStyle.Alignment = HorizontalAlignment.Left;
colStyle.VerticalAlignment = VerticalAlignment.Center;
IFont font = _workBook.CreateFont();
font.Color = NPOI.HSSF.Util.HSSFColor.LightBlue.Index;
colStyle.SetFont(font); //列名
//IRow row = sheet.CreateRow(0);
//for (int i = 0; i < dt.Columns.Count; i++)
//{
// sheet.SetDefaultColumnStyle(i, style); // ICell cell = row.CreateCell(i);
// cell.SetCellValue(dt.Columns[i].ToString()); // cell.CellStyle = colStyle;
//}
//内容
var headerRow = (HSSFRow)sheet.GetRow(); for (int i = ; i <= dt.Rows.Count; i++)
{
IRow row = sheet.CreateRow(i + );
row.Height = * ;
ICell numcell = row.CreateCell();
numcell.SetCellValue(i);
for (int j = ; j < dt.Columns.Count; j++)
{
object obj = dt.Rows[i - ][j];
if (obj != null)
{
string ColumnName = dt.Columns[j].ToString();
var _Column = headerRow.Cells.Find(t => !string.IsNullOrEmpty(t.StringCellValue) && t.ToString().ToLower() == ColumnName.ToLower());
//ICell cell = row.CreateCell(j + 1);
if (_Column != null)
{
ICell cell = row.CreateCell(_Column.ColumnIndex);
if (obj is double || obj is float || obj is int || obj is long || obj is decimal)
{
cell.SetCellValue(Convert.ToDouble(obj));
}
else if (obj is bool)
{
cell.SetCellValue((bool)obj);
}
else
{
cell.SetCellValue(obj.ToString());
}
}
}
}
}
} /// <summary>
/// 保存Excel
/// </summary>
public void SaveExcel()
{
FileStream file = new FileStream(_xlsPath, FileMode.Create);
_workBook.Write(file);
file.Close();
} /// <summary>
/// 创建Sheet
/// </summary>
/// <param name="sheetName">sheet名称</param>
/// <param name="tbl">DataTable数据表,当行数大于65536时,自动分割成几个sheet,sheet名称为sheetName_i</param>
public void CreatExcelSheet(string sheetName, DataTable tbl)
{
string sName = this.CheckSheetName(sheetName); int rowMax = ;
int intNum = tbl.Rows.Count / rowMax;
int remainder = tbl.Rows.Count % rowMax; for (int i = ; i < intNum; i++)
{
DataTable subTbl = tbl.Clone();
for (int j = ; j < ; j++)
{
int rowIndex = i * rowMax + j;
subTbl.Rows.Add(tbl.Rows[rowIndex].ItemArray);
}
string subSheet = sName + "_" + (i + );
//ISheet sheet = _workBook.CreateSheet(subSheet);
ISheet sheet = _workBook.GetSheetAt();
this.DataTableToExcel(subTbl, sheet);
}
if (remainder > )
{
DataTable subTbl = tbl.Clone();
for (int j = ; j < remainder; j++)
{
int rowIndex = intNum * rowMax + j;
subTbl.Rows.Add(tbl.Rows[rowIndex].ItemArray);
}
string subSheet = sName + "_" + (intNum + );
if (intNum < )
{
subSheet = sName;
}
//ISheet sheet = _workBook.CreateSheet(subSheet);
ISheet sheet = _workBook.GetSheetAt();
this.DataTableToExcel(subTbl, sheet);
}
} /// <summary>
/// 检查sheet名称是否合法,并去掉不合法字符
/// </summary>
/// <param name="sheetName"></param>
private string CheckSheetName(string sheetName)
{
string rlt = sheetName;
string[] illegalChars = { "*", "?", "\"", @"\", "/" };
for (int i = ; i < illegalChars.Length; i++)
{
rlt = rlt.Replace(illegalChars[i], "");
}
return rlt;
} /// <summary>
/// 检查xls路径是否合法,并去掉不合法字符
/// </summary>
/// <param name="filePath"></param>
private string CheckFilePath(string filePath)
{
string dir = Path.GetDirectoryName(filePath);
string fileName = Path.GetFileNameWithoutExtension(filePath);
string ext = Path.GetExtension(filePath); string[] illegalChars = { ":", "*", "?", "\"", "<", ">", "|", @"\", "/" };
for (int i = ; i < illegalChars.Length; i++)
{
fileName = fileName.Replace(illegalChars[i], "");
}
string rlt = Path.Combine(dir, fileName + ext);
return rlt;
}
}
}
调用
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using ASPNETCoreExcel.Models;
using Microsoft.AspNetCore.Hosting;
using System.IO;
using OfficeOpenXml;
using System.Data; namespace ASPNETCoreExcel.Controllers
{
public class HomeController : Controller
{
private IHostingEnvironment _hostingEnvironment; public HomeController(IHostingEnvironment hostingEnvironment)
{
_hostingEnvironment = hostingEnvironment;
}
public IActionResult Index()
{
return View();
} public IActionResult About()
{
ViewData["Message"] = "Your application description page."; return View();
} public IActionResult Contact()
{
ViewData["Message"] = "Your contact page."; return View();
} public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
/// <summary>
/// 不根据指定模板进行导出excel下载(非npoi实现)
/// </summary>
/// <returns></returns>
public IActionResult Export2()
{
string sWebRootFolder = _hostingEnvironment.WebRootPath;
string sFileName = "部落.xlsx"; FileInfo file = new FileInfo(Path.Combine(sWebRootFolder, sFileName));
file.Delete();
using (ExcelPackage package = new ExcelPackage(file))
{
// 添加worksheet
ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("部落");
//添加头
worksheet.Cells[, ].Value = "ID";
worksheet.Cells[, ].Value = "Name";
worksheet.Cells[, ].Value = "Url";
//添加值
worksheet.Cells["A2"].Value = ;
worksheet.Cells["B2"].Value = "For丨丶";
worksheet.Cells["C2"].Value = "https://buluo.qq.com/p/barindex.html?bid=310072"; worksheet.Cells["A3"].Value = ;
worksheet.Cells["B3"].Value = "For丨丶Tomorrow";
worksheet.Cells["C3"].Value = "https://buluo.qq.com/p/barindex.html?bid=310072";
worksheet.Cells["C3"].Style.Font.Bold = true;
package.Save();
}
return File(sFileName, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", sFileName);
} /// <summary>
/// 根据指定模板进行导出excel下载(npoi实现)
/// </summary> public IActionResult Export()
{
var TempletFilePath = @"D:\谷歌下载\ASPNETCore操作Excel\ASPNETCoreExcel\Template";//模板地址
var ExportFilePath = "D:";//导出后存放的地址
string TempletFileName = string.Format("{0}\\调查表.xls", TempletFilePath);
string ExportFileName = string.Format("{0}\\调查表_{1}.xls", ExportFilePath, DateTime.Now.ToString("yyyy年MM月dd日hh时mm分ss秒")); var _NpoiExcelUtility = new NpoiExcelUtility(ExportFileName, TempletFileName);
#region 测试数据
//创建DataTable
DataTable dt = new DataTable("NewDt"); //创建自增长的ID列
DataColumn dc = dt.Columns.Add("id", Type.GetType("System.Int32"));
dc.AutoIncrement = true; //自动增加
dc.AutoIncrementSeed = ; //起始为1
dc.AutoIncrementStep = ; //步长为1
dc.AllowDBNull = false; //非空 //创建其它列表
dt.Columns.Add(new DataColumn("Name", Type.GetType("System.String"))); //创建数据
DataRow dr = dt.NewRow();
dr["Name"] = "张三";
dt.Rows.Add(dr); dr = dt.NewRow();
dr["Name"] = "李四";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["Name"] = "王五";
dt.Rows.Add(dr);
#endregion
_NpoiExcelUtility.CreatExcelSheet("调查表", dt);
_NpoiExcelUtility.SaveExcel();
var stream = System.IO.File.OpenRead(ExportFileName);//excel表转换成流
return File(stream, "application/vnd.android.package-archive", Path.GetFileName(ExportFileName));//进行浏览器下载 } }
}
前端界面
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Xlsx</title>
</head>
<body>
<h2>ASP.NET Core 导出Excel xlsx 文件</h2>
<a asp-action="Export">导出Excel</a>
</body>
</html>
ASP.NETCore -----导出Excel文件并下载的更多相关文章
- asp.net 导出excel文件
之前做过winfrom程序的导出excel文件的功能,感觉非常简单.现在试着做asp.net中导出excel的功能,之前用的是Microsoft.Office.Interop.Excel这个对象来实现 ...
- ASP.NET导出Excel文件
第一种最常见,并且最简单的方式,直接把GridView导出,导出格式为文本表格形式. protected void btnSaveExcel_Click(object sender, EventArg ...
- ASP.NETCore -----导入Excel文件
前端上传excel文件利用npoi读取数据转换成datatable(netcore坑爹啊,用的vs2017竟然不能可视化) 前端界面 @{ Layout = null; } <!DOCTYPE ...
- ASP.NET 导出EXCEL文件处理多对应排列的
这次项目遇到了一个导出excel需要对应排列的问题.本来在做这个项目之前都基本没做过excel导出的菜鸡,这次强行做还是有些忐忑的,加上那个表的结构比较奇特. 废话不多说,先介绍表结构吧 是数据 ...
- ASP.NET 导出excel文件出现乱码的解决办法
string html =TABLE ;//<table>标签,可以是多张表string modified = Regex.Replace(html, "<table &g ...
- Spring Boot下的一种导出Excel文件的代码框架
1.前言 在Spring Boot项目中,将数据导出成Excel格式文件是常见的功能.与Excel文件导入类似,此处也用代码框架式的方式实现Excel文件导出,使得代码具有可重用性,并保持导出数据 ...
- ASP.NET Core导入导出Excel文件
ASP.NET Core导入导出Excel文件 希望在ASP.NET Core中导入导出Excel文件,在网上搜了一遍,基本都是使用EPPlus插件,EPPlus挺好用,但商用需要授权,各位码友若有好 ...
- 关于asp.net C# 导出Excel文件 打开Excel文件格式与扩展名指定格式不一致的解决办法
-----转载:http://blog.csdn.net/sgear/article/details/7663502 关于asp.net C# 导出Excel文件 打开Excel文件格式与扩展名指定格 ...
- asp.net导出excel示例代码
asp.net导出excel的简单方法. excel的操作,最常用的就是导出和导入. 本例使用NPOI实现. 代码:/// <summary> ); ; ...
随机推荐
- 4-form表单的双向绑定
概念:表单中的input框等其他标签,值变化时会触发函数,改变state中的值,反过来修改state中的值也会改变input框中值的展现 实现:利用类组件里的state属性来实现(setState会再 ...
- 了解 Fetch API与Fetch+Async/await
背景 提及前端与服务器端的异步通信,离不开 Ajax (Asynchronous JavaScript and XML).实际上我们常说的 Ajax 并非指某一项具体的技术,它主要是基于用脚本操作 H ...
- C++中文件的读取操作,如何读取多行数据,如何一个一个的读取数据
练习8.1:编写函数.接受一个istream&参数,返回值类型也是istream&.此函数必须从给定流中读取数据,直至遇到文件结束标识时停止. #include <iostrea ...
- Django下关于session的使用
一.Session的概念 cookie是在浏览器端保存键值对数据,而session是在服务器端保存键值对数据 session 的使用依赖 cookie:在使用Session后,会在Cookie中存储一 ...
- gets和scanf区别
scanf 和 gets 读取字符串 深入了解scanf()/getchar()和gets()等函数 scanf与gets函数读取字符串的区别 今天看到一段话,大致是说gets比scanf()快,有点 ...
- MySQL操作之DCL
目录 SQL语句的分类 DCL语句 SQL语句的分类 DDL(Data Definition Languages)语句:数据定义语言.这些语句定义了不同的数据段. 数据库.表.列.索引等数据库对象的定 ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 按钮:表示成功的动作
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Python 数据的输入
一.单个输入 a=input("输入提示语句")#默认a的类型是字符串 b=input() 二.一行输入两个/三个数据,数据之间用空格间隔开 #a,b的数据类型都是整数 a,b=m ...
- BUAA软工第一次作业-热身
第一次作业-热身 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) (北京航空航天大学 - 计算机学院) 这个作业的要求在哪里 第一次作业-热身作业(阅读) 我在这个课程 ...
- Linux命令:cp命令
cp命令作用:拷贝文件和目录 一.格式 cp [OPTION]... [-T] SOURCE DEST cp [OPTION]... SOURCE... DIRECTORY cp [OPTION].. ...