2011-02-20 4 views
0

다음 코드를 사용하여 C#에서 Excel로 데이터 집합을 내보내는 중입니다. 나는 다음과 같은 출력을 얻고있다 :내보낼 때 출력 수정

ABC | 1 | 2/15/2011 21:36 | Systems Analyst | Project Duration 
ABC | 1 | 2/15/2011 21:36 | Systems Analyst | Skill of Team 
ABC | 1 | 2/15/2011 21:36 | Systems Analyst | Process 

내가하고 싶은 무엇을, 그러나, 다음과 같은 형식으로 출력 데이터이며, 열 머리글을 추가합니다. StoryCategoryID에 대한 출력이 1이면 NEGATIVE, 출력이 0이면 POSITIVE를 표시하고 싶습니다. 도와주세요!

Story | Story Type | Date | Project Member | Tag 1 | Tag 2 | Tag 3 

ABC | Negative | 2/15/2011 21:36 | Project Duration | Skill of Team | Process 

코드 : 모든

protected void btnExcelExport_Click(object sender, EventArgs e) 
{ 

     string sql = null; 
     string data = null; 
     //string path = save_as.Text; 

     int i = 0; 
     int j = 0; 

     Excel.Application xlApp; 
     Excel.Workbook xlWorkBook; 
     Excel.Worksheet xlWorkSheet; 
     object misValue = System.Reflection.Missing.Value; 

     xlApp = new Excel.ApplicationClass(); 
     xlWorkBook = xlApp.Workbooks.Add(misValue); 
     xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); 

     //connectionString = "data source=servername;initial catalog=databasename;user id=username;password=password;"; 
     SqlConnection cnn = new SqlConnection(GetConnectionString()); 
     cnn.Open(); 
     sql = "SELECT s.Story, s.StoryCategoryID, s.CreationDate, m.CompanyRole, af.Name FROM Story s INNER JOIN ProjectIterationMember pm ON pm.ProjectIterationMemberID = s.ProjectIterationMemberID INNER JOIN Iterations i ON i.ProjectIterationID = pm.ProjectIterationID INNER JOIN Member m ON m.MemberID = pm.MemberID INNER JOIN ProjectStoryFactors psf ON psf.StoryID = s.StoryID INNER JOIN AgileFactors af ON af.AgileFactorID = psf.AgileFactorID WHERE i.ProjectID = '" + proj_id + "'"; 
     SqlDataAdapter dscmd = new SqlDataAdapter(sql, cnn); 
     DataSet ds = new DataSet(); 
     dscmd.Fill(ds); 

     for (i = 0; i <= ds.Tables[0].Rows.Count - 1; i++) 
     { 
      for (j = 0; j <= ds.Tables[0].Columns.Count - 1; j++) 
      { 
       data = ds.Tables[0].Rows[i].ItemArray[j].ToString(); 
       xlWorkSheet.Cells[i + 1, j + 1] = data; 
      } 
     } 

     xlWorkBook.SaveAs("excelDocument" + DateTime.Now.Ticks + ".xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue); 
     xlWorkBook.Close(true, misValue, misValue); 
     xlApp.Quit(); 

     releaseObject(xlWorkSheet); 
     releaseObject(xlWorkBook); 
     releaseObject(xlApp); 

     //MessageBox.Show("Excel file created , you can find the file c:\\csharp.net-informations.xls"); 
    } 
+0

직접적인 해결책은 아니지만 http://excelpackage.codeplex.com/에서 더 쉽게 작업 할 수 있습니다. COM 종속성이 없으며 형식 지정과 관련하여 매우 유연합니다. –

답변

1

먼저, 성능 현명한, 그것은 세포에 의해 세포를 작성 후 Excel에서 범위에 쓸 훨씬 빨리이다. 테이블의 데이터에서 2 차원 배열을 만들어 범위에 직접 쓸 수 있습니다.

헤더 정보 : 원하는 텍스트를 Excel의 첫 번째 행에 씁니다. 원하는 경우 자동 필터를 설정할 수도 있습니다. 데이터를 쓸 때, 2 행부터 시작하십시오.

값을 "양수"또는 "음수"로 변경하려면 다음을 수행하십시오. 소스 (원하는 경우 다른 데이터 테이블의 배열)에서 값을 변경하기 만하면됩니다.

//Create 2-dimensional array with the data from the datatable 
DataTable dt = ds.Tables[0]; 
string[,] arrValues = new string[dt.Rows.Count, dt.Columns.Count]; 

for (int i = 0; i < dt.Rows.Count; i++) 
{ 
    for (int j = 0; j < dt.Columns.Count; j++) 
    { 
     arrValues[i, j] = dt.Rows[i].ItemArray[j].ToString(); 
    } 
} 

//Change the data from the column StoryCategoryID here 
//Just loop through the items in the correct column of the array 
//and check whether it's "0" or "1" 

//Add headers 
for (int i = 0; i < dt.Columns.Count; i++) 
{ 
    xlWorkSheet.Cells[1, i + 1] = dt.Columns[i].ColumnName; 
    //Or any name you like 
} 

//Create range (start at row 2 because of header-row) 
Range xlRange = (Range)xlWorkSheet.Cells[2, 1]; 
xlRange = xlRange.Resize[dt.Rows.Count, dt.Columns.Count]; 

//Fill range 
xlRange.Value = arrValues; 

//Format document 
xlWorkSheet.EnableAutoFilter = true; 
xlWorkSheet.Cells.AutoFilter(1); 
xlWorkSheet.Range["A1", "A1"].EntireRow.Font.Bold = true; 
xlWorkSheet.Columns.AutoFit(); 

값을 셀 단위로 전달하는 대신 범위를 사용하는 이유는 성능 때문입니다. 약 1500 레코드 (15 coloumns) Excel 파일을 만드는 데 약 7-8 분이 걸렸습니다. 이렇게하면 (범위 내에서) 약 5 ~ 10 초가 걸렸습니다.

(이것은 내 마음이 바뀌었기 때문에 다른 매개 변수를 전달해야하는 "잘못된 값"이있을 수 있지만 그림을 얻을 수 있습니다.)

관련 문제