【问题标题】:Delete multiple columns from excel with epplus?用epplus从excel中删除多列?
【发布时间】:2019-10-04 14:56:45
【问题描述】:

是否有一种简单的方法可以使用 Epplus 从代码 (C#) 中删除单行中的多个 excel 列? 我有一个这样的开关:

switch (packageId)
            {
                case 15:
                case 16: wsSheet.DeleteColumn(16);
                         wsSheet.DeleteColumn(17);
                         wsSheet.DeleteColumn(18);
                         wsSheet.DeleteColumn(19);
                         wsSheet.DeleteColumn(20);
                    break;
                case 17: delete multiple columns again..
                    break;
                ...and so on.....
                default:
                    break;
            }

...由于我有 15-20 个案例要为每个案例删除多个(不同)行,我真的很想缩短此方法消耗的代码和时间..

为清楚起见,包 ID 与列 ID 没有任何联系。在实际情况下,一个包 id 是 358,下一个是 469,依此类推。如果我找不到更流畅的方法,我将使用带有列索引的循环(我想避免这种情况,因为在单一情况下我可以以 5-6 个循环结束,例如,显示前 15 列,然后删除下 4 列,然后显示下 5 列,然后删除下 3 列,..依此类推,直到索引为 67 的最后一列)

EDIT(我为其他人解决这个问题的解决方案): 方法 DeleteColumn(fromCol, noOfCols) 有一个重载,它删除了在第二个参数中提供的固定数量的列,但我想要“删除从列索引到列索引的所有列”之类的东西,所以我写了一个简单的小方法这样做。

private void DeleteColumns(ExcelWorksheet wsSheet, int fromColumn, int toColumn)
        {
            for (int i = toColumn; i >= fromColumn; i--)
            {
                wsSheet.DeleteColumn(fromColumn);
            }
        }

在这种情况下它对我有用..

【问题讨论】:

    标签: c# excel epplus


    【解决方案1】:

    为了干净的代码,你可以这样做(cmets在代码中):

    //create dictionaty where id is packageId, and columns that should be deleted for that packageId
    Dictionary<int, int[]> columnsDictionary = new Dictionary<int, int[]>();
    //add values for each key
    columnsDictionary.Add(358, new int[] { 15, 16, 17, 18, 19, 20 });
    columnsDictionary.Add(469, new int[] { 16, 17, 18, 19, 20 });
    //etc...
    
    //check if this packageId is in present as key in dictionary
    if (!columnsDictionary.ContainsKey(packageId))
        return; //if not, exit or show some error...
    
    //delete corresponding columns in one loop
    foreach (int i in columnsDictionary[packageId])
    {
        wsSheet.DeleteColumn(i);
    }
    

    【讨论】:

    • 为清楚起见,包 ID 与列 ID 没有任何联系。在实际情况下,一个包 id 是 358,下一个是 469,依此类推。如果我找不到更流畅的方法,我将使用带有列索引的循环(我想避免这种情况,因为在单一情况下我可以以 5-6 个循环结束,例如,显示前 15 列,然后删除下 4 列,然后显示下 5 列,然后删除下 3 列,..依此类推,直到索引为 67 的最后一列)
    • @NikolasSkurupatis 请编辑您的问题以澄清您的问题
    • 感谢您的快速回复,您的想法听起来不错,如果我搞砸了,我会考虑。同时,我决定使用DeleteColumn(indexFrom, indexTo)方法的重载,每个案例只需要几行代码,就可以完成工作。
    • @NikolasSkurupatis 这可能是最好的解决方案。祝你好运
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多