此篇对应功能出自:第10波-快速排列工作表图形对象 - 简书 https://www.jianshu.com/p/eab71f2969a6

在Excel的对象模型中,列的宽度不是一般所期待的和行高一样是磅为单位,而是由当前所设定的字符大小的字符宽度为单位,致使在根据图片大小来调整列宽时,没有办法调整到位,总是有那么一点点误差。

此篇介绍的图形排列过程中,也会受此困扰,间接使用循环的方式将列宽调整好,或者用当前的ColumnWidth和Width两个值来算他们之间的比例的方式,但仍然有误差,所以Excel催化剂的图片系列功能,都改为使用PictureBox容器的方式解决图片纵横比问题。

将所有选定的图形进行从上往下的按列排列,或从左往右的按行排列两种方式。需要记录到所有图形的基本信息如top、left、height、width等属性,新建一个实体类来存储这些信息,利用.Net里的泛型的特定来解决它。

    class ShapeInfo
{
public int ShapeIndex { get; set; }
public Single Height { get; set; }
public Single Width { get; set; }
public Excel.Range TopLeftCell { get; set; } public Single Top { get; set; }
public Single Left { get; set; }
}

再经以下的主方法,将图形信息存入List集合,并从中取出最大的宽度的图形,作为此次图形排列的列宽。

再用一个While循环,让列宽和当前最大的图形列宽相等,因转换系数问题,总是会有一点点小误差的。

调整图形的显示也是很重要shp.Placement = Excel.XlPlacement.xlMoveAndSize;此属性可保证用户再编辑行列宽时,图形会跟着自动缩小放大。

图形的高度,使用和单元格的高度贴合,方便后期调整行列高时自动调整,会有原图形有些许的大小出入,如果非图片,变形影响不大。

shp.Height = (Single)actSht.Range[shp.TopLeftCell, shp.BottomRightCell].Height;

最后,不同图形累在一起,只需改变其Top属性即可,将下一个Top属性定位在当前的Top位置+当前的图形的高度。

dstRangeTop = dstRangeTop + shp.Height;

 public static void ArrangeShapeByCol(Excel.ShapeRange shpSelected, Excel.Range dstRange)
{
Excel.Worksheet actSht = dstRange.Worksheet;
List<Entity.ShapeInfo> ShapeLists = GetShapelist(shpSelected); int increaseColwidthStep = 0;
Single shapMaxWidth = ShapeLists.Max(s => s.Width);
while (dstRange.Width < shapMaxWidth)
{
increaseColwidthStep++;
dstRange.EntireColumn.ColumnWidth = dstRange.EntireColumn.ColumnWidth + increaseColwidthStep;
} Single dstRangeTop = (Single)dstRange.Top;
foreach (Entity.ShapeInfo shpInfo in ShapeLists.OrderBy(s => s.Top))
{
Excel.Shape shp = shpSelected.Item(shpInfo.ShapeIndex);
shp.Top = dstRangeTop;
shp.Left = (Single)dstRange.Left;
shp.Width = (Single)dstRange.Width;
shp.Height = (Single)actSht.Range[shp.TopLeftCell, shp.BottomRightCell].Height;
shp.Placement = Excel.XlPlacement.xlMoveAndSize;
//把top的值改写为top+此次循环的shp的高度设置值
dstRangeTop = dstRangeTop + shp.Height;
} }

结语

虽然此篇在VBA的方式下实现也不难,但利用了.Net编程环境下的泛型、Linq查询等特性,在代码编写过程中,将变得非常优雅,和自然思维非常接近,代码量也很精简即可完成,再次让大家看到VSTO的方式下开发的高效性。

技术交流QQ群

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

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

