首页 > 编程语言 >c# office版本excel带图片的批量导入

c# office版本excel带图片的批量导入

时间:2022-11-16 12:02:10浏览次数:48  
标签:xml office c# excel var dt null 上传 图片

本人因为业务需要使用的上传附件功能是oss上传,大家可以将其改成各自需要的上传方法.....

excel在修改其后缀成zip压缩文件格式,再将其解压后会得到对应的表格和图片信息,

图片信息存储在解压文件后的:xl/drawings/drawing1.xml  和 xl/drawings/_rels/drawing1.xml.rels 文件中

xml中文件存储了图片在所在行列信息、还有对应的图片主键信息

 

 

 

第二个文件存储了图片主键对应图片具体指向位置

 

 

 

 

 

 

一、将图片插入到excel的表格中

       office版本的图片插入比较费劲哈

 

     整理完excel之后接下来就是功能编写

二、上传excel功能

    1. 自己编写或者网上找一个上传的excel转成datatale功能,或者根据业务需要改成对应的功能

 

 

 

   2. 将其上传的后的文件解压成解压的文件流

 

 

 

   3.找到解压后的所在图片的流信息,并将流信息暂存和对应的路径,暂存到Dictionary中

 

 

   4. 解析xml文件文件

 

 

   5. 上传图片到oss服务器上,并将路径赋值对应的datatable的图片行列位置上

 

 

 

 

代码:

