前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Excel催化剂开源第45波-按原图大小导出图片

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

作者头像
Excel催化剂
发布2021-08-19 15:54:34
1K0
发布2021-08-19 15:54:34
举报
文章被收录于专栏:Excel催化剂

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

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

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

代码语言:javascript
复制
        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上显示是已经缩放过的,需要将其放大为原始尺寸再复制。具体代码如下:

代码语言:javascript
复制
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开发所不能享受到的好处。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Excel催化剂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 结语
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档