OleDB는 다양한 데이터 소스에 대한 Microsoft의 전략적 하위 수준 애플리케이션 프로그래밍 인터페이스입니다. 이 클라이언트의 DBF 파일 입력 및 출력도 이 데이터베이스 API를 사용하여 다양한 종류의 데이터베이스를 지원합니다. OleDB를 사용할 때 네임스페이스를 추가해야 합니다.
using System.Data.OleDb;
xlsx 파일 입력:
private void inputXlsx() { string strConn2; string filePath = inPath; FileInfo fileInfo = new FileInfo(filePath); string directory = fileInfo.DirectoryName; strConn2 = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source='{0}';Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;';"; string strConnection = string.Format(strConn2, inPath); OleDbConnection conn = new OleDbConnection(strConnection); try { conn.Open(); String tableName = null; DataTable dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); tableName = dt.Rows[0][2].ToString().Trim(); OleDbDataAdapter oada = new OleDbDataAdapter("select * from [" + tableName + "]", strConnection); oada.Fill(dtOld); conn.Close(); } catch (Exception ex) { conn.Close(); } }
xlsx 파일의 중간 처리는 필요에 따라 다르며, 처리 방법은 다음과 같습니다. 여기서는 방법에 대해 자세히 설명하지 않습니다. 입력 과정에서 파일 내의 데이터가 Datatable 데이터 형식으로 변환되어 데이터를 임시로 저장하는 그리드 가상 테이블로 처리가 매우 편리합니다.
xlsx 파일 내보내기: xlsx 파일의 출력 과정이 그다지 원활하지 않으며 세 가지 방법을 사용합니다.
첫 번째 방법은 당연히 시작과 끝이 있는 OleDB입니다. 그러나 실제 사용 중에 이 방법을 사용하면 프로그램을 실행하기 위해 컴퓨터에 Excel이 설치되어 있어야 할 뿐만 아니라 Excel 버전에 대한 요구 사항도 매우 높다는 사실을 발견했습니다. 레지스트리를 삭제하면 자멸하게 됩니다. 레지스트리를 변경하면 엑셀을 바로 파기하겠습니다. 실제로 고객의 컴퓨터에 해당 버전의 Excel이 반드시 설치되어 있어야 한다고 보장할 수 없으므로 OleDB를 사용하여 파일을 출력하는 경우 이 클라이언트의 호환성이 매우 열악할 것입니다.
몇몇 의사소통과 고민 끝에 방법을 바꾸기로 결정하고 타사 구성요소를 사용하기로 결정했습니다. JAVA 측에서는 POI를 사용하므로 여기서는 POI 프로젝트의 .NET 버전인 NPOI를 직접 사용합니다. 온라인 튜토리얼도 많고 구현하기도 쉬운데, 테스트해본 결과 이 방법은 DEMO 파일 처리에는 문제가 없는데 10만개, 심지어 100만개까지 대체됩니다. 실제 고객이 제공한 라인을 사용하면 출력 프로세스 중에 클라이언트가 직접 충돌합니다.
정보를 검색한 결과 네티즌들은 대용량 파일에는 EPPlus를 사용하도록 권장했습니다. 튜토리얼도 많고 테스트를 위해 파일 크기를 계속 늘리지는 않았지만 고객이 제공한 수십 개의 파일이 모두 테스트를 통과했으며 기본적으로 백만 수준 미만이었습니다.
코딩하자:
private void outputXlsx() { FileInfo newFile = new FileInfo(dtNew.TableName + ".xlsx"); if (newFile.Exists) { newFile.Delete(); newFile = new FileInfo(dtNew.TableName + ".xlsx"); } using (ExcelPackage package = new ExcelPackage(newFile)) { ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(dtNew.TableName);//创建worksheet for (int m = 0; m < dtNew.Columns.Count; m++) { worksheet.Cells[1, m + 1].Value = dtNew.Columns[m]; } int i = 1; foreach (DataRow dr in dtNew.Rows) { for (int j = 0; j < dtNew.Columns.Count; j++) { worksheet.Cells[i + 1, j + 1].Value = dr[j]; } i++; } package.Save();//保存excel } }