gpt4 book ai didi

c# - 带表格的通用 CSV 导出

转载 作者:太空狗 更新时间:2023-10-29 23:52:23 24 4
gpt4 key购买 nike

目标:

我们的应用程序是使用多种类型构建的(例如 Person、PersonSite(ICollection)、Site - 我选择这些类是因为它们有关系)。我们想要做的是能够从 excel 表中的第一种类型(Person)导出一些属性,然后从同一个 excel 文件中的第二种类型(PersonSite)导出一些其他属性,但在同一个新表中表。

结果应该是这样的:

 _________________   ________________________   ________________|                 | |                        | |                ||PERSON PROPERTIES| | PERSONSITE PROPERTIES  | |SITE PROPERTIES ||_________________| |________________________| |________________||  Name Person 1  | |Relation type for item 1| | Name for item 1||_________________| |________________________| |________________|                    |Relation type for item 2| | Name for item 2|                    |________________________| |________________|                    |Relation type for item 3| | Name for item 3|                    |________________________| |________________| _________________   ________________________   ________________|  Name Person 2  | |Relation type for item 1| | Name for item 1||_________________| |________________________| |________________|                    |Relation type for item 2| | Name for item 1|                    |________________________| |________________|

So for every PersonSite contained in the list, we would like to create a table that will be inserted just after the table of the Person.

So this is how look the Person class (subset of the class) :

public class Person : IObject
{
public ICollection<PersonSite> PersonSites {get;set;}
}

现在是 PersonSite 类(子集):

public class PersonSite : IObject
{
public Person Person {get;set;}
public Site Site {get;set;}
public RelationType RelationType {get;set;}
}

Site 类(子集):

public class Site : IObject
{
public ICollection<PersonSite> PersonSites {get;set;}
}

因此我们决定编写一个 CSVExporter 类,它使用表达式来检索必须导出的属性。

这是我们必须实现的方案:

                                                ____                           |    |0..* ______________          __|____|______       1..* _______________| CSV EXPORTER |________| CSV TABLE (T)|__________| CSV COLUMN (T)||______________|        |______________|          |_______________|                               |                               |1..*                         ______|________                        | CSV ROWS (T)  |                        |_______________|

So the CSVTable use a generic type that is IObject (as used in the different classes).

A table can have multiple table (e.g. The Person table has a PersonSite table and a PersonSite table has a Site table). But the type used is different since we navigate through the different classes (those classes must have a relationship).

When adding a subtable to a table we should provide en expression that will grab the items of the correct type from the main items (Person => Person.PersonSite)

So we wrote the following piece of code for the table:

public class CSVExportTable<T>
where T : IObject
{

private Matrix<string> Matrix { get; set; }
private ICollection<CSVExportTableColumn<T>> Columns { get; set; }
private ICollection<CSVExportTableRow<T>> Rows { get; set; }
private ICollection<CSVExportTable<IObject>> SubTables { get; set; }
private Expression<Func<T, object>> Link { get; set; }


public CSVExportTable()
{
this.Matrix = new Matrix<string>();
this.Columns = new List<CSVExportTableColumn<T>>();
this.SubTables = new List<CSVExportTable<IObject>>();
this.Rows = new List<CSVExportTableRow<T>>();
}

public CSVExportTable<R> AddSubTable<R>(Expression<Func<T, object>> link) where R : IObject
{
/* This is where we create the link between the main table items and the subtable items (= where we retreive Person => Person.PersonSites as an ICollection<R> since the subtable has a different type (T != R but they have the same interface(IObject))*/
}

public void AddColumn(Expression<Func<T, object>> exportProperty)
{
this.Columns.Add(new CSVExportTableColumn<T>(exportProperty));
}

public Matrix<string> GenerateMatrix()
{
int rowIndex= 0;
foreach (CSVExportTableRow<T> row in this.Rows)
{
int columnIndex = 0;
foreach (CSVExportTableColumn<T> column in this.Columns)
{
this.Matrix = this.Matrix.AddValue(rowIndex, columnIndex, ((string)column.ExportProperty.Compile().DynamicInvoke(row.Item)));
columnIndex++;
}
rowIndex++;
}
return this.Matrix;
}

public Matrix<string> ApplyTemplate(ICollection<T> items)
{
// Generate rows
foreach (T item in items)
{
this.Rows.Add(new CSVExportTableRow<T>(item));
}
// Instantiate the matrix
Matrix<string> matrix = new Matrix<string>();

// Generate matrix for every row
foreach (var row in this.Rows)
{
matrix = GenerateMatrix();
// Generate matrix for every sub table
foreach (var subTable in this.SubTables)
{
// This it where we should call ApplyTemplate for the current subTable with the elements that the link expression gave us(ICollection).
}
}
return matrix;
}
}

最后是 CSVExportTableColumn 类:

public class CSVExportTableColumn<T> where T : IObject
{
public Expression<Func<T, object>> ExportProperty { get; set; }

public CSVExportTableColumn(Expression<Func<T, object>> exportProperty)
{
this.ExportProperty = exportProperty;
}
}

有没有人做过这样的事情?还是我们走错了路?如果这似乎是一条好的路径,我们如何创建链接(关系)表达式并使用它来检索要在上次调用中使用的正确项目?

最佳答案

抱歉耽搁了,

所以最后,我们让它像这样工作:

public Matrix<string> ApplyTemplate(object items)
{
ICollection<T> castedItems = new List<T>();
// Cast items as a List<T>
if (items is List<T>)
{
castedItems = (ICollection<T>)items;
}
else if (items is HashSet<T>)
{
castedItems = ((HashSet<T>)items).ToList();
}
// Generate rows
foreach (T item in castedItems)
{
this.Rows.Add(new CSVExportTableRow<T>(item));
}
// Instantiate the matrix
Matrix<string> matrix = new Matrix<string>();

// Generate matrix for every row
foreach (var row in this.Rows)
{
matrix = GenerateMatrix();
// Generate matrix for every sub table
foreach (var subTable in this.SubTables)
{
matrix = matrix.AddMatrix(subTable.ApplyTemplate(this.Link.Compile().DynamicInvoke(row.Item)));
}
}
return matrix;
}

这将为任何子表应用模板。

希望这对其他人有用。

关于c# - 带表格的通用 CSV 导出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9307785/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com