博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Open Xml 读取Excel中的图片
阅读量:7000 次
发布时间:2019-06-27

本文共 3772 字,大约阅读时间需要 12 分钟。

 

 

在我的一个项目中,需要分析客户提供的Excel, 读出其中的图片信息(显示在Excel的第几行,第几列,以及图片本身)。

网络上有许多使用Open Xml插入图片到Word,Excel的文章, 但是却没有读取分析其中图片的。经过多次分析及试验,终于达成了这个目标,本文将简要描述如何读取Excel中的图片。

下图所示为一个包含图片的Excel文件的范例, 在这个Excel中,第4列,第10列都插入了图片。

我们把这个excel(.xlsx)文件另存为.zip文件,并解压,得到下图的目录结构,从中我们可以看出文件都是保留在media文件夹下的

 

而下图所示Drawing文件夹里则定义了Excel每个工作表中图片如何显示(即把某个图片显示在Excel 某个工作表中的第几行,第几列)

因此我们要做的就是读取Drawing 中的图片定义,并从Media中读取对应的图片出来。 在我的应用中,我使用如下数据结构来定义匹配关系

public class PictureInfo    {        public int FromRow { get; set; }        public int FromCol { get; set; }        public Image Image { get; set; }    }

读取匹配关系的代码如下:

List
pictures = null;using (SpreadsheetDocument document = SpreadsheetDocument.Open(@txtFile.Text, true)) { WorkbookPart wbPart = document.WorkbookPart; var sheets = wbPart.Workbook.Sheets.Take(1); foreach (Sheet sheet in sheets) { WorksheetPart wsPart = (WorksheetPart)wbPart.GetPartById(sheet.Id); DrawingsPart drawingPart = wsPart.GetPartsOfType
().ToList().FirstOrDefault();pictures = new List
(); if(drawingPart != null) { foreach (var part in drawingPart.Parts) { PictureInfo pic = new PictureInfo(); ImagePart imgPart = (ImagePart)part.OpenXmlPart ; Image img1 = Image.FromStream(imgPart.GetStream()); pic.Image = img1; pictures.Add(pic); } var worksheetDrawings = drawingPart.WorksheetDrawing.Where(c => c.ChildElements.Any ( a=>a.GetType().FullName == "DocumentFormat.OpenXml.Drawing.Spreadsheet.Picture")).ToList(); foreach (var worksheetDrawing in worksheetDrawings) { if (worksheetDrawing.GetType().FullName == "DocumentFormat.OpenXml.Drawing.Spreadsheet.TwoCellAnchor") { TwoCellAnchor anchor = (TwoCellAnchor)worksheetDrawing; DocumentFormat.OpenXml.Drawing.Spreadsheet.Picture picDef = (DocumentFormat.OpenXml.Drawing.Spreadsheet.Picture) anchor.ChildElements.FirstOrDefault(c => c.GetType().FullName == "DocumentFormat.OpenXml.Drawing.Spreadsheet.Picture"); if (picDef != null) { var embed = picDef.BlipFill.Blip.Embed; if (embed != null) { var picMapping = pictures.FirstOrDefault(c => c.RefId == embed.InnerText); picMapping.FromCol = int.Parse(anchor.FromMarker.ColumnId.InnerText); picMapping.FromRow = int.Parse(anchor.FromMarker.RowId.InnerText); } } // anchor.FromMarker.RowId + anchor.FromMarker.ColumnId } } } } }//把图片信息显示在DataGridView中 var pic1 = pictures.OrderBy(c => c.FromCol).OrderBy(c=>c.FromRow).ToList(); dataGridView1.AutoGenerateColumns = true; dataGridView1.DataSource = pic1;

 

 

 

转载于:https://www.cnblogs.com/Hcsdn/p/3225581.html

你可能感兴趣的文章
我的友情链接
查看>>
django python 创建app及models【Part 1】
查看>>
Ubuntu16.04交叉工具链安装
查看>>
我的友情链接
查看>>
CentOS下Denyhosts的安装和使用
查看>>
ORA-01722:invalid number 解决方法
查看>>
关于android中shape的使用
查看>>
Java Web开发初级篇之常见异常处理
查看>>
【Sensors】位置传感器(4)
查看>>
spring mvc中log4j的配置与使用
查看>>
Linux基本命令操作练习
查看>>
gridview多标题和后台生成标题控件
查看>>
linux 命令之 --用户管理
查看>>
Flask + Gunicorn + Nginx 部署
查看>>
二叉树基本操作实现
查看>>
linux 第三周作业
查看>>
App Launch time 101 (Android Performance Patterns Season 6 Ep. 1)
查看>>
回首大学过往的时光所感
查看>>
IT生活
查看>>
Linux配置开机启动项
查看>>