使用ClosedXML实现Excel导入导出

使用ClosedXML实现Excel导入导出

写在开头

游览Dotnet 基金会中的项目时,发现了这个库,Github 链接,它的性能非常好,详细见下图

截屏2025-01-02 20.30.29

话不多说,直接上代码吧!

导出

后端:
public static byte[] Output<T>(List<T> data,  string sheetName) 
    {
        using var workbook = new XLWorkbook();
            var worksheet = workbook.Worksheets.Add(sheetName);

            var properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);

            //表头
            for (int i = 0; i < properties.Length; i++)
            {
                worksheet.Cell(1, i + 1).Value = properties[i].Name;
            }

            //值
            for (int row = 0; row < data.Count; row++)
            {
                for (int col = 0; col < properties.Length; col++)
                {
                    var value = properties[col].GetValue(data[row], null);
                    worksheet.Cell(row + 2, col + 1).Value = value?.ToString()??"" ;
                }
            }

            //保存至内存流
            using var ms = new MemoryStream();
            workbook.SaveAs(ms);
            ms.Position = 0;
            return ms.ToArray();
    }
[HttpGet("output")]
    public async Task<IActionResult> Output()
    {
        var data =
            new{
               字段1=1,
                 字段2=“2”
            };
        return File(ExcelHelper.Output(data,“标题”), "application/octet-stream", "output.xls");
    }
前端:
export function fileDownAction(url, parameter) {
  return request({//axios
    url: url,
    method: 'get',
    params: parameter,
    responseType: 'blob'
  })
}
let timeStamp = Date.parse(new Date()).toString().substring(0, 10)
fileDownAction(url + "/output", params).then((res) => {
          // 处理返回的文件流
          let url = window.URL.createObjectURL(new Blob([res]))
          let link = document.createElement('a')
          link.style.display = 'none'
          link.href = url
          link.setAttribute('download', fileName + timeStamp + ".xls")
          document.body.appendChild(link)
          link.click()
        })

导入

后端:
public static async Task<IXLWorksheet> CreateTableAsync(IFormFile file)
    {
        var ms = new MemoryStream();
        await file.CopyToAsync(ms);
        ms.Position = 0;
         var workbook = new XLWorkbook(ms);
        // 获取第一个工作表
        return workbook.Worksheet(1);
    }
//根据位置获取单元格的值
public static string GetCellValue(IXLWorksheet worksheet,string address)
    {
        return worksheet.Cell(address).Value.ToString();//“B12”
  //return worksheet.Cell(row,column).Value.ToString(); 
    }
//根据值获取单元格地址
public static IXLAddress GetCellAddress(IXLWorksheet worksheet,string cellName)
    {
        return  worksheet.CellsUsed(a=>a.Value.ToString()==cellName).First().Address;
  // 以下返回“B12”此类字符串
  //worksheet.CellsUsed(a=>a.Value.ToString()==cellName).First().ToString();
    }

前端代码我就不贴了,传入一个file对象即可

写在最后

如果觉得该库好用,可以去github点个star哦!

posted @   ssz0312  阅读(50)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示