Excel催化剂开源第46波-按行列排列多个图形技术要点

此篇对应功能出自:第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位置+当前的图形的高度。excel

dstRangeTop = dstRangeTop + shp.Height;code

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催化剂插件使用最新的布署技术,实现一次安装,往后全部更新自动更新完成,无需重复关注更新动态,手动下载安装包从新安装,只需一次安装便可随时保持最新版本!

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

相关文章
相关标签/搜索