엑셀에 C #을 npoi 배치 APPEND 데이터

직접 코드에 연결 :

사용 DongYang.Core.Model.Domain 단계;
사용 DongYang.Core.Utils 단계;
사용 NLog 단계;
사용 NPOI.XSSF.UserModel 단계;
사용하여 시스템;
사용 System.Collections.Generic 단계;
사용 System.Data 단계;
사용 System.Diagnostics 네임을;
사용 System.IO 단계;
사용 하여 System.Threading 단계; 

네임 스페이스 DongYang.Core.Service 
{ 
    공공  클래스 DYTrackANODetail700013TodayNewService 
    { 
        개인  읽기 전용 로거 _logger = LogManager.GetCurrentClassLogger (); // 日志组件

        ///  <요약>
        /// 导出엑셀
         ///  </ 요약> 
        ///  <PARAM NAME = "anomateexcels"> </ PARAM> 
        ///  <PARAM NAME = "currentTime을"> </ PARAM> 
        공공  무효 ExportToExcel (목록 <Anomateexcel> anomateexcels, 날짜 시간 currentTime을) 
        { 
            스톱워치 SW = 새로운 스톱워치 (); 
            sw.Start (); 

            파일 스트림 파일 = 널 (null) ;
            문자열 strBeginTime는 = 문자열 .Empty을; // 查询开始时间
            문자열 strEndTime = 문자열 .Empty;

            
            { 
                // 템플릿 파일 
                문자열 TemplateFileName 해당 AppDomain.CurrentDomain.BaseDirectory + = " \\ template.xlsx " ;
                 // 내보내기 파일 
                문자열 ReportFileName = FileHelper.GetExportFilePath (currentTime을) + $ " \\ {currentTime.ToString ( " YYYYMMDD_HHMMSS " )} .XLSX " ;
                 // 질의 날짜 얻을 
                이 본 .GetTime (currentTime을, OUT strBeginTime, OUT strEndTime를)
                 // 데이터 질의의 전체 개수 
                의 INT 카운트 = 이 본.GetDataTableCount (strBeginTime, strEndTime)
                 IF (COUNT == 0 ) 로 돌아 ;
                 // 첫번째 빈 파일 복사 
                , File.Copy (TemplateFileName, ReportFileName)
                 // , 파일 복사 및 APPEND 데이터 열, 루프 내측 페이지 질의 데이터 가까운 파일 핸들 
                VAR은 페이지 = Math.Ceiling (Convert.ToDouble (COUNT) / ConfigHelper.PageSize)
                 에 대해 ( int로 pageIndex = . (1) 상기 pageIndex <= 페이지 상기 pageIndex ++ ) 
                { 
                    VAR 합니다 (pageIndex - startRow를 = . 1 ) * ConfigHelper.PageSize + 1 ;
                    VAR endRow에 pageIndex * = ConfigHelper.PageSize;
                     var에 DT = 이 본 .GetDataTable (strBeginTime, strEndTime 상기 startRow, endRow에) 

                    파일 = 새로운 새 FileStream을 (ReportFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) 
                    XSSFWorkbook xssfworkbook = 새로운 새 XSSFWorkbook (파일); // 메모리에 파일, 동작은 메모리 엑셀 
                    File.close을 (); 
                    XSSFSheet xssfsheet = xssfworkbook.GetSheet (ConfigHelper.WorkSheetName) AS XSSFSheet; 

                    VAR beginRow와 = 의한 . 3 +를 startRow을 -1 ;
                    위한 ( VAR 난 = 0 ; I <dt.Rows.Count 단계; I ++ ) 
                    { 
                        VAR excelRow = xssfsheet.CreateRow (beginRow와 ++ );
                        foreach는 ( VAR의 anomateexcel anomateexcels) 
                        { 
                            VAR excelCell = excelRow.CreateCell (anomateexcel.Excellist.ToInt ()); 
                            excelCell.SetCellType (NPOI.SS.UserModel.CellType.String); 
                            VAR의 값 = dt.Rows을 [I] [anomateexcel.Anofield]로 .toString (); 
                            excelCell.SetCellValue (값);
                        }
                    } 

                    Xssfsheet.ForceFormulaRecalculation = true로 ;
                     // 파일 데이터가 메모리에 기록 
                    은 USING (FS =를 FileStream을 File.OpenWrite (ReportFileName)) 
                    { 
                        xssfworkbook.Write (FS) 
                        xssfworkbook.Close (); 
                    } 

                    에 Thread.sleep ( 100 ) 
                } 
            } 
            캐치 (예외 EX) 
            { 
                _logger.Error ($ " 수출 데이터 오류 메시지 : ex.Message {}, 스택 트레이스 : ex.StackTrace {} " );
            } 
            최종적으로 
            { 
                IF (파일! = null이 ) File.close (); 
            } 

            sw.Stop (); 
            _logger.Info ($ " 날짜 : {currentTime을}, {sw.Elapsed.TotalSeconds} 가공 된 초 " ); 
        } 

        # 영역 획득 시작 시각과 종료 시각 /// <요약> /// 획득 시작 시각과 종료 시각
         /// </ 요약> /// <PARAM NAME = "currentTime을"> </ PARAM> /// <PARAM 이름 = "strBeginTime"> </ PARAM> /// <PARAM NAME = "strEndTime"> </ PARAM>개인 밖으로

         
         
         
         
         
         보이드 (날짜 시간 currentTime을, GetTime에 문자열 strBeginTime, 밖으로  문자열 strEndTime) 
        { 
            날짜 시간 BEGINTIME; 
            날짜 시간 endTime- 사용자; 
            경우 (currentTime을 <currentTime.Date.AddHours ( 7.5 )) 
            { 
                BEGINTIME = currentTime.Date.AddDays (- 1 ) .AddHours ( 7.5 ); // 前天7시 반 
                endTime- 사용자 currentTime.Date.AddHours = ( 7.5 ); // 当天的7:30 
            }
             다른 
            { 
                BEGINTIME = currentTime.Date.AddHours ( 7.5 );
                endTime- 사용자 = currentTime.Date.AddDays ( 1 ) .AddHours ( 7.5 ); 
            } 

            strBeginTime = beginTime.ToString ( " YYYY-MM-DD HH : MM " ); 
            strEndTime = endTime.ToString ( " : mm HH를 YYYY-MM-DD ' ) 
        } 

        #endregion 

        # 지역查询数据/// <요약> /// 查询数据
         /// </ 요약> /// <PARAM NAME = "strBeginTime"> </ PARAM> /// <PARAM NAME = "strEndTime" > </ PARAM> /// <

         
         
         
         
         
        ///  <PARAM NAME = "endRow에"> </ PARAM> 
        ///  <리턴> </ 반품> 
        개인 DataTable을 GetDataTable ( 문자열 strBeginTime, 문자열 strEndTime, INT startRow, INT 와 endRow) 
        { 
            var에 SQL = $ @ " 
선택 * 행 
( 
    선택 ROW_NUMBER () 위에 ROWNUMBER 같은 오름차순, AB 오름차순, AC를 ASC)하여 (순서 * 
    에서 {ConfigHelper.ExcelExportTableName} 
    여기서 E '{strBeginTime}'및 '{strEndTime} 사이 
) t와 같은 
곳 ROWNUMBER 사이 { startRow}과 {와 endRow} 
" ; 
            DataTable을 DT =DapperSqlHelper.QueryDataTable (SQL);
            반환 DT; 
        } 

        #endregion 

        # 지역查询总数/// <요약> /// 查询总数
         /// </ 요약> /// <PARAM NAME = "strBeginTime"> </ PARAM> /// <PARAM NAME = "strEndTime" > </ PARAM> /// <리턴> </ 반품> 개인 INT GetDataTableCount ( 문자열 strBeginTime, 문자열 strEndTime) 
        { var에 SQL = $ " 에서 SELECT COUNT (1) {ConfigHelper.ExcelExportTableName} 여기서 E 사이의 '{strBeginTime}' 및 '

         
         
         
         
         
         
            
            DataTable에 DT = DapperSqlHelper.QueryDataTable (SQL);
            VAR의 카운트를 Convert.ToInt32 = (dt.Rows [ 0 ] [ 0 ]);
            반환 카운트; 
        } 

        #endregion 
    } 
}

데이터가 아마도, 레코드 당 7 ~ 8 천원과 400 필드 크기 때문에 그것은 조건에 맞춰 데이터를 한 번 읽기로 시작했다. 나중에 그렇게 최적화되었다 페이지는 각각의 촬영 데이터 (100)는, 다음 데이터를 엑셀 삽입에 가서 읽고.

추천

출처www.cnblogs.com/subendong/p/12109568.html