직접 코드에 연결 :
사용 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)는, 다음 데이터를 엑셀 삽입에 가서 읽고.