.net core 导入导出Excel(把Excel导入到数据库,把数据库数据导出到Excel中)。

  1. 安装nuget包

NPOI

 

我们开发的就是NPOI导入导出

1.1首先我们的开发框架是blog.core(老张的哲学)

Blog.Core (neters.club) 官网

1.2我们需要使用Dto和实体进行传输数据

Dto和实体转换

  • 我们的业务逻辑在APi控制器里实现

依赖注入我们需要的接口,到开发中我们需要里面的方法。

首先我们开始导入数据(代入数据是把Excel里面数据导入到数据库这样的一个效果 我们到公司里面会遇到这种情况)

标注 111111111111111111

 [HttpPost("ImportFile")]

        //IFromFile   表示上传文件接口

        public async  Task<MessageModel> ImportFile(IFormFile file)

        {

            //实例化/创建一个控制 List<SeckillGoodMessageDto> 来存放Excel

            List<SeckillGoodMessageDto> users=new List<SeckillGoodMessageDto>();

            1.

            #region 第一部分上传文件

            //接着,使用HttpContext.Request.Form.Files获取上传的文件

            //并将其保存到服务器的/wwwroot目录下。

            file = HttpContext.Request.Form.Files[0]; // 获取上传的第一个文件,因为该控制器方法只支持上传单个文件。

            //         保存到这     file.FileName 表示上传的文件的文件名。

            var path = "wwwroot/" + file.FileName;

#上述就是拿到文件 放到wwwroot里面

            //使用FileStream类的构造函数创建一个新的FileStream对象,

            //并将指定路径的文件以"打开或创建"的模式打开(FileMode.OpenOrCreate)。

            FileStream 类通常用于创建、打开和读取文件。

   /// using 语句定义了一个作用域,在作用域结束时会自动释放 FileStream 所占用的资源。这是一种编写可靠代码的好习惯,可以确保不会意外地在应用程序中保留文件句柄。

保存到磁盘上的指定路径

            using (FileStream fs=new FileStream(path,FileMode.OpenOrCreate))

            {

                file.CopyTo(fs);  //把拿到的数据CopyTo到file中(file上传文件)

            }

            #endregion

            #region 第二部分 获取文件内容

            //然后,打开文件并使用NPOI库读取文件内容,将每行数据转化为SeckillGoodMessageDto对象,并将其添加到users列表中。

            //首先,使用File.Open方法打开指定路径的Excel文件,获取一个文件流(stream2)对象。

            var stream2 = System.IO.File.Open(path, FileMode.Open);

            //接着,使用NPOI库中的XSSFWorkbook类构造一个Excel工作簿对象(book),并将刚刚打开的文件流对象作为参数传入。这个XSSFWorkbook类是NPOI库中专门用于处理.xlsx格式的Excel文件的类。

            var book =new NPOI.XSSF.UserModel.XSSFWorkbook(stream2);

           // HSSFWorkbook workbook = new HSSFWorkbook(file);

            //使用book对象的GetSheetAt(0)方法,获取Excel工作簿的第一个工作表,并将其赋值给sheet变量。

            var sheet = book.GetSheetAt(0);

            //接下来,使用sheet对象的LastRowNum属性获取工作表中数据行的最大行数,并将其赋值给rows变量。在这个Excel文件中,第一行是标题行,所以我们从第二行开始遍历。

            int rows = sheet.LastRowNum;

            for (int i = 1; i <= rows; i++)

            {

                //使用sheet对象的GetRow()方法,获取当前行的行对象,并将其赋值给row变量。

                var row = sheet.GetRow(i);

                //创建一个SeckillGoodMessageDto类型的DTO对象userss,并将该行的第一列和第二列单元格的值分别赋值给DTO对象的Title和ShopPhoto属性。

                SeckillGoodMessageDto userss = new SeckillGoodMessageDto();

                /* userss.Title = row.GetCell(0).StringCellValue;

                 userss.ShopPhoto = row.GetCell(1).StringCellValue;

                 userss.ShopId = row.GetCell(2).ObjToInt();*/

                //ShopId

                userss.ShopId = row.GetCell(0).ObjToInt();

                //Spuid

                userss.Spuid = row.GetCell(1).ObjToInt();

                //Skuid

                userss.Skuid = row.GetCell(2).ObjToInt();

            /*    userss.Title = row.GetCell(3).StringCellValue;

                userss.ShopPhoto = row.GetCell(4).StringCellValue;

*//*                userss.Price = row.GetCell(5).ObjToDecimal();     //他俩是decimal

                userss.CostPrice = row.GetCell(6).ObjToDecimal();*//*

                userss.CreateTime = row.GetCell(5).StringCellValue;

                userss.CheckTime = row.GetCell(6).StringCellValue;

                userss.Status = row.GetCell(7).ObjToInt();

                userss.StartTime = row.GetCell(8).StringCellValue;

                userss.Endime = row.GetCell(9).StringCellValue;

                userss.Num = row.GetCell(10).ObjToInt();

                userss.Stock = row.GetCell(11).ObjToInt();

                userss.Describes = row.GetCell(12).StringCellValue;*/

                //最后,将DTO对象添加到列表变量users中。

                users.Add(userss);

            }

            #endregion

            #region 第三部分 将数据添加到数据库

            //最后,使用_seckillGoodMessageServices服务将users列表中的数据添加到数据库中,并返回结果。

            var result =await _seckillGoodMessageServices.Adds(users);

//成功

            if (result!=null)

            {

                return new MessageModel()

                {

                    status = 200,

                    success = true,

                    msg="成功",

                };

            }

//否则失败

            else

            {

                return new MessageModel()

                {

                    status = 500,

                    success = false,

                    msg="失败",

                   

                };

            }

            #endregion

        }

下面开始我们的导出(导出是和导入相反的把数据库数据导出到Excel中)

标注:111111111111111

   [HttpGet("ExportFile")]

        //导出文件

        public async Task<IActionResult> ExportFile()

        {//(把数据库数据导出到Excel中)

            //获取数据库数据

            var list = await _seckillGoodMessageServices.Query();

            string filePath = "";

            //获取文件路径和名称

            var wwwroot = _host.WebRootPath;

            var filename = "用户表.xlsx";

            filePath = Path.Combine(wwwroot, filename);

            //创建一个工作簿和工作表

            NPOI.XSSF.UserModel.XSSFWorkbook book = new NPOI.XSSF.UserModel.XSSFWorkbook();

            var sheet = book.CreateSheet();

            //创建表头行

            var headerRow = sheet.CreateRow(0);

            headerRow.CreateCell(0).SetCellValue("Title");

            headerRow.CreateCell(1).SetCellValue("ShopPhoto");

            //创建数据行

            var data = list.ToList();

            for (int i = 0; i < data.Count(); i++)

            {

                var dataRow = sheet.CreateRow(i + 1);

                dataRow.CreateCell(0).SetCellValue(data[i].Title);

                dataRow.CreateCell(1).SetCellValue(data[i].ShopPhoto);

            }

            //将Execel 文件写入磁盘

            using (var f = System.IO.File.OpenWrite(filePath))

            {

                book.Write(f);

            }

            //将Excel 文件作为下载返回给客户端

            var bytes = System.IO.File.ReadAllBytes(filePath);

            return File(bytes, "application/octet-stream", $"{System.DateTime.Now.ToString("yyyyMMdd")}.xlsx");

        }

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值