前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Excel催化剂开源第46波-按行列排列多个图形技术要点

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

作者头像
Excel催化剂
发布2021-08-19 15:53:06
4580
发布2021-08-19 15:53:06
举报
文章被收录于专栏:Excel催化剂

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

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

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

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

代码语言:javascript
复制
    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;

代码语言:javascript
复制
 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的方式下开发的高效性。

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

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

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

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

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