【问题标题】:C# Reorder columns of Excel worksheetC#重新排序Excel工作表的列
【发布时间】:2018-01-11 00:12:29
【问题描述】:

我有一个包含一些数据的 Excel 工作表。我还有一个工作表的列标题列表。列表中的标题与工作表中的标题的顺序不同,我需要将 Excel 工作表的列重新排序为与列表相同的顺序。

List<string> dataset1Variables = new List<string>() { "Variable1", "Variable2", "Variable3", "Variable4" };

我的 Excel 工作表的标题可能如下所示:

变量 3 |变量 1 |变量 4 |变量 2

我遇到过此代码来移动列,但这仅用于将 1 列移动到特定位置。该列表可能完全混淆了,所以我需要移动很多列。

Excel.Range copyRange = xlWs.Range["C:C"];
Excel.Range insertRange = xlWs.Range["A:A"];
insertRange.Insert(Excel.XlInsertShiftDirection.xlShiftToRight, 
copyRange.Cut());

这样做的最佳方法是什么?最好使用互操作。

【问题讨论】:

    标签: c# excel sorting


    【解决方案1】:

    如果您的工作表正上方有一个包含数据的空行,您可以在标题正上方添加匹配的公式。在下面假设您的列表位于 Sheet2 范围 B2:B5 并且您的数据标题从 Sheet1 范围 A2:D2 开始

    Excel.Workbook myBook = xlApp.Workbooks.Open(@"path\excel.xlsx");
    Excel.Worksheet ws = myBook.Worksheets[1];
    
    // You can use all dynamic ranges instead
    // Excel.Range xlRng = ws.Range[ws.Cells[yourRow, firsColumn], ws.Cells[yourRow, lastColumn]];
    Excel.Range xlRng = ws.Range[ws.Cells[1, 1], ws.Cells[1, 4]]; // ws.Range["A1:D1"];
    xlRng.FormulaR1C1 = "=MATCH(R[-1]C,Sheet2!R2C2:$R5C2,0)";
    // Below is how you can get full address for your list if it's in different workbook and replace Sheet2!R2C2:$R5C2 with rangeFullAddress
    // string rangeFullAddress = xlRng.Address[true,true,Excel.XlReferenceStyle.xlR1C1,true];
    xlRng.Calculate();
    xlRng.Value = xlRng.Value;
    

    在此之后,您可以使用 Excel 按第一行排序来对数据进行排序。对第一行进行排序后,它看起来像这样:1、2、3、4。然后清除第一行上的数据ws.Range["A1:D1"].Clear();

    您的排序键将是Key1: ws.Range["A1:D1"],这里是 c# 排序示例using c# to sort a column in excel 只需更改 Excel.XlSortOrientation 并根据您的范围进行调整。

    还有其他排序方式,但这样您可以在数据中保留单独的格式、每个单元格的 cmets

    我错过了 1 个重要细节 - 您的列表不在 Excel 工作表中,但您可以将其添加到 Excel,可能在临时工作簿中或在同一张工作表上:

            object [,] columnHeaders = new object[3,0]; // or object[0,3]; if you'd like to add into 1 row
            columnHeaders[0, 0] = "Variable1";
            columnHeaders[1, 0] = "Variable2";
            columnHeaders[2, 0] = "Variable3";
            columnHeaders[3, 0] = "Variable4";
            xlRng.FormulaR1C1 = columnHeaders; // xlRng would be in the above Sheet2!R2C2:$R5C2
    

    【讨论】:

    • 感谢您的回答。我可能应该提到 Excel 工作表中的列数永远不会固定。即我将使用许多不同的 excel 文件,每个文件可能有不同的列数。
    • 然后你可以让它动态 Excel.Range xlRng = ws.Range[ws.Cells[yourRow, firsColumn], ws.Cells[yourRow, lastColumn]];我已经调整了代码。在上面的代码中,一切都可以动态化。只要您使列表范围以相同的方式动态化,该公式在任何情况下都可以使用。
    • 我错过了 1 个重要细节,即您的列表不在 Excel 中,并在我的答案末尾进行了调整
    • Richard 非常感谢您的解决方案。最后,我选择了另一个似乎可以完成这项工作而无需更改更可取的 Excel 文件。基本上我所做的就是创建一个带有 Excel 文件列顺序的第二个列表。因此,我比较了两个列表并使用循环管理将列移动到正确的索引位置,并使用 Range.Insert 命令。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    相关资源
    最近更新 更多