Excel催化剂开源第46波-按行列排列多个图形技术要点的更多相关文章

  1. Excel催化剂开源第23波-VSTO开发辅助录入功能关键技术

    Excel催化剂开源第23波-VSTO开发辅助录入功能关键技术 Excel催化剂   2019.01.12 14:10* 字数 2948 阅读 41评论 0喜欢 0 编辑文章 在Excel催化剂的几大 ...

  2. Excel催化剂开源第22波-VSTO的帮助文档在哪里?

    Excel催化剂开源第22波-VSTO的帮助文档在哪里? Excel催化剂   2019.01.12 14:10 字数 2930 阅读 55评论 0喜欢 0 编辑文章 对于专业程序猿来说,查找文档不是 ...

  3. Excel催化剂开源第20波-条件格式版聚光灯功能,行列标示方便阅读

    Excel聚光灯功能,辅助数据查看,选择区域下的高亮显示所在行列位置,此功能已被广大Excel开发者研究得十分透彻,各种版本的聚光灯流转在网络里,同样地也是一大堆的VBA代码,难找.Net的现成代码, ...

  4. Excel催化剂开源第49波-Excel与PowerBIDeskTop互通互联之第三篇

    在PowerBIDeskTop开启的SSAS服务,和Sqlserver所开启的一个本质的区别是,前者其端口号是随机生成的,即上一次打开获得的端口号,下一次关闭后再打开,系统分配给它新的端口号,而后者因 ...

  5. Excel催化剂开源第51波-Excel催化剂遍历单元格操作性能保障

    在Excel催化剂推出的这一年多时间里,经常性听到一种声音,大概意思是真正会写代码的人,都不会看上Excel催化剂写出来的功能,自己造一个更舒服贴心,仿佛会一点VBA就可以天下无敌一般,也好像Exce ...

  6. Excel催化剂开源第50波-Excel与PowerBIDeskTop互通互联之第四篇

    答应过的全盘分享,也必承诺到底,此篇PowerBI功能分享的最后一篇,讲述如何导出数据模型的元数据,笔者定义其为模型的数据字典. 此篇对应功能实现出自:第6波-导出PowerbiDesktop模型数据 ...

  7. Excel催化剂开源第47波-Excel与PowerBIDeskTop互通互联之第一篇

    当国外都在追求软件开源,并且在GitHub等平台上产生了大量优质的开源代码时,但在国内却在刮着一股收割小白智商税的知识付费热潮,实在可悲. 互联网的精神乃是分享,让分享带来更多人的受益. 在Power ...

  8. Excel催化剂开源第48波-Excel与PowerBIDeskTop互通互联之第二篇

    前一篇的分享中,主要谈到Excel透视表连接PowerBIDeskTop的技术,在访问SSAS模型时,不止可以使用透视表的方式访问,更可以发数据模型发起DAX或MDX查询,返回一个结果表数据,较透视表 ...

  9. Excel催化剂开源第42波-与金融大数据TuShare对接实现零门槛零代码获取数据

    在金融大数据功能中,使用了TuShare的数据接口,其所有接口都采用WebAPI的方式提供,本来还在纠结着应该搬那些数据接口给用户使用,后来发现,所有数据接口都有其通用性,结合Excel灵活友好的输入 ...

随机推荐

  1. Delphi 编写ActiveX控件(OCX控件)的知识和样例(有详细步骤)

    一.ActiveX应用情况简介: ActiveX控件也就是一般所说的OCX控件,它是 ActiveX技术的一部分.ActiveX是微软公司推出的基于组件对象模型COM的技术,包括对Windows 32 ...

  2. Ceph OpenSSL

    Ceph OpenSSL 1. SSL介绍 SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信 ...

  3. 什么是Android NDK

    1.NDK是一系列工具的集合. NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk.这些工具对开发者的帮助是巨大的. NDK集成了交叉编译 ...

  4. Windows下获取逻辑cpu数量和cpu核数量(用GetLogicalProcessorInformation,从XP3才开始有的API)

    代码可在Windows NT下正常运行 具体API说明请参照如下文档: GetLogicalProcessorInformation 点击打开链接 点击打开链接 点击打开链接 typedef BOOL ...

  5. QT中的SOCKET编程

    转自:http://mylovejsj.blog.163.com/blog/static/38673975200892010842865/ QT中的SOCKET编程 2008-10-07 23:13 ...

  6. list 多行表头 表头合并

    http://blog.csdn.net/safedebug/article/details/52971685

  7. 条款16:成对使用new和delete时要使用相同的形式

    请牢记: 如果在new表达式中使用[],必须在相应的delete表达式中也使用[]. new[]  对应  delete[] 如歌在new表达式中不适用[],一定不要在相应的delete表达式中使用[ ...

  8. Python 爬虫从入门到进阶之路(六)

    在之前的文章中我们介绍了一下 opener 应用中的 ProxyHandler 处理器(代理设置),本篇文章我们再来看一下 opener 中的 Cookie 的使用. Cookie 是指某些网站服务器 ...

  9. JavaScript 一元正号运算符

    本文适合JavaScript初学者. 一元正号介绍 一元正号运算符(+)位于其操作数前面,计算其操作数的数值,如果操作数不是一个数值,会尝试将其转换成一个数值. 尽管一元负号也能转换非数值类型,但是一 ...

  10. vuex分模块

    Vuex速学篇:(4)把我们的业务按模块分类 原创 2016年11月29日 10:45:38 8504 文档:http://vuex.vuejs.org/zh-cn/modules.html 这个mo ...