C# Excel写入速度的优化以及Excel字母排列与数字位置的转换

            一般情况下写入Excel是通过Worksheet.get_Range("A1).Value="" 的方式给单元格一个一个的赋值,如果数据量不大还是可以满足要求的。但是如果数据量过大这种方式操作会很慢。

目前发现直接数组赋值的方式会减少单元格赋值的次数从而加速写入的速度

 string[,] arr = GetArr(sourceColleciotn, dics);
 sheet.Range[sheet.Cells[startRow, keys.FirstOrDefault()], sheet.Cells[endRow, keys.LastOrDefault()]].Value = arr;
网上还有一种使用NPOI 来操作Excel说是会更加稳定和快速,也可以通过将数据转换为字符串(enter 换行tab换列)然后复制到粘贴板,通过粘贴板粘贴到Excel中,有兴趣的可以试试
在指定位置写入一个数组,如果你只知道起始和结束的列名(英文字母例如A,AA,BAA),就需要我们把拼音转换为数字位置才能获取到二维数组的列数
如果我们把A对应1把Z对应26 把AA对应27.。。。。这样我们通过结束列名和结束列名转换为数字位置然后相减就可以获取到列数。

    /// <summary>
        /// 根据Excel列拼音获取列数
        /// </summary>
        /// <param name="colName"></param>
        /// <returns></returns>
        public static int GetExcelColNum(string colName)
        {
            char[] chars = colName.ToCharArray();
            int txt1 = 0;
            for (int i = 0; i < chars.Length; i++)
            {
                txt1 = txt1 + (int)Math.Round(Math.Pow(26, i), 0);
            }
            for (int i = 0; i < chars.Length; i++)
            {
                txt1 = txt1 + ((int)Math.Round(Math.Pow(26, chars.Length - i - 1), 0)) * (chars[i] - 65);
            }
            return txt1;
        }


相应的我们可能需要通过数组列位置获取对应的Excel列拼音名称

                  /// <summary>
        /// 根据列指标位置获取列拼音字母
        /// </summary>
        /// <param name="z"></param>
        /// <returns></returns>
        public string GetExcelColStr(int z)
        {
            int length = 0;

            for (int i = 1; i < 100; i++)
            {
                int bj = 0;
                for (int k = 0; k < i; k++)
                {
                    bj = bj + (int)Math.Round(Math.Pow(26, k), 0);
                }
                for (int k = 0; k < i; k++)
                {
                    bj = bj + ((int)Math.Round(Math.Pow(26, i - k - 1), 0)) * 25;
                }
                if (bj >= z)
                {
                    length = i;
                    break;
                }
            }
            for (int i = 0; i < length; i++)
            {
                z = z - (int)Math.Round(Math.Pow(26, i), 0);
            }
            string str = string.Empty;
            for (int i = 1; i <= length; i++)
            {
                int charV = (int)(z / (int)Math.Round(Math.Pow(26, length - i), 0)) + 65;
                char a = (char)charV;
                str = str + a.ToString();
                z = z - (int)(Math.Round(Math.Pow(26, length - i), 0)) * (charV - 65);
            }
            return str;
        }






  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
C#中进行Excel操作时,如果数据量较小,可以使用Worksheet.get_Range("A1").Value=""的方式逐个给单元格赋值,这种方式可以满足需求。但是如果数据量较大,这种操作方式会很。\[1\] 另一种更快速和稳定的方法是使用NPOI库来进行Excel操作。可以将数据转换为字符串,并通过复制到剪贴板再粘贴到Excel中的方式来写入数据。这种方法可以提高操作速度。\[2\] 如果你只知道起始和结束的列名(如A、AA、BAA),需要将列名转换数字位置才能获取到二维数组的列数。可以通过将字母转换数字的方式来实现。例如,将A对应1,Z对应26,AA对应27,以此类推。通过将结束列名和起始列名转换数字位置,然后相减,就可以得到列数。\[2\] 以下是一个示例方法,可以根据Excel列的拼音获取列数: ```csharp public static int GetExcelColNum(string colName) { char\[\] chars = colName.ToCharArray(); int colNum = 0; for (int i = 0; i < chars.Length; i++) { colNum = colNum + (int)Math.Round(Math.Pow(26, i), 0); } for (int i = 0; i < chars.Length; i++) { colNum = colNum + ((int)Math.Round(Math.Pow(26, chars.Length - i - 1), 0)) * (chars\[i\] - 65); } return colNum; } ``` 通过调用这个方法,你可以将列名转换为对应的列数。\[3\] 综上所述,使用NPOI库和将列名转换数字位置的方法可以提高C#Excel操作速度。 #### 引用[.reference_title] - *1* *2* *3* [C# Excel写入速度优化以及Excel字母排列数字位置转换](https://blog.csdn.net/junzhione/article/details/67654103)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值