本人因为业务需要使用的上传附件功能是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; }
第一次编写文章,希望对大家有所帮助~
原文地址:http://www.cnblogs.com/linfengwu/p/16895197.html
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,请务用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员!
8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载
声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性