汎用 List<T> を Excel スプレッドシートに変換するのに役立ちます
-
11-09-2019 - |
質問
ジェネリックを受け入れる関数を作成しようとしています List<T>
リストを反復して Excel ファイルを返します byte[]
. 。この関数はオブジェクトのプロパティを決定できる必要があります。だから私が渡した場合 List<person>
そして、人にはfirst、last、ageなどのプロパティがあります。Excelの列ヘッダーを作成するにはプロパティ名を決定できる必要があり、リストを反復してプロパティ値を列セルに割り当てる必要があります。誰かが作業するためのサンプルコードを教えてくれませんか List<T>
ジェネリック関数で?
解決
余談:既知の順序で列を取得するには:そこには は ユーザーが作成するものを除き、メンバーの順序は定義されていません。例えば (MSDN より):
GetProperties メソッドは、アルファベット順や宣言順など、特定の順序でプロパティを返しません。プロパティが返される順序は変わるため、コードはプロパティの返される順序に依存してはなりません。
順序に依存する必要がない場合は、リフレクションまたは TypeDescriptor のいずれかを使用できます。たとえば、(これは TSV テキストを書き込むのではなく、TSV テキストを書き込むことに注意してください) byte[]
- 私の解釈では、問題は Excel の作成ではなく、データの取得にあると考えられます)。
static void WriteTsv<T>(this IEnumerable<T> data, TextWriter output)
{
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(T));
foreach (PropertyDescriptor prop in props)
{
output.Write(prop.DisplayName); // header
output.Write("\t");
}
output.WriteLine();
foreach (T item in data)
{
foreach (PropertyDescriptor prop in props)
{
output.Write(prop.Converter.ConvertToString(
prop.GetValue(item)));
output.Write("\t");
}
output.WriteLine();
}
}
もし、あんたが 必要 注文するには、次のいずれかを行う必要があります。
- それを渡します(たとえば、
params string[] propertyNames
) - プロパティの属性を使用する
- アルファベットを使用する
の TypeDescriptor
上記のアプローチには利点があります( GetType().GetProperties()
) それ:
- カスタムオブジェクトモデルで動作します(
DataView
, たとえば、次のように使用する場合IList
) - パフォーマンスのために実装を微調整できます。たとえば、 ハイパーディスクリプタ (これを頻繁に行う場合に便利です)
他のヒント
最も簡単な方法は、あなたのリストには、DataTableをするに変換href="https://stackoverflow.com/questions/701223/net-convert-generic-collection-to-datatable">を ExcelスプレッドシートするへのDataTableに変換します。
2番目のリンクは、ASP.NET応答に出直接スプレッドシートを書き、これは簡単に[]バイトを返すように適合させることができる。
などIEnumerable
としてあなたのコレクションによってサポートされているインタフェースを使用します:
public byte[] Process(IEnumerable input) {
foreach (var elem in input) {
foreach (PropertyInfo prop in elem.GetType().GetProperties()) {
Object value = prop.GetValue(elem, null);
// add value to byte[]
}
}
return bytes;
}