0

사용자가 버튼을 클릭하면 컨트롤러에서 .xlsx 문서를 내보내려고합니다. 내 모델은 다음과 같습니다 : 문자열 속성 게다가.NET 내보내기를 Excel로 내보내기 - 목록 속성을 표시하지 않습니다.

public class ExportOrdersViewModel 
{ 
    public int Id { get; set; } 
    public string CustomerFirstName { get; set; } 
    public string CustomerLastName { get; set; } 
    public string CustomerEmail { get; set; } 
    public string CustomerMobile { get; set; } 
    public string ShippingStreet { get; set; } 
    public string ShippingCity { get; set; } 
    public string ShippingCountry { get; set; } 
    public string ShippingPostalCode { get; set; } 
    public string ShippingTo { get; set; } 
    public bool IsShipped { get; set; } 
    public ICollection<ExportOrdersItemViewModel> Items { get; set; } 

} 

public class ExportOrdersItemViewModel 
{ 
    public string TicketName { get; set; } 
    public string EventName { get; set; } 
    public int Quantity { get; set; } 
    public string CurrencyId { get; set; } 
    public string PaymentCurrencyId { get; set; } 
    public string UnitPrice { get; set; } 
    public string PaymentUnitPrice { get; set; } 
} 

는 ExportOrdersViewModel 항목의 목록이 포함되어 있습니다. 파일을 만들 때 행을 만들 때이 목록을 셀에 표시하려고합니다.

파일을 만들려면 ClosedXML을 사용하고 있습니다. 파일을 만들기 전에 컨트롤러에서 모든 ExportOrdersViewModel 속성이 포함 된 DataTable과 ExportOrdersItemViewModel의 속성이 포함 된 다른 DataTable을 참조하는 행을 만들었습니다. Parrent DataTable은 통합 문서에 전달됩니다. 여기

당신은 내가 그 일을하고 어떻게 볼 수 있습니다

나는 주문 DataTable에, 그것은 해당 항목의 DataTable에 대한 참조를 포함하는 디버그 모드에서 확인, 그러나 나는 통과 할 때 통합 문서이다
 DataTable orders = new DataTable(); 

     orders.Columns.Add("OrderID", typeof(string)); 
     orders.Columns.Add("Items", typeof(DataTable)); 
     orders.Columns.Add("IsShipped", typeof(bool)); 

     DataTable items = new DataTable(); 
     items.Columns.Add("TicketName", typeof(string)); 
     items.Columns.Add("Quantity", typeof(int)); 
     items.Columns.Add("Currency", typeof(string)); 


     exportModels.ForEach(o => orders.Rows.Add(
              o.Id, 
              (DataTable)GetItems(o.Items), 
              o.IsShipped 
              )); 

, 파일 항목 행이 비어 있습니다. 이 출력 파일과 PRINTSCREEN입니다

XLWorkbook workbook = new XLWorkbook(); 
     workbook.Worksheets.Add(orders, "Orders"); 

     Response.Clear(); 
     Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
     Response.AddHeader("content-disposition", "attachment;filename=\"HelloWorld.xlsx\""); 

     using (MemoryStream memoryStream = new MemoryStream()) 
     { 
      workbook.SaveAs(memoryStream); 
      memoryStream.WriteTo(Response.OutputStream); 
      memoryStream.Close(); 
     } 

     Response.End(); 

: 여기

내가 파일을 만드는 오전 어떻게 enter image description here

을 그리고 난이 다음과 같이 만들고 싶어 : https://aspblogs.blob.core.windows.net/media/muhanadyounis/Media/linqParentChild_615EF617.jpg

+0

이 https://aspblogs.blob.core.windows.net/media/muhanadyounis/Media/linqParentChild_615EF617.jpg 엑셀의 스크린 샷입니다 : 코드의 다음 조각에서 내가 내 파일을 만든 방법은? 그 것처럼 보이지 않습니다. –

+0

그렇지 않습니다. 방금 그 모양을 만들고 싶었습니다 –

+0

Excel에서 불가능합니다. –

답변

0

에서 결국, 나는 이것을 위해 적당한 해결책을 발견했다. 매번 워크 시트에 새 테이블을 추가하고 있습니다. 여기에 내가했던 방법입니다

