【问题标题】:Create new worksheets based on row data values根据行数据值创建新工作表
【发布时间】:2016-02-12 02:54:06
【问题描述】:

我有一个数据集,我想根据行值将其拆分为特定的工作表,并通过我的 C# Web 应用程序导出。

数据列(示例): SerialNumber, ProductType, Location, Date

我需要遍历按列Location 排序的记录集,然后检测Location 值何时发生变化,以便我可以创建一个新工作表并将每个不同的Location 的数据放在单独的选项卡/工作表中。

我一直在使用 LoadFromDataTable 方法将整个数据集中的数据弹出到一个工作表中,但不确定这是迭代的正确方法

在循环访问我的数据集时我会使用什么,以便我可以在评估“位置”字段的行值时将数据写入第一个工作表,然后根据需要动态触发新的选项卡/工作表?

我是 C# 的新手,并且正在自学(基本上是通过多选项卡 excel 导出这一任务开始重建我的应用程序)我熟悉经典 .asp 应用程序中 vb 脚本中的这种循环类型。

谁能给我指出一个在 C# 中使用基于行值动态生成工作表的类似示例?

【问题讨论】:

    标签: c# excel for-loop export epplus


    【解决方案1】:

    有很多方法可以做到这一点。如果我们谈论DataTables,那么一种选择是DataTable.Selectwhich you can read about here。它是一个本机函数,因此加上一个 for 循环应该可以正常工作。

    我特别喜欢Linq,因为它具有分组能力。这将要求您学习Linq 的概念,这不是一件坏事,但您需要多阅读一些内容。唯一的问题是你需要做一些铸造——不是世界末日,因为数据集通常相对较小:

    [TestMethod]
    public void Multi_Sheet_Export_Test()
    {
        //Throw in some data
        var datatable = new DataTable("tblData");
        datatable.Columns.AddRange(new[]
        {
            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] = i;
            row[1] = i*10;
            row[2] = i%2 == 0 ? "LocationX" : "LocationY";
            datatable.Rows.Add(row);
        }
    
        //Create a test file
        var fi = new FileInfo(@"c:\temp\Multi_Sheet_Export.xlsx");
        if (fi.Exists)
            fi.Delete();
    
        using (var pck = new ExcelPackage(fi))
        {
            var workbook = pck.Workbook;
    
            var colnames = new List<string[]>
            {
                datatable
                    .Columns
                    .Cast<DataColumn>()
                    .Select(col => col.ColumnName)
                    .ToArray()
            };
    
    
            var rowgroups = datatable
                .Rows
                .Cast<DataRow>()
                .GroupBy(row => row[2])
                .ToList();
    
    
            rowgroups.ForEach(rowgroup =>
            {
                var worksheet = workbook.Worksheets.Add(rowgroup.Key.ToString());
                worksheet.Cells[1, 1].LoadFromArrays(colnames);
                worksheet.Cells[2, 1].LoadFromArrays(rowgroup.Select(row => row.ItemArray));
            });
    
            pck.Save();
        }
    
    }
    

    【讨论】:

    • 感谢厄尼。我玩了一段时间,最后这样做了:
    【解决方案2】:

    我使用 CopytoDataTable 来拆分数据集并创建新工作表

                var uniqueList = dt.AsEnumerable().Select(x => x.Field<string>("ProdType")).Distinct();
                List<string> myList = new List<string>();
                myList = uniqueList.ToList();
    
                DataTable[] array = new DataTable[myList.Count()];
                int index = 0;
                foreach (string item in myList)
                {
                    var Result = from x in dt.AsEnumerable()
                                 where x.Field<string>("ProdType") == item
                                 select x;
                    DataTable table = Result.CopyToDataTable();
                    array[index] = table;
    
                    ExcelWorksheet ws = pck.Workbook.Worksheets.Add(item);
                    ws.Cells["A1"].LoadFromDataTable(table, true);
                    index++;
                }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-18
      • 2022-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多