c# - 使用 EPPLUS 对 excel 行进行分组

标签 c# excel vba epplus

我需要的是当行的值与前一行相同时对行进行分组,“B3”的值与“B2”的值相同,如下所示:

enter image description here

我在 epplus 中使用 c#,我知道如何使用 outline 选项做类似的事情,并且与我想要的类似,但是这个选项有一些缺点,比如它不会自动基于值(value)观的小组,不能做各种小组....

用 EPPLUS 可以做到这一点吗?如果不可能,我如何将 vba 代码添加到 c#?我试试这个:

  StringBuilder vbaCode = new StringBuilder();

  vbaCode.AppendLine("Sheets('Sheet1').Activate");
  vbaCode.AppendLine("Range('A1: D11').Select");
  vbaCode.AppendLine("Selection.Subtotal GroupBy:= 1, Function:= xlSum, TotalList:= Array(2, 3),Replace:= True, PageBreaks:= False, SummaryBelowData:= True");
pck.Save();

但不起作用,我无法打开 Excel 文件。

编辑

有了 sugested,我现在尝试使用 group 函数进行 Interop,但出于一个额外的原因,他对列而不是行进行了分组,这是代码:

 var ExApp = new Microsoft.Office.Interop.Excel.Application();
 Microsoft.Office.Interop.Excel.Workbooks Wbs = ExApp.Workbooks;
 Microsoft.Office.Interop.Excel.Workbook Wb = Wbs.Open(fi.FullName.ToString());
 Microsoft.Office.Interop.Excel.Sheets wss = Wb.Worksheets;
 Microsoft.Office.Interop.Excel.Worksheet Ws = (Microsoft.Office.Interop.Excel.Worksheet)wss.get_Item("Sheet1");
 Ws.Range["A6:A10"].Group();
 Ws.Outline.SummaryRow =Microsoft.Office.Interop.Excel.XlSummaryRow.xlSummaryAbove;
 ExApp.Visible = true;

最佳答案

我看到这已经得到解答,但我想我会提供一种 EPPlus 方式,您当然可以这样做,但您确实需要手动创建求和单元格:

[TestMethod]
public void Row_Grouping_Test()
{
    //http://stackoverflow.com/questions/41636336/grouping-excel-rows-with-epplus

    //Throw in some data
    var datatable = new DataTable("tblData");
    datatable.Columns.AddRange(new[]
    {
        new DataColumn("Header", typeof (string)), new DataColumn("Col1", typeof (int)), new DataColumn("Col2", typeof (int)), new DataColumn("Col3", typeof (object))
    });

    for (var i = 0; i < 10; i++)
    {
        var row = datatable.NewRow();
        row[0] = $"Header {i}"; row[1] = i; row[2] = i * 10; row[3] = Path.GetRandomFileName(); datatable.Rows.Add(row);
    }

    //Create a test file
    var fi = new FileInfo(@"c:\temp\Row_Grouping_Test.xlsx");
    if (fi.Exists)
        fi.Delete();

    using (var pck = new ExcelPackage(fi))
    {
        var worksheet = pck.Workbook.Worksheets.Add("Sheet1");
        worksheet.Cells.LoadFromDataTable(datatable, false);

        worksheet.Cells["A11"].Value = "TOTAL";
        worksheet.Cells["B11"].Formula = "SUBTOTAL(9,B2:B10)";
        worksheet.Cells["C11"].Formula = "SUBTOTAL(9,C2:C10)";
        worksheet.Row(11).Style.Font.Bold = true;

        //Row Group 1 (start with 1 since row index is 1-based)
        for (var i = 1; i <= datatable.Rows.Count; i++)
            worksheet.Row(i).OutlineLevel = 1;

        pck.Save();
    }
}

看起来像这样:

enter image description here

关于c# - 使用 EPPLUS 对 excel 行进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41636336/

相关文章:

excel - If Else 有多个条件

vba - 为什么一个小的 Excel VBA 宏运行速度非常慢

Excel Listobject 表 ListRows.count 与 range.rows.count

excel - Vba 循环遍历数组

c# - 添加可选参数

c# - 我的 RichTextBox 的剪切/复制/粘贴不会剪切、复制或粘贴

c# - 在 WebBrowser 控件中查看 Excel C#

excel - 在 Excel 中创建名称范围的动态更改名称

c# - 格式化 TimeSpan 字符串

vba - 在 MS Word 中打印字体的所有字形