2017-12-18 13 views
1

내가 여기에 3 테이블을 Excel로 내보내는 중 첫 번째 테이블에 조인 싶습니다. Transpose 함수를 사용하여 시도했지만 잘못된 방식으로 System.ArgumentException throw합니다 것처럼 그것을 보인다. . 확실하지, 테이블을 바꾸어 할 수있는 다른 방법이 무엇Datatable은 전치 할 수 없습니다. "System.ArgumentException '

나는 또한 작동하지 않았더라도 DataView를하지만를 사용하여 시도 아래는 내가 DataView를했던 것입니다 :.. 아래

static void Main(string[] args) 
    { 
     string strSql = ConfigurationManager.AppSettings["Sql"]; 
     DataAccess dsObj = new DataAccess();  
     DataSet ds= dsObj.GetData(strSql); 
     DataView transposedDataView = Transpose(ds.Tables[0].Copy()).DefaultView; 
     var td = transposedDataView.ToTable(); 
     TableData(td, ds.Tables[1], ds.Tables[2]); 
    } 

은 전체 코드

입니다
class CreateWorkbook 
{ 

    static void Main(string[] args) 
    { 
     string strSql = ConfigurationManager.AppSettings["Sql"]; 
     DataAccess dsObj = new DataAccess();  
     DataSet ds= dsObj.GetData(strSql); 
     TableData(Transpose(ds.Tables[0]), ds.Tables[1], ds.Tables[2]); 
     } 

    private static DataTable Transpose(DataTable dt) 
    { 
     DataTable dtNew = new DataTable(); 

     //adding columns  
     for (int i = 0; i <= dt.Rows.Count; i++) 
     { 
      dtNew.Columns.Add(i.ToString()); 
     } 



     //Changing Column Captions: 
     dtNew.Columns[0].ColumnName = " "; 



     //Adding Row Data 
     for (int k = 1; k < dt.Columns.Count; k++) 
     { 
      DataRow r = dtNew.NewRow(); 
      r[0] = dt.Columns[k].ToString(); 
      for (int j = 1; j <= dt.Rows.Count; j++) 
       r[j] = dt.Rows[j - 1][k]; 
      dtNew.Rows.Add(r); 
     } 

     return dtNew; 
    } 
    private static void TableData(DataTable Summary, DataTable NewIssue, DataTable Backlog) // Datatable contains data which we want to show in excel report 
    { 


      // create a new excel package for writing 
      using (ExcelPackage workingPkg = new ExcelPackage()) 
      { 


       //create workbook 
       ExcelWorkbook wbReport = workingPkg.Workbook; 

       //Add worksheets in workbook 
       ExcelWorksheet ws = workingPkg.Workbook.Worksheets.Add("Summary.xlsx"); 
       ExcelWorksheet ws1 = workingPkg.Workbook.Worksheets.Add("NewIssuance.xlsx"); 
       ExcelWorksheet ws2 = workingPkg.Workbook.Worksheets.Add("BuyBack.xlsx"); 


       ws.Cells["A1"].LoadFromDataTable(Summary, true, TableStyles.Medium1); 
       ws.Cells[ws.Dimension.Address].AutoFitColumns(); 
       ws.Cells["A:H"].Style.Numberformat.Format = "#,##0"; 

       ws1.Cells["A1"].LoadFromDataTable(NewIssuance, true, TableStyles.Medium1); 
       ws1.Cells[ws1.Dimension.Address].AutoFitColumns(); 
       ws1.Cells["A:H"].Style.Numberformat.Format = "#,##0"; 

       ws2.Cells["A1"].LoadFromDataTable(BuyBack, true, TableStyles.Medium1); 
       ws2.Cells[ws2.Dimension.Address].AutoFitColumns(); 
       ws2.Cells["A:H"].Style.Numberformat.Format = "#,##0"; 


           workingPkg.SaveAs(new FileInfo(ConfigurationManager.AppSettings["Location"] + DateTime.Now.ToString("_MM_yyyy")+".xlsx")); 
      } 
     } 
    } 
+0

에 오신 것을 환영합니다 SO 전치, 행에 의해 열, 행에 의해 엑셀 시트 컬럼에 데이터를 기록 할 수 있습니다! 사람들이 수천 줄의 코드를 게시하고 "나는 그 많은 곳에서 예외를 얻고 있습니다"라고 말할 때 그것을 좋아합니다. SO 질문에 대한 조언의 기본 비트 중 하나는 " 바쁜 동료에게 문제가 .. "- 동료 인 것처럼 상상해보십시오. 여기에서 설명하는 문제를 쉽게 파악할 수 있습니까? –

+0

@CaiusJard 그리고 사람들이 "4 줄짜리 코드에서 어떻게 알아 내야할까요?"하고 말하기도합니다. 전체 코드를 게시하십시오. " 그 이유는, 먼저 (4 라인) 메소드 사용법을 게시 한 다음 그 아래에 전체 코드를 게시했습니다 (필요한 경우). 내가 알고있는 것은, 내가 실수하고있는 실수 (틀린 방식으로 메서드를 호출하는 것)를 수정하기 위해 도움이 필요하다는 것입니다. –

+0

만약 내가 이것을 코딩했다면, 나는 datatable을 transposing하는 것을 방해하지 않을 것이다. 다른 방향으로 그것을 시트에 채우는 것이다. (시트를 채우는 것처럼 transpose를 수행한다.) –

답변

0

데이터 테이블을 변환하고 변환 된 테이블을 읽도록 ExcelPackage를 가져 오는 대신 데이터를 Excel로 옮겨 봅니다. datatables는 그런 식으로 사용할 수 없습니다. DataTables은 절대적으로 그리고 완전히 열이 일관되게 입력되는 데이터의 모음으로 의도되었습니다. int 열과 문자열 열을 보유하는 2 행 테이블을 가져 와서 int 행과 문자열 행을 나타내는 형식이없는 열 쌍으로 변환 할 수 없습니다. DataTable을 이와 같이 작동시킬 수 없습니다.

ExcelPackage를 사용한 적이 없으므로 아래 코드가 100 % 오류가 없음을 보증하지 않습니다. 예를 들어 ExcelPackage가 0 기반 또는 1 기반 인덱싱 등을 사용하는지 잘 모르겠습니다. 아이디어는 당신이 열을 기준으로 행, 열을 기준으로 데이터 테이블 행을 반복 할 수 있음을 보여주고 있었다, 그러나 당신은 효과적으로은

for(int tr=0;tr<table.Length;tr++) 
    for(int tc=0;tc<table.Length;tc++) 
    worksheet.Cells(tc,tr).Value = table.Rows[tr][tc];