Blazor使用EPPlus导出Excel表格的实现
文章标签:
bootstrap table参数
基于bootstrapblazor项目模版,Server模式下实现的,在其他前端框架中导出Excel的方法很多,但是适合于Blazor导出的基本上没有,虽然bootstrapblazor自带一个可以把表格导出为Excel的实现,但是只能根据表格内容进行导出,如果表格是分页的,那么只能导出当前页面的,另外也无法对导出的表格格式、导出的列进行设置,使用起来不太方便,经过多方寻找,终于找到了通过epplus来导出excel的方法。
引用EPPlus
通过nuget直接引用EPPlus,以便于在项目中使用,基本上都是从数据库中加载数据的,所以选择适合你的ORM框架,但是EPPlus可以通过DataTable加载数据,那么通过最原始的硬写SQL语句也是可以的,可以说更加的灵活方便[憨笑]
数据库数据读取
直接通过数据库连接字符串和SQL语句从数据库中读取需要的数据,没有使用ORM框架,在需要的地方直接使用GetDataTable来得到数据即可。
public static string conStr = "Server=192.168.3.111;Database=数据库名称;User Id=sa;Password=密码;Encrypt=True;TrustServerCertificate=True;Pooling=true;Min Pool Size=1";
/// <summary>
/// 根据SQL语句返回DataTable
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public static DataTable GetDataTable(string sql)
{
DataTable dt = new DataTable();
DataSet ds = new DataSet();
using (SqlConnection con = new SqlConnection(conStr))
{
using (SqlCommand cmd = new SqlCommand(sql, con))
{
con.Open();
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
da.Fill(dt);
}
}
}
return dt;
}
Blazor界面
在blazor页面中,通过一个按钮来生成excel文件,然后再通过一个链接来点击后实现下载,如下
<button class="btn btn-primary" @onclick="DExcel">生成Excel</button>
<a download="合同汇总.xlsx" href="@DataUrl" class="btn btn-primary" hidden="@downExcel">点击下载</a>
混合写法时在页面前端的引用
@using OfficeOpenXml
@using System.Reflection.Metadata
@using System.Data
@using OfficeOpenXml.Style
导出代码的实现
private string DataUrl { get; set; }
private Boolean downExcel = true;
protected override async void OnInitialized()
{
base.OnInitialized();
//很重要, 没有会直接授权报错
ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.NonCommercial;
}
private async void DExcel()
{
string sql = "select 客户名称,合同名称,关键内容,合同金额,签订日期,签订公司 from 合同信息 ";
DataTable dt = new DataTable();
dt = OA.GetDataTable(sql);
using (var pk = new OfficeOpenXml.ExcelPackage())
{
var sheet = pk.Workbook.Worksheets.Add("Data");
//从DataTable中加载数据
sheet.Cells["A1"].LoadFromDataTable(dt, true);
//设置行列格式
sheet.Row(1).Height = 25;
sheet.Cells["A1:F1"].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;//水平居中
sheet.Cells["A1:F1"].Style.VerticalAlignment = ExcelVerticalAlignment.Center;//垂直居中
sheet.Cells["A1:F1"].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
sheet.Cells["A1:F1"].Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.GreenYellow);
sheet.Cells["A1:F1"].Style.Font.Size = 10;
sheet.Cells.Style.Font.Size = 10;
sheet.Column(1).AutoFit();
sheet.Column(2).AutoFit();
//对数据进行输出
var msOutput = new System.IO.MemoryStream();
pk.SaveAs(msOutput);
DataUrl = "data:application/octet-stream;base64," + Convert.ToBase64String(msOutput.ToArray());
StateHasChanged();
downExcel = false;
}
}
其中downExcel用来控制下载链接的显示,你可以更好的进行优化,下载时隐藏掉生成按钮,生成时隐藏掉下载按钮。
最后的成品如下所示,先生成,再下载,不过不建议对列使用格式,设置列的格式后会导致表格体积暴增,也可能是我设置的方法不对。
到此就完成了Blazor中Excel表格的导出了,只需要把导出和下载按钮放在需要的地方就行,然后通过SQL语句来控制获取的数据,非常的完美!