Excel催化剂开源第9波-VSTO开发图片插入功能,图片带事件

图片插入功能,这个是Excel插件的一大刚需,但目前在VBA接口里开发,如果用Shapes.AddPicture方法插入的图片,没法对其添加事件,且图片插入后需等比例调整纵横比例特别麻烦,特别是对于插入的多个图片非统一的纵横尺寸比时。

例如一个很经典的需求是将插入的缩略图放大操作,没法点击、双击之类的事件响应对应的放大操作。

在VBA的方法中,还有一个方式,用窗体控件Image,可以实现图片插入后有事件关联。

 

 
窗体控件Image方法插入

但很遗憾的是,这个方法中插入的图片,当没有点选图片时,图片会有些模糊的情况。具体可对比下图左右部分。这个模糊的问题,还是老大难,难于达到完美。如果换成是VSTO的宿主项PictureBox,就完美解决了。

 
两种不同窗体控件方式插入图片

例如下图中的,用鼠标右键事件,调出上下文菜单。和Excel催化剂中的双击图片进行图片下载本地并调用Windows图片查看器实现图片的放大功能。

 
可以关联事件的插入图片方法
 
双击图片事件
 
保留有正确的原始图片纵横比例

笔者觉得这是个接近完美的解决方案(用窗体控件的方式插入图片,用户不能直接选择图片、移动图片,会有种奇怪的感觉)。

具体实现

