Blazor使用EPPlus导出Excel表格的实现

基于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语句来控制获取的数据,非常的完美!



#挑战30天在头条写日记##头条开新年#