本人因为业务需要使用的上传附件功能是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