NOPI实现EXCEL带图片导入并获取图片行位置(C#)

1 篇文章 0 订阅

源代码地址https://github.com/junkai-li/NetCoreKevin
基于NET6搭建跨平台WebApi架构支持单点登录、多缓存、自动任务、分布式、多租户、日志、授权和鉴权 、网关 注册与发现、CAP集成事件、领域事件、 docker部署
直接上代码

     /**
        * 
        * 获取图片
        * key = 图片所在行 value = 图片对象  XSSFPictureData中的Data就是图片的文件流
        * @param workbook
        * @return Map(row,image);
*/
        private static Dictionary<int, List<XSSFPictureData>> GetPicMap(XSSFWorkbook wb)
        {


            Dictionary<int, List<XSSFPictureData>> picMap = new Dictionary<int, List<XSSFPictureData>>();
            var pictures = wb.GetAllPictures();
            XSSFSheet sheet = (XSSFSheet)wb.GetSheetAt(0);
            foreach (XSSFShape shape in sheet.GetDrawingPatriarch().GetShapes())
            {
                XSSFClientAnchor anchor = (XSSFClientAnchor)shape.GetAnchor();
                List<XSSFPictureData> list = new List<XSSFPictureData>();


                if (shape is XSSFPicture) {
                    XSSFPicture pic = (XSSFPicture)shape;
                    var picture = (XSSFPicture)shape; 

                    XSSFPictureData picData = (XSSFPictureData)picture.PictureData;
                    //如果通过本次获取的行能得到value,说明本行已存在, 
                    if (picMap.Where(x => x.Key == anchor.Row1).Count() > 0)
                    {
                        //找到本行的集合
                        List<XSSFPictureData> list2 = picMap.Where(x=>x.Key==anchor.Row1).FirstOrDefault().Value;
                        //将图片存储进去 
                        list2.Add(picData);
                        //进入下一轮循环
                        continue;
                    }
                    //添加本次循环的图片对象
                    list.Add(picData);
                    //将本张图片的行信息作为key存入map,将图片对象作为值存储
                    picMap.Add(anchor.Row1, list);
                }
                else
                {
                    //非图片数据则插入null
                    picMap.Add(anchor.Row1, null);
                }

            } 
         return picMap;
    } 

附获取图片dic之后 保存到本地并上传到OSS

products 是业务dtos
        public static void UploadProductImgsAsync(Dictionary<int, List<XSSFPictureData>> keyValues, List<TProduct> products)
        {
            string basepath = "/Files/" + DateTime.Now.ToString("yyyy/MM/dd");
            string filepath = Libraries.IO.Path.ContentRootPath() + basepath;
            Directory.CreateDirectory(filepath);
            using (dbContext db = new dbContext())
            {

                for (int i = 0; i < products.Count - 1; i++)
                {
                    var keyvlue = keyValues.Where(x => x.Key == (i + 1)).FirstOrDefault();
                    var item = products[i];
                    if (keyvlue.Value != null && keyvlue.Value.Count() > 0)
                    {

                        foreach (XSSFPictureData picturedata in keyvlue.Value)
                        {
                            var file = picturedata.Data;
                            var fileName = Guid.NewGuid().ToString() + "." + picturedata.MimeType.Replace("image/", "");
                            var imgpath = filepath + "//" + fileName;
                            //这里是保存到本地
                            using (MemoryStream ms = new MemoryStream(file))
                            {
                                Image outputImg = Image.FromStream(ms);
                                outputImg.Save(imgpath, ImageFormat.Jpeg); 
                            } 
                            //using (FileStream fs = System.IO.File.Create(imgpath))
                            //{
                            //    fs.Write(file, 0, file.Length);
                            //    fs.Flush();
                            //}
                            var userId = item.CreateUserId;

                            string path = "";

                            var isSuccess = false;

                            if (file != null && file.Length > 0)
                            {
                                path = filepath + "/" + fileName;

                                var upRemote = true;
								//这里是上传到oss
                                if (upRemote)
                                {

                                    var oss = new Common.AliYun.OssHelper();
					
                                    var upload = oss.FileUpload(path, "Files/" + DateTime.Now.ToString("yyyy/MM/dd"), fileName);

                                    if (upload)
                                    {
                                        Common.IO.IOHelper.DeleteFile(path);

                                        path = "/Files/" + DateTime.Now.ToString("yyyy/MM/dd") + "/" + fileName;
                                        isSuccess = true;
                                    }
                                }
                                else
                                {
                                    path = basepath + "/" + fileName;
                                    isSuccess = true;
                                }

                            }

                            if (isSuccess)
                            {
								//存入数据库
                                var f = new TFile();
                                f.Id = Guid.NewGuid();
                                f.IsDelete = false;
                                f.Name = fileName;
                                f.Path = path;
                                f.Table = "TProduct";
                                f.TableId = item.Id;
                                f.Sign = "Image";
                                f.CreateUserId = userId;
                                f.CreateTime = DateTime.Now;
                                db.TFile.Add(f);
                                db.SaveChanges();
                            }
                            else
                            {
                                //HttpContext.Response.StatusCode = 400;

                                //HttpContext.Items.Add("errMsg", "文件上传失败!");

                                //return default;
                            }
                        }
                    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值