.Net Core 通过EPPlus将数据写入Excel并导出写入后的Excel文件
先下载NuGet包 (我拿7.0.10版本示例)
引入命名控件
using System.IO;
using OfficeOpenXml;
using OfficeOpenXml.Style;
开始上代码
/// <summary>
/// 导出Excel
/// </summary>
/// <returns></returns>
public async Task<byte[]> OutOfferExcelAsync(List<PriceSheet> item)
{
// 因为我用的数据库的数据做为添加到模板的数据,数据实现具体看自己实现
List<Guid> Ids = item.Select(it => it.id).ToList();
List<RecordSelectVersion> rsvAll = await this.FindListAsync(Ids);
// 项目文件模板位置
FileInfo Puth = new FileInfo("../Common/template/报价单模板.xlsx");
// 判断文件路劲中找的模板在不在
bool bo = Puth.Exists;
// 找不到文件报错返回
if (!bo) {
throw new Exception("文件模板未找到");
}
//导出数据类型为byte[]
byte[] excelBytes = null;
using (var package = new ExcelPackage(Puth))
{
// 因为不是商业版的得加这段话
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
// 获取工作簿中的 报价单表
ExcelWorksheet worksheet = package.Workbook.Worksheets["报价单"];//只有一张表可以直接用 [0]表示找工作簿中第一张表
// 因为模板需插入区域行数不够需插入新行具体样式及行数看自己需求
for (int i = 0; i < Ids.Count; i++)
{
// 希望从第11行插入新行
int rowIndex = 11;
// 插入行数为1,每次插入一行
worksheet.InsertRow(rowIndex, 1);
//将插入行4至6列合并
worksheet.Cells[rowIndex, 4, rowIndex, 6].Merge = true;
//创建一个范围对象,它涵盖了从第1列到第9列(包括)的当前行的所有单元格。为了给他们上单元格样式
ExcelRangeBase mergedCell = worksheet.Cells[rowIndex, 1, rowIndex, 9];
mergedCell.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center; // 水平居中
mergedCell.Style.VerticalAlignment = ExcelVerticalAlignment.Center; // 垂直居中
mergedCell.Style.Border.Top.Style = ExcelBorderStyle.Thin; // 上边框样式
mergedCell.Style.Border.Bottom.Style = ExcelBorderStyle.Thin; // 下边框样式
mergedCell.Style.Border.Left.Style = ExcelBorderStyle.Thin; // 左边框样式
mergedCell.Style.Border.Right.Style = ExcelBorderStyle.Thin; // 右边框样式
// 设置行高
worksheet.Row(rowIndex).Height = 25; // 设置行高为20(可根据需要调整)
}
int row = 10; // 从第十行开始写入数据
int cont = 1;
int d = 0;
foreach (var it in rsvAll)
{
// 写入数据到对应列
worksheet.Cells[row, 1].Value = cont++;
worksheet.Cells[row, 2].Value = it.Version;
worksheet.Cells[row, 3].Value = it.res;
worksheet.Cells[row, 4].Value = it.gearbox + "/" + it.EVersion;
worksheet.Cells[row, 7].Value = item[d].Univalence;
worksheet.Cells[row, 8].Value = item[d].Number;
worksheet.Cells[row, 9].Value = item[d].Total;
// ... 写入其他属性 ...
row++; // 移动到下一行
d++;
}
// 因为不是所有数据都是一行一行的添加所以可以指定位置写入单元格
worksheet.Cells[5, 2].Value = item[0].Unit;
worksheet.Cells[5, 5].Value = item[0].InquiryName;
worksheet.Cells[5, 8].Value = item[0].InquiryPhone;
worksheet.Cells[6, 2].Value = item[0].InquiryEmil;
worksheet.Cells[6, 5].Value = item[0].OfferName;
worksheet.Cells[6, 8].Value = DateTime.Now.ToString("G");
worksheet.Cells[19 + Ids.Count, 2].Value = item[0].descr; // 在这里加 Ids.Count 是应为上边增加了新行,底下的指定位置也会发生改变,因为只增加了行数,列数没变所以得加
worksheet.Cells[21 + Ids.Count, 2].Value = item[0].OfferName;
worksheet.Cells[12 + Ids.Count, 2].Value = item[0].TotalPrices;
worksheet.Cells[12 + Ids.Count, 6].Value = item[0].BigWrite;
//将处理好的Excel数据定义为byte[]导出数据类型
excelBytes = package.GetAsByteArray();
return excelBytes;
//想直接导出Excel文件的话不转byte[]格式的话可直接返回File 将返回值改为IActionResult就行了
//return File(package,"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","XXX.xlsx");
}
}
导出到页面下载
/// <summary>
/// 报单导出
/// </summary>
/// <returns></returns>
//[Transactional]
[HttpPost("Outexcel")]
public async Task<IActionResult> Outexcel([FromBody] dynamic list)
{
// 在前端请求config中把responseType的响应类型改为blob以便处理二进制数据,创建新的Blob对象的构造函数
// 指定Blob对象的MIME类型'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
// 第三个参数是导出时文件名,前端设置了下载名的话会以前端下载名为准
return File(await this.DefaultService.OutOfferExcelAsync(item), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", $"{DateTime.Now.ToString("df")}报价单.xlsx");
}
够细了吧再细就成细狗了