Excelファイルをインポートしようとしています。これは私ののインポートメソッドのようです。私はここでやっているだけで、データテーブルにExcelのデータを追加し、動的リストにそのデータ・テーブルを変換し、コントローラメソッドにそれを返している:ダイナミックリストの値をリストオブジェクトに変換する
public List<dynamic> ImportFile(Stream stream)
{
var productList = new List<Products>();
using (var package = new ExcelPackage(stream))
{
var currentSheet = package.Workbook.Worksheets;
var workSheet = currentSheet.First();
//Creating a DataTable
DataTable tbl = new DataTable();
bool hasHeader = true; // adjust it accordingly(i've mentioned that this is a simple approach)
//Creating the header
foreach (var firstRowCell in workSheet.Cells[1, 1, 1, workSheet.Dimension.End.Column])
{
tbl.Columns.Add(hasHeader ? firstRowCell.Text : string.Format("Column {0}", firstRowCell.Start.Column));
}
var startRow = hasHeader ? 2 : 1;
////Inserting the stream into DataTable
for (var rowNum = startRow; rowNum <= workSheet.Dimension.End.Row; rowNum++)
{
var wsRow = workSheet.Cells[rowNum, 1, rowNum, workSheet.Dimension.End.Column];
var row = tbl.NewRow();
foreach (var cell in wsRow)
{
row[cell.Start.Column - 1] = cell.Text;
}
tbl.Rows.Add(row);
}
//Convert datatable into dynamic list
var dynamicDt = new List<dynamic>();
foreach (DataRow row in tbl.Rows)
{
dynamic dyn = new ExpandoObject();
dynamicDt.Add(dyn);
foreach (DataColumn column in tbl.Columns)
{
var dic = (IDictionary<string, object>)dyn;
dic[column.ColumnName] = row[column];
}
}
return dynamicDt;
}
}
私のコントローラメソッドがどのように見えるかこれは:
[HttpPost]
public ActionResult Upload(HttpPostedFileBase upload)
{
IExcelImporter reader = new ExcelImporter();
var res = new List<dynamic>();
List<Products> send = new List<Products>();
if (ModelState.IsValid)
{
if (upload != null && upload.ContentLength > 0)
{
Stream stream = upload.InputStream;
if (upload.FileName.EndsWith(".xlsx"))
{
//getting the dynamic list(returning dynamic list)
res = reader.ImportFile(stream);
//need to bind it a model-class(Products)
send = res.Select(x=>
new Products
{
ID = res.GetType().GetProperty("ID").ToString(),
Name = res.GetType().GetProperty("Name").ToString(),
//res.Select(e=>e.Price).ToString()//res.GetType().GetProperty("Price").GetValue(res, null).ToString()
}).ToList();
}
}
}
return View("Index", send);
}
質問:私が欲しいのは、モデルクラス(製品)に動的リストをバインドすることです。ビューに戻すことができるように。 動的リストをList Productsにマップするにはどうすればよいですか?誰かが私にこの問題を解決する方法のアイデアをお願いすることができ
public class Products
{
public string ID { get; set; }
public string Name { get; set; }
public string Price { get; set; }
}
:これは私の製品モデルは、どのように見えるかです
public interface IExcelImporter
{
List<dynamic> ImportFile(Stream stream);
}
:
これは私のIExcelImporterがどのように見えるかです。前もって感謝します。
を使用する必要がありますか? – Shoe
動的リストをモデルクラス(Products)にマップしてビューを返すことはできません – Dayan
ダイナミックプロパティを取得してモデルクラスに投影するためのリフレクションを実行しているようです。それは働いていないのですか?どうしましたか? – Shoe