//HELPER METHODS 
    private DataTable GetItems(ICollection<ExportOrdersItemViewModel> list) 
    { 
     var items = new DataTable(); 

     items.Columns.Add(Resources.Names.OrderTicketName, typeof(string)); 
     items.Columns.Add(Resources.Names.OrderEventName, typeof(string)); 
     items.Columns.Add(Resources.Names.Quantity, typeof(int)); 
     items.Columns.Add(Resources.Names.Currency, typeof(string)); 
     items.Columns.Add(Resources.Names.PaymentCurrencyId, typeof(string)); 
     items.Columns.Add(Resources.Names.UnitPrice, typeof(string)); 
     items.Columns.Add(Resources.Names.PaymentUnitPrice, typeof(string)); 
     list.ForEach(i => items.Rows.Add(i.TicketName, i.EventName, i.Quantity, i.CurrencyId, i.PaymentCurrencyId, i.UnitPrice, i.PaymentUnitPrice)); 

     return items; 
    } 

    private void SetOrdersProperties(DataTable dataTable) 
    { 
     dataTable.Columns.Add(Resources.Names.OrderId, typeof(string)); 
     dataTable.Columns.Add(Resources.Names.OrderDate, typeof(string)); 
     dataTable.Columns.Add(Resources.Names.InvoicedDate, typeof(string)); 
     dataTable.Columns.Add(Resources.Names.CustomerFirstname, typeof(string)); 
     dataTable.Columns.Add(Resources.Names.CustomerLastName, typeof(string)); 
     dataTable.Columns.Add(Resources.Names.CustomerEmail, typeof(string)); 
     dataTable.Columns.Add(Resources.Names.CustomerPhone, typeof(string)); 
     dataTable.Columns.Add(Resources.Names.ShipTo, typeof(string)); 
     dataTable.Columns.Add(Resources.Names.ShippingStreet, typeof(string)); 
     dataTable.Columns.Add(Resources.Names.City, typeof(string)); 
     dataTable.Columns.Add(Resources.Names.ShippingPostalCode, typeof(string)); 
     dataTable.Columns.Add(Resources.Names.ShippingCountry, typeof(string)); 
     dataTable.Columns.Add(Resources.Names.IsShipped, typeof(string)); 
    } 

    private void SetItemsProperties(DataTable dataTable) 
    { 
     dataTable.Columns.Add(Resources.Names.OrderTicketName, typeof(string)); 
     dataTable.Columns.Add(Resources.Names.OrderEventName, typeof(string)); 
     dataTable.Columns.Add(Resources.Names.Quantity, typeof(int)); 
     dataTable.Columns.Add(Resources.Names.Currency, typeof(string)); 
     dataTable.Columns.Add(Resources.Names.PaymentCurrencyId, typeof(string)); 
     dataTable.Columns.Add(Resources.Names.UnitPrice, typeof(string)); 
     dataTable.Columns.Add(Resources.Names.PaymentUnitPrice, typeof(string)); 
    } 

내가 항목 DataTable에를 생성하고 주문 및 항목에 대한 행 이름을 설정하는 방법을 사용했다.

DataTable orders = new DataTable(); 
     SetOrdersProperties(orders); 

     DataTable items = new DataTable(); 
     SetItemsProperties(items); 

     XLWorkbook workbook = new XLWorkbook(); 
     var workSheet = workbook.Worksheets.Add("Orders"); 


     var index = 1; 
     exportModels.ForEach(o => 
          { 
           orders.Rows.Add(
              o.Id, 
              o.OrderDate, 
              o.InvoicedDate, 
              o.CustomerFirstName, 
              o.CustomerLastName, 
              o.CustomerEmail, 
              o.CustomerMobile, 
              o.ShippingTo, 
              o.ShippingStreet, 
              o.ShippingCity, 
              o.ShippingPostalCode, 
              o.ShippingCountry, 
              o.IsShipped ? "YES":"NO" 
              ); 
           workSheet.Cell(index, 1).InsertTable(orders); 
           index += orders.Rows.Count+1; 
           orders = new DataTable(); 
           SetOrdersProperties(orders); 
           workSheet.Cell(index, 2).InsertTable(GetItems(o.Items)); 
           workSheet.Cell(index, 1).Value = Resources.Names.Tickets; 
           workSheet.Range(index, 1, index + o.Items.Count,1).Merge(); 
           index += o.Items.Count()+1; 
           index++; 
          }); 

     workSheet.Tables.ForEach(t => t.ShowAutoFilter = false); 
     workSheet.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center; 
     workSheet.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; 
     workSheet.Tables.ForEach(t => t.Theme = XLTableTheme.TableStyleLight13);