Excel催化剂开源第45波-按原图大小导出图片

从Excel中导出图片,是一个很常规的需求,也有一些久旧不衰的界面操作法小技巧从OpenXml文件中批量导出,在VBA开发中,也会使用Chart对象的背景图的技巧来导出。总体来说,和真正想要的效果还是有差距,特别是这样的方式导出的图片像素会低。
在VSTO开发中,有更好的方式,此篇给大家一一分享。

使用Excel催化剂的插入图片的方式,图片已经存储在PictureBox容器内,想导出时,只需在PictureBox容器上取出其Image属性,即可拿到图片,再简单的一个保存为文件的方法即可完成。

以下为Excel催化剂的批量导出图片功能的代码。核心代码就几句完成,可见用PictureBox容器装载图片的优势非常明显。

        public static void OutputMultiPic()
        {
            foreach (Excel.ListRow row in listObjectOfImageInfo.ListRows)
            {
                Excel.Range shpNameRange = row.Range.Cells[listObjectOfImageInfo.ListColumns["图形名称"].Index];
                Excel.Range filePathRange = row.Range.Cells[listObjectOfImageInfo.ListColumns["导出文件名全路径"].Index];
                if (row.Range.Height>0 && shpNameRange.Value2!=null && filePathRange.Value2!=null)
                {
                    string filePath = filePathRange.Value2.ToString();
                    string shpName = shpNameRange.Value2.ToString();
                    Image image = listImageInfo.FirstOrDefault(s => s.ShapeName == shpName).ImageFile;
                    image.Save(filePath);
                }
            }


        }

在非PictureBox容器装载的图片,其实也可以用间接的方式实现,将普通的图片或图表等对形状对象,转换为Image类型的图片,并且可以保证到图片大小是最原始的图片。

原理是使用剪切板将图片复制到内存剪切板中,再由剪切板转换为图片,在复制过程中,我们需要考虑原始的图片在Excel上显示是已经缩放过的,需要将其放大为原始尺寸再复制。具体代码如下:

public static Image GetImageFromShape(Excel.Shape shp)
        {
            Excel.Shape shape = shp.Duplicate();
            shape.LockAspectRatio = Microsoft.Office.Core.MsoTriState.msoTrue;
            if (shp.Type.ToString() == "msoPicture")
            {
                shape.ScaleHeight(1, Microsoft.Office.Core.MsoTriState.msoTrue, Microsoft.Office.Core.MsoScaleFrom.msoScaleFromTopLeft);
            }
            else
            {
                shape.ScaleHeight(1, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoScaleFrom.msoScaleFromTopLeft);
            }
            shape.Copy();
            shape.Delete();

            Image returnImage = null;
            if (Clipboard.ContainsImage())
            {
                returnImage = Clipboard.GetImage();
            }
            return returnImage;

        }

核心代码中shape.ScaleHeight方法,可以将图片放大,特别是图形Shape类型时,可以按原始图来放大,其他的按实际显示的大小来放大。

同样地放大之前先锁定纵横比shape.LockAspectRatio,使用此属性。

结语

此篇再次让大家见识了VSTO开发较VBA开发的一大优势,有大量的.Net下的Winform技术可供使用,像剪切板对象,其就是System.Windows.Forms命名空间下的类。直接大量的现成方法简单调用,无需像VBA那般苦苦地挣扎着,调用各种古老方法或系统API等来扩展原生VBA对象的不足。

同时VSTO框架下,大量的特有功能,如PictureBox窗体宿主控件等可以大大地丰富了原生Excel的功能,也是VBA开发所不能享受到的好处。

技术交流QQ群

QQ群名:Excel催化剂开源讨论群, QQ群号:788145319
Excel催化剂开源讨论群二维码

关于Excel催化剂

Excel催化剂先是一微信公众号的名称,后来顺其名称,正式推出了Excel插件,插件将持续性地更新,更新的周期视本人的时间而定争取一周能够上线一个大功能模块。Excel催化剂插件承诺个人用户永久性免费使用!

Excel催化剂插件使用最新的布署技术,实现一次安装,日后所有更新自动更新完成,无需重复关注更新动态,手动下载安装包重新安装,只需一次安装即可随时保持最新版本!

Excel催化剂插件下载链接:https://pan.baidu.com/s/1Iz2_NZJ8v7C9eqhNjdnP3Q

联系作者

公众号

取名催化剂,因Excel本身的强大,并非所有人能够立马享受到,大部分人还是在被Excel软件所虐的阶段,就是头脑里很清晰想达到的效果,而且高手们也已经实现出来,就是自己怎么弄都弄不出来,或者更糟的是还不知道Excel能够做什么而停留在不断地重复、机械、手工地在做着数据,耗费着无数的青春年华岁月。所以催生了是否可以作为一种媒介,让广大的Excel用户们可以瞬间点燃Excel的爆点,无需苦苦地挣扎地没日没夜的技巧学习、高级复杂函数的烧脑,最终走向了从入门到放弃的道路。

最后Excel功能强大,其实还需树立一个观点,不是所有事情都要交给Excel去完成,也不是所有事情Excel都是十分胜任的,外面的世界仍然是一个广阔的世界,Excel只是其中一枚耀眼的明星,还有其他更多同样精彩强大的技术、工具等。*Excel催化剂也将借力这些其他技术,让Excel能够发挥更强大的爆发!

关于Excel催化剂作者

姓名:李伟坚,从事数据分析工作多年(BI方向),一名同样在路上的学习者。
服务过行业:零售特别是鞋服类的零售行业,电商(淘宝、天猫、京东、唯品会)

技术路线从一名普通用户,通过Excel软件的学习,从此走向数据世界,非科班IT专业人士。
历经重重难关,终于在数据的道路上达到技术平原期,学习众多的知识不再太吃力,同时也形成了自己的一套数据解决方案(数据采集、数据加工清洗、数据多维建模、数据报表展示等)。

擅长技术领域:Excel等Office家族软件、VBA&VSTO的二次开发、Sqlserver数据库技术、Sqlserver的商业智能BI技术、Powerbi技术、云服务器布署技术等等。

2018年开始职业生涯作了重大调整,从原来的正职工作,转为自由职业者,暂无固定收入,暂对前面道路不太明朗,苦重新回到正职工作,对Excel催化剂的运营和开发必定受到很大的影响(正职工作时间内不可能维护也不可能随便把工作时间内的成果公布于外,工作外的时间也十分有限,因已而立之年,家庭责任重大)。

和广大拥护者一同期盼:Excel催化剂一直能运行下去,我所惠及的群体们能够给予支持(多留言鼓励下、转发下朋友圈推荐、小额打赏下和最重点的可以和所在公司及同行推荐推荐,让我的技术可以在贵司发挥价值,实现双赢(初步设想可以数据顾问的方式或一些小型项目开发的方式合作)。

posted @ 2019-07-22 12:05  Excel催化剂  阅读(531)  评论(0编辑  收藏  举报