[C#] 대량의 엑셀 파일 빠르게 읽어오기


인터넷에 C#으로 엑셀 파일을 읽어와 DataGridView에 뿌리는 소스는 많으나

대부분 Com 오브젝트나 OpenXML을 이용한 방법들이고 방법도 이중 for문을 이용하는게 많아서 datagridview에 하나하나 뿌리면 속도가 끔찍합니다.

 

시간복잡도가 ${O(N^2)}$...

거기다가 DataGridView 자체도 엄청나게 느린데 만약 몇만라인이 되는 엑셀파일을 읽는다?

 

설명은 생략하기로 하고...

 

아주 쉽게 대량(큰)의 엑셀파일을 읽는 방법을 알아보겠습니다.

 

Pre-Install

Nuget Package에서 ExcelDataReaderExcelDataReader.DataSet을 설치합니다.

 

 

Source Code

 

string fname = "";

            OpenFileDialog fdlg = new OpenFileDialog();
            fdlg.Title = "엑셀 데이터 불러오기";
            fdlg.Filter = "All files (*.*)|*.*";
            fdlg.RestoreDirectory = true;
            if (fdlg.ShowDialog() == DialogResult.OK) //파일 열기(OK) 버튼을 누른경우
            {
                fname = fdlg.FileName;

                using (var stream = File.Open(fname, FileMode.Open, FileAccess.Read))
                {
                    using (var reader = ExcelReaderFactory.CreateReader(stream))
                    {
                        var result = reader.AsDataSet(new ExcelDataSetConfiguration() //데이터셋 변환하기
                        {
                            ConfigureDataTable = (tableReader) => new ExcelDataTableConfiguration()
                            {
                                //Column 자동생성을 무시하고 첫번째 행을 열로 자동 지정.
                                UseHeaderRow = true,
                            }
                        });

                        dataGridView1.RowHeadersVisible = false; //왼쪽 화살표 제거
                        dataGridView1.DataSource = result.Tables[0]; //엑셀파일의 첫번째 Table을 가져온다

                    }
                }

만약에 첫 데이터가 컬럼이 되는걸 원치 않으시면 UseHeaderRow 의 값을 false로 지정해주시면 됩니다.

 

시험삼아 저번에 업비트에서 뽑아놓은 시계열 데이터를 로딩해봤습니다.

총 16769줄입니다.

 

사진은 csv으로 나왔으나 이 코드론 xls, xlsx 형식만 열립니다.

csv는 아래 github 링크를 참고해주세요.

 

이 라이브러리를 사용하면 마법같은 속도로 불러와집니다.

16769라인을 약 0.57초만에 가져왔네요. 암이 치유됩니다!!!

 

dataGridView를 최적화한다면 조금더 빨리 가져올 수도 있을거 같네요

물론 데이터가 엄청나게 많으면 스크롤을 내릴때도 렉이 상당합니다.

이것도 일종의 꼼수로 해결할 수 있는 방법이 있습니다. 이것은 추후 포스팅할 예정입니다.

 

출처

github.com/ExcelDataReader/ExcelDataReader

 

ExcelDataReader/ExcelDataReader

Lightweight and fast library written in C# for reading Microsoft Excel files - ExcelDataReader/ExcelDataReader

github.com

혹시라도 나는 라이브러리를 쓰는게 자존심 상한다 하면 빠르게 불러오는 알고리즘을 직접 연구해보시면 되겠습니다.

COMMENT WRITE