使用VSTO的PictureBox容器,将其图片属性设置成对应的图片对象即可,此处传入的图片对象是Image对象,不必像VBA方法里的只能传入文件全路径,可以方便某些数据库等方式存储二进制图片格式时,直接调用。

 public static string AddPictureBoxToVstoWorkSheet(Excel.Range dstRange, Image img, string fileExt, bool hasBordersMargin, bool isLookupFromRangValue, int offsetRow, int offsetCol) { string picName = Guid.NewGuid().ToString(); Excel.Worksheet actSht = dstRange.Worksheet; Worksheet vstoActSht = Globals.Factory.GetVstoObject(actSht); PictureBox pictureBox = new PictureBox(); pictureBox.Image = img; pictureBox.SizeMode = PictureBoxSizeMode.Zoom; pictureBox.MouseDoubleClick += PictureBox_MouseDoubleClick; AddContextMenuToPictureBox(pictureBox); pictureBox.Name = picName; ControlSite controlSite; if (hasBordersMargin) { controlSite = vstoActSht.Controls.AddControl( control: pictureBox, top: dstRange.Top + 2, left: dstRange.Left + 2, height: dstRange.Height - 4, width: dstRange.Width - 4, name: picName); } else { controlSite = vstoActSht.Controls.AddControl( control: pictureBox, range: dstRange, name: picName); } string srcFileName = string.Empty; Excel.Range srcFileNameRange = null; if (isLookupFromRangValue) { //取回图片文件名的单元格,可拿到文件名,我初始的单元格地址,为后面有可能插入过行、列来重新定位。 srcFileNameRange = dstRange.Offset[-offsetRow, -offsetCol]; srcFileName = srcFileNameRange == null ? "" : srcFileNameRange.Value2.ToString(); } Common.vstoPicInfos.Add( new Entity.VstoPicInfo() { PicName = picName, IsLookupFromRangValue = isLookupFromRangValue, PicOleName = controlSite.Name, PicSht = actSht, SrcFileNameRange = srcFileNameRange, DstRange = dstRange, SrcFileName = srcFileName, ImageExt = fileExt, PictureBoxImage = img }); return picName; } 

其中核心代码有:
得到一个VSTO的WorkSheet对象和新建一个PictureBox对象。

  Excel.Worksheet actSht = dstRange.Worksheet;
            Worksheet vstoActSht = Globals.Factory.GetVstoObject(actSht);
            PictureBox pictureBox = new PictureBox();
            pictureBox.Image = img;
            pictureBox.SizeMode = PictureBoxSizeMode.Zoom;

通过方法vstoActSht.Controls.AddControl进行创建一个Picturebox到工作表中。具体各参数的意义和VBA的AddPicture方法类似,可自行查阅文档。

   controlSite = vstoActSht.Controls.AddControl(
                       control: pictureBox,
                       top: dstRange.Top + 2,
                       left: dstRange.Left + 2,
                       height: dstRange.Height - 4,
                       width: dstRange.Width - 4,
                       name: picName);

通过以上的方法,即可创建了一个PictureBox对象容器,并且图片是我们传入的图片。这当中可以绑定一些PictureBox事件和上下文菜单等,如:

pictureBox.MouseDoubleClick += PictureBox_MouseDoubleClick;

        private static void AddContextMenuToPictureBox(PictureBox pictureBox) { ContextMenuStrip contextMenuStrip = new ContextMenuStrip(); string[] btnsText = { "复制另存为", "移动至其他区域", "删除图片" }; foreach (var btnText in btnsText) { ToolStripButton toolStripButton = new ToolStripButton(btnText); toolStripButton.Tag = pictureBox; toolStripButton.Click += PictureBoxToolStripButton_Click; contextMenuStrip.Items.Add(toolStripButton); } pictureBox.ContextMenuStrip = contextMenuStrip; } 

通过此方法插入的PictureBox,保存关闭后,Excel文件因无法在关闭状态下存储PictureBox对象,将会将其转换为OLE对象存储,设置过的事件将失效,Excel催化剂用了复杂的手段来恢复它,下篇其他技术时再进行介绍

结语

图片插入这样一个刚需功能,在Excel催化剂上已经将其做到极致化的体验,也是有别于传统方式所实现的,在用户体验上,相信有对比后,也会喜欢上Excel催化剂这样的突破性的方式。

此篇已经对核心的技术及代码完成开源公开化,有兴趣的朋友们,可以一试。

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

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

转载于:https://www.cnblogs.com/ExcelCuiHuaJi/p/10246004.html

工具: 【批量导入图片功能: 根据名称批量地导入图片 特点: 1.速度快:导入100图片只需要2秒钟 2.位置准:每张图片都导入到名称后面的单元格中,且刚好和单元格一样大,不会让多张图片重叠 3.大小灵活:导入的图片可以随心所欲定义其大小,且所有图片都占用相同的大小空间。但却保持图片导入前的比例,不会变形。 4.名称灵活:可以使用近似匹配。例如有两张名为“诺基亚8310”、“诺基亚7600”的图片,只需要在单元格输入“诺基亚”就行了,导入图片时可以将“诺基亚”开头的图片全部导入。 5.数量灵活:对于多个图片符合同一单元格名称的状况,可以将所有图片全部导入到其右边的单元格。 6.附件功能图片导入到工作表后,将Excel默认的图片名“图片1”、“图片2”还原为图片本来的名称。 工具: 【隔行插入行】 功能: 对工作表隔行插入行,或者隔列插入列 特点: 1.可以每隔M行插入N行,其中N和M可以自己指定 2.可以每隔M列插入N列,其中N和M可以自己指定 3.起始行或结束行或者起始列、结束列也可以自己指定 工具: 【区域定位工具】 功能: 可以基于用户指定的条件选择相应的单元格,弥补Excel的不足 特点: 1.对于数值,可以使用所有比较运算符查找数据,Excel本身的定位不能定位于大于、小于某值的区域。 2.对于文本,可以定位于指定的字符,也可以定位于指定字符以外的所有字符。且支持通配符。 3.定位于可以指定区域,包括“选择区域”、“已用区域”和“可见区域”。这比Excel本身的查找更全面。 4.支持双条件查找,例如定位于从60到100的所有数据区域。或者不包括60到100的所有区域。 工具: 【根据工资计算钞票面额张数】 功能: 根据工资计算需要发工资时需要多少张100元、50元、20元、10元等等面额的钞票数量 特点: 1.可以选择一个区域进行操作,批量计算。 2.钞票的面额可以自己定义。 3.不仅计算每个人员需要的钞票张数,还对所有面额钞票汇总。 工具: 【建立工作表目录】 功能: 将当前工用簿中所有工作表建立目录,且产生链接 特点: 1.一键生成工作表目录。 2.单击目录中任意表名可以跳转至该工作表。 工具: 【建立文件目录】 功能: 将指定目录下所有文件建立目录于工作表中 特点: 1.可自由定义目标文件的路径。 2.允许选择目录是否产生链接。 3.可以对子目录中的文件建立目录,不管文件夹中有多少个子文件夹。 4.可以多次执行工具,从而将建立不同文件夹中的文件目录。程序自动将其分置于不同的列中。 工具: 【工作簿拆分】 功能: 将指定工作簿的每个工作表拆分成单独的工作簿 特点: 1.自由选定存放路径。 2.提是拆分后是否保留公式的选项。 3.可以自由定义参与拆分的工作表名 工具: 【工作表拆分】 功能: 将当前工作表的数据按条件拆分成多个工作表 特点: 1.可以自由选择条件所有列。 2.可以设定标题行数,标题不参与拆分。 3.可以自由定义折分条件。 4.可以选择折分成多工作表后是否保留原有公式。 工具: 【合并工作簿】 功能: 将多个具有相同格式的工作簿中所有工作表合并为一个工作簿的多工作表中,也可以将一个工作簿的所有工作表合并到一个工作表 特点: 1.多工作簿合并时,可以自由指定待合并工作簿的目录路径。 2.可以选择将多工作簿合并到同工作表还是同工作簿。 3.对于多个工作簿中具有同名工作表时,可以选择是否合并工作表。 4.进以定义参与合并的工作簿名。即所选文件夹中存在多工作簿,可以对部分执行合并。 5.如果仅对一个工作簿中的工作表进行合并,那么选择“多工作表合并”。 6.对工作表合并时,允许选择参与合并的工作表名。即既可全部参与合并也可以部分工作表参与合并。 7.合并前需要将当前工作簿保存。 工具: 【选区背景着色】 功能: 将选择区域或者选区所在行、列用醒目的颜色标识,便于查看 特点: 1.着色的对象有“选区”、“行”、“列”以及“行列”可选。 2.可选颜色包括6种。 3.可以随时启用、禁用着色功能。 4.程序具有记忆功能。即保存上次的设置。 工具: 【小写转大写】 功能: 将阿拉伯数字转换成人民币大写形式 特点: 1.可以批量操作。 2.可以同时选择多个区域再执行工具。 3.几百个单元格数据瞬间完成转换。 工具: 【大写转小写】 功能: 将人民币大写转换成阿拉伯数字 特点: 1.可以批量操作。 2.可以同时选择多个区域再执行工具。 3.几百个单元格数据瞬间完成转换。 工具: 【批量新建或复制工作表】 功能: 批量新建或者工作表 特点: 1.操作灵活:可以选择新建或者复制。 2.批量操作:可以一次性建立或者复制1到255个。 3.高速操作:建立或者复制255个工作表三秒钟不到即可完成。 4.方向自由:可以定义新表在当前表之前或者之后。 5.命名灵活:对于表名有规律的创建或者复制新表,可以选择“从单元格创建”。 工具: 【批量加解密】 功能: 对当前工作簿中所有工作表或者指定的部分工作表进行加、解密 特点: 1.可以灵活的指定加、解密工作表名。 2.对100个工作表加密或者解密不超过3秒钟。 3.本工个适用于多工作表使用相同密码保护,否则请手工操作。 4.其中解密是知道密码的前提下进行批量解密,而非绿色。 工具: 【生成工资条】 功能: 高效的工资条设计工具 特点: 1.瞬间将工资明细表生成工资条,方便打印并裁剪。 2.生成的工资与工资条之间有一个空行,供剪裁用。可以自定义其高度。 3.可以自己定义工资条头的行数,不同公司可能有不需要标题行。 4.只要类似工资条的信息都可以用本工具生成,例社保资料、成绩通知条等等。 工具: 【删除工资条】 功能: 删除前一工具生成的工资条头 特点: 1.可以由用户指定标题行数,使其适用面更广。 2.瞬间删除工资条标题信息,还原为明细表。 工具: 【反向选择】 功能: 对当前数据区域进行反向选择,即定位于未选择的区域 特点: 1.可以由用户指定标题行数,使其适用面更广。 2.瞬间删除工资条标题信息,还原为明细表。 备注:工具通用于Excel 2003和 EXCEL 2007 工具安装: 必须先解压,然后双击“安装.EXE" 如果需要删除工具,则双击“删除.EXE”
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值