根据行数据值创建新工作表
Create new worksheets based on row data values
我有一个数据集,我想根据行值拆分成特定的工作sheet,并通过我的 C# 网络应用程序导出。
数据列(示例):
SerialNumber
、ProductType
、Location
、Date
我需要遍历按列 Location
排序的记录集,然后检测 Location
值何时发生变化,以便我可以创建一个新工作 sheet 并为每个数据添加数据不同的 Location
在单独的 tabs/worksheets 中。
我一直在使用 LoadFromDataTable
方法将整个数据集中的数据弹出到一个作品中sheet,但不确定这是迭代的正确方法
在遍历我的数据集时我会使用什么,以便我可以将数据写入第一个 sheet,同时评估 "location" 字段的行值,然后动态触发新的 tabs/sheets根据需要?
我是 C# 的新手,正在自学(基本上是通过多选项卡 excel 导出这一任务开始重建我的应用程序)我熟悉 [=38 中的这种循环=] 我的经典 .asp 应用程序中的脚本。
任何人都可以指出在 C# 中使用基于行值动态生成工作 sheet 的类似示例吗?
有很多方法可以做到。如果我们谈论 DataTables
,那么一个选项是 DataTable.Select
which 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();
}
}
我使用 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++;
}
我有一个数据集,我想根据行值拆分成特定的工作sheet,并通过我的 C# 网络应用程序导出。
数据列(示例):
SerialNumber
、ProductType
、Location
、Date
我需要遍历按列 Location
排序的记录集,然后检测 Location
值何时发生变化,以便我可以创建一个新工作 sheet 并为每个数据添加数据不同的 Location
在单独的 tabs/worksheets 中。
我一直在使用 LoadFromDataTable
方法将整个数据集中的数据弹出到一个作品中sheet,但不确定这是迭代的正确方法
在遍历我的数据集时我会使用什么,以便我可以将数据写入第一个 sheet,同时评估 "location" 字段的行值,然后动态触发新的 tabs/sheets根据需要?
我是 C# 的新手,正在自学(基本上是通过多选项卡 excel 导出这一任务开始重建我的应用程序)我熟悉 [=38 中的这种循环=] 我的经典 .asp 应用程序中的脚本。
任何人都可以指出在 C# 中使用基于行值动态生成工作 sheet 的类似示例吗?
有很多方法可以做到。如果我们谈论 DataTables
,那么一个选项是 DataTable.Select
which 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();
}
}
我使用 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++;
}