2012-11-27 2 views
2

현재 프로젝트의 일부에는 120,000 개 이상의 레코드가 포함 된 큰 SQL 테이블에서 Excel 워크 시트를 채우는 작업이 포함됩니다. 현재 while 루프에서 SqlDataReader를 사용하여 새 Excel 시트를 직접 채우고 있지만 분명히 비현실적인 시간이 필요합니다. StringBuilder로 로컬 .CSV 파일 만들기 다음 Excel에서 여는이 더 빠른 옵션 인 것 같습니다. 1000 개 정도의 행마다 파일에 데이터를 덤프하거나 한꺼번에 쓸 수 있습니까? 아니면 내가 고려하지 않은이 데이터를 가져 오는 더 효율적인 방법이 있습니까?큰 SQL 쿼리를 Excel로 이동

데이터 집합은 사용자 입력에 따라 다르므로 기존 파일에 단순히 추가 할 수 없습니다.

현재 코드 : C#에서 DocumentFormat.OpenXml.Spreadsheet를 사용

SqlConnection cnnct = new SqlConnection("Data Source=Source;Initial Catalog=Catalog;Integrated Security=True;"); 
      cnnct.Open(); 
      SqlCommand cmd = new SqlCommand(); 
      cmd.Connection = cnnct; 
      string cmdText = "SELECT * FROM TABLE"; 
      cmd.CommandText = cmdText; 

      SqlDataReader dr = cmd.ExecuteReader(); 
      while (dr.Read()) 
      { 
       columnChar = 'A'; 
       rowCount++; 

       cellName = columnChar.ToString() + rowCount.ToString(); 
        ws.get_Range(cellName, cellName).Value2 = dr["EXAMPLE_FIELD"].ToString(); 
        columnChar++; 
       //The above three lines are identical for each field (there are 26) 
      } 
+0

무엇을 시도 했습니까? 다양한 옵션을 시도하기위한 성능 테스트가 있습니까? 표시된 코드는 CSV 파일을 작성하는 것과 아무런 관련이 없습니다. –

+0

초기 게시물에서 말했듯이 현재 while 루프에서 SqlDataReader를 사용하여 새 Excel 시트를 직접 채 웁니다. 나는 여러 가지 옵션을 모색 해 왔지만 CSV를 만들기 전에 외부의 의견을 구하고 있습니다. 나는 코드 예제를 찾고 있지 않다. 좀 더 효율적인 대안이 있을지 궁금하다. – ti30xa

답변

2

글쎄, 필자는 Excel interop을 피할 것이다. .CSV 파일을 작성한다는 아이디어에는 많은 장점이 있습니다. 항상 "최상의"성능을 발휘하기 위해서는 환경에 따라 다르지만 단위 테스트는 항상 도움이됩니다.

System.IO은 매우 적합합니다. 난 그냥 SqlDataReader에서 행을 읽고 CSV 라인을 작성합니다. 그것은 매우 간단한 코드가되며 상당히 "빠릅니다"라고 확신합니다.

행운을 빈다.

0

, 당신은 XLS 포맷을 만들기 위해, 자신의 엑셀 XML을 생성/Xlsx 형식으로 그 데이터 세트를 작성하거나 XML 파일 using System.xml을 만들거나 thrid 파티 도구를 사용할 수 있습니다.

1

큰 문제는 Excel 시트를 셀 단위로 채우는 것입니다. .Value2 호출기를 호출 할 때마다 COM interop 호출을하기 때문에 속도가 느립니다.

Excel (N 행 M 열)에 넣으려는 모든 데이터에 대해 배열을 할당하고 해당 범위를 나타내는 범위 개체를 만든 다음이를 사용하여 범위에 복사 한 경우 속도가 훨씬 빨라집니다 .Value2 세터.

관련 문제