public async Task<ResponseResult<string>> PutUploadExcelFile_Img(IFormFile file)
        {
            #region 校验文件
            //校验文件
            if (file == null)
            {
                return ResponseResult<string>.Error("上传的文件不能为空");
            }

            //验证文件格式
            if (!file.FileName.EndsWith(".xlsx") && !file.FileName.EndsWith(".xls"))
            {
                return ResponseResult<string>.Error("文件格式不正确");
            }

            #endregion


            //将上传的文件转成datatable
            var dt = ExcelHelper.ExcelToTableForXLSX(file.OpenReadStream());
            if (dt != null && dt.Rows.Count > 0)
            {
                //上传文件到oss,并将其通过文件流转成zip格式,解析文件后续使用
                var result = await _voucherFileService.PutTempFile(file, ".zip");
                if (result != null)
                {

                    //解压完的文件流
                    Stream unzippedEntryStream;
                    //文件流
                    Dictionary<string, Stream> xmlDic = new Dictionary<string, Stream>();
                    //图片二进制流
                    Dictionary<string, byte[]> byteDic = new Dictionary<string, byte[]>();

                    //从网络路径获取对应文件流
                    WebRequest webreq = WebRequest.Create(result.FileURL.StartsWith("https://") ? result.FileURL : "https://" + result.FileURL);
                    WebResponse webres = webreq.GetResponse();
                    using (Stream stream = webres.GetResponseStream())
                    {
                        //转换成压缩文件流形式
                        System.IO.Compression.ZipArchive archive = new System.IO.Compression.ZipArchive(stream);
                        foreach (System.IO.Compression.ZipArchiveEntry entry in archive.Entries)
                        {
                            if (entry.FullName.EndsWith(".xml", StringComparison.OrdinalIgnoreCase) //所有的xml数据文件
                                || entry.FullName.Contains("/media/", StringComparison.OrdinalIgnoreCase) //获取媒体资源数据
                                || entry.FullName.EndsWith(".rels", StringComparison.OrdinalIgnoreCase)) //获取媒体文件对应的数据
                            {

                                //读取压缩流并转换
                                unzippedEntryStream = entry.Open();
                                //赋值到对应的
                                xmlDic.Add(entry.FullName, unzippedEntryStream);
                            }
                        }


                        //解压成功获取xml 节点做处理
                        XmlNodeList exclNode = GetXmlNodeListByKey(xmlDic, "xl/drawings/drawing1.xml");
                        //图片对应的图片路径信息
                        XmlNodeList pictNode = GetXmlNodeListByKey(xmlDic, "xl/drawings/_rels/drawing1.xml.rels");

                        //excel图片信息
                        List<ExcelHelper.ExcelImgModel> imgModels = new List<ExcelHelper.ExcelImgModel>();
                        if (exclNode != null)
                        {
                            //获取图片信息与地址
                            foreach (var nl in exclNode)
                            {

                                XmlElement sondNode = (XmlElement)nl;
                                XmlNodeList descendDodeList = sondNode.ChildNodes;
                                XmlNodeList fromNodeList = descendDodeList[0].ChildNodes;

                                //取得行号和列号
                                var row = Convert.ToInt32(fromNodeList.Item(2).InnerText.Trim());
                                var col = Convert.ToInt32(fromNodeList.Item(0).InnerText.Trim());
                                XmlNodeList picNodeList = descendDodeList[2].ChildNodes;
                                XmlNodeList blipFillNodeList = picNodeList[1].ChildNodes;
                                XmlElement picElement = (XmlElement)blipFillNodeList.Item(0);
                                //获取图片的主键
                                string id = picElement.GetAttribute("r:embed").ToString();
                                if (pictNode != null)
                                {
                                    foreach (XmlNode xn in pictNode)
                                    {
                                        XmlElement xe = (XmlElement)xn;
                                        //图片图片路径和信息
                                        if (xe.GetAttribute("Id").ToString() == id)
                                        {
                                            //图片的路径
                                            var _picturePath = string.Format("xl{0}", xe.GetAttribute("Target").ToString().Replace("..", ""));
                                            var _picStreamList = xmlDic.Where(ls => ls.Key == _picturePath);
                                            if (_picStreamList != null && _picStreamList.Count() > 0)
                                            {
                                                var _picStream = _picStreamList.FirstOrDefault().Value;

                                                //图片转换
                                                byte[] _bytepic;
                                                using (var ms = new MemoryStream())
                                                {
                                                    _picStream.CopyTo(ms);
                                                    _bytepic = ms.ToArray();
                                                }
                                                if (_bytepic.Length > 0)
                                                {
                                                    //oss图片上传
                                                    var _upImgResult = await _voucherFileService.PutTempFile(_picturePath.Substring(_picturePath.LastIndexOf("/") + 1), _bytepic, null, this.Current);
                                                    imgModels.Add(new ExcelImgModel()
                                                    {
                                                        ID = id,
                                                        Col = col,
                                                        Row = row,
                                                        PathOfPicture = _upImgResult.FileURL
                                                    });
                                                }
                                            }
                                            break;
                                        }
                                    }
                                }
                            }
                        }

                        //将图片路径信息存储到对应的dt中
                        //图片对应dt的哪一列,存到dt然后再循环dt去处理
                        foreach (var item in imgModels)
                        {
                            dt.Rows[item.Row - 1][item.Col] += string.IsNullOrWhiteSpace(dt.Rows[item.Row - 1][item.Col].ToString()) ? item.PathOfPicture : "," + item.PathOfPicture;
                        }

                        stream.Close();
                    }
                }
            }

            return ResponseResult<string>.Success(Newtonsoft.Json.JsonConvert.SerializeObject(dt), "处理成功");
        }
        /// <summary>
        /// 获取xml节点数据
        /// </summary>
        /// <param name="xmlDic"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        private static XmlNodeList GetXmlNodeListByKey(Dictionary<string, Stream> xmlDic, string key)
        {
            XmlNodeList xmlNodeList = null;
            var _exclNodelist = xmlDic.Where(ls => ls.Key == key);
            if (_exclNodelist != null && _exclNodelist.Count() > 0)
            {
                var _xmldata = _exclNodelist.FirstOrDefault();
                XmlDocument doc = new XmlDocument();
                doc.Load(_xmldata.Value);
                XmlNode root = doc.DocumentElement;
                xmlNodeList = root.ChildNodes;
            }

            return xmlNodeList;
        }

 

第一次编写文章,希望对大家有所帮助~

 

标签:xml,office,c#,excel,var,dt,null,上传,图片
From: https://www.cnblogs.com/linfengwu/p/16895197.html

相关文章