基于行数据值创建新的工作表

本文关键字:工作 创建 于行 数据 | 更新日期: 2023-09-27 18:21:23

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

数据列(示例):SerialNumberProductTypeLocationDate

我需要循环浏览按列Location排序的记录集,然后检测Location值何时更改,这样我就可以创建一个新的工作表,并将每个不同Location的数据放在单独的选项卡/工作表中。

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

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

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

有人能给我举一个C#中这样的例子吗?它基于行值动态生成工作表?

基于行数据值创建新的工作表

有很多方法可以做到这一点。如果我们谈论DataTables,那么一个选项就是DataTable.Select,您可以在这里阅读。它是一个本机函数,因此加上一个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();
    }
}

我使用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++;
            }