簡體   English   中英

根據行數據值創建新的工作表

[英]Create new worksheets based on row data values

我有一個數據集,我想根據行值將其拆分為特定的工作表,並通過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++;
            }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM