c# excel vsto 批注公式动态替换

106 篇文章 0 订阅
 /// <summary>
        /// 设置注释公式赋给作价表
        /// </summary>
        /// <param name="worksheet"></param>
        /// <param name="methodRange"></param>
        /// <param name="methodName"></param>
        public static void SetCommentFormula(Worksheet worksheet)
        {
            var comments = worksheet.Comments;
            foreach (var com in comments) {
                var convert =(Comment)com;               
                var comText = convert.Text();
                if (!string.IsNullOrEmpty(comText) && comText.Contains("="))
                {
                    var address = GetCommentAddress(worksheet, comText);
                    Regex regex = new Regex(@"(?<=\{)[^}]*(?=\})", RegexOptions.IgnoreCase);
                    MatchCollection matches = regex.Matches(comText);
                    var result = matches.Cast<Match>().Select(m => m.Value).Distinct().ToList();
                    foreach (var res in result) {
                        var location = GetCommentAddress(worksheet, res);
                        if (!string.IsNullOrEmpty(location))
                        {
                            comText = comText.Replace("{" + res + "}", location);
                        }
                    }
                    Range range = worksheet.get_Range(address, Type.Missing);
                    range.Formula = comText;
                }
            }
        }


/// <summary>
        /// 获取批注单元格地址
        /// </summary>
        /// <param name="worksheet">工作表</param>
        /// <param name="comment">批注</param>
        /// <param name="isRemove">是否去掉$符 默认值true</param>
        /// <returns></returns>
        public static string GetCommentAddress(Excel.Worksheet worksheet, string comment, bool isRemove = true)
        {
            try
            {
                string address = "";
                Range rngAll = worksheet.UsedRange.SpecialCells(XlCellType.xlCellTypeComments);
                Range rng = null;
                foreach (Range range in rngAll.Cells)
                {
                    if (range.Comment != null && range.Comment.Shape.AlternativeText.Replace("文本框: ", "") == comment)
                    {
                        rng = range;
                        break;
                    }
                }
                if (rng != null)
                {
                    if (isRemove)
                    {
                        address = rng.Address.Replace("$", "");
                    }
                    else
                    {
                        address = rng.Address;
                    }

                }
                return address;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
                return "";
            }
        }

实际开发中遇到设置模板复制到实际的作业表中,有些公式不能正常对应,用户可能会增删列;

通过设置批注动态赋公式,需要把变量、公式都打上批注,

再根据获取批注对应的表格找到对应的格子如I1替换公式。

第一次加载模板不管用户在怎么删除作业表里的列都能正常对应公式。

主要思路:
1、设置变量批注、公式批注:
2、批注转换成所在表格位置;
3、替换公式即可。

 

操作大忌【不要删除批注】

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值