인터넷에 C#으로 엑셀 파일을 읽어와 DataGridView에 뿌리는 소스는 많으나
대부분 Com 오브젝트나 OpenXML을 이용한 방법들이고 방법도 이중 for문을 이용하는게 많아서 datagridview에 하나하나 뿌리면 속도가 끔찍합니다.
시간복잡도가 ${O(N^2)}$...
거기다가 DataGridView 자체도 엄청나게 느린데 만약 몇만라인이 되는 엑셀파일을 읽는다?
더 이상의 자세한 설명은 생략한다
아주 쉽게 대량(큰)의 엑셀파일을 읽는 방법을 알아보겠습니다.
Pre-Install
Nuget Package에서 ExcelDataReader와 ExcelDataReader.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
혹시라도 나는 라이브러리를 쓰는게 자존심 상한다 하면 빠르게 불러오는 알고리즘을 직접 연구해보시면 되겠습니다.
한계점?
엑셀 파일에 배경 색이 칠해져있거나 하면 읽어올때 상당히 많은 렉이 동반되면서
로딩 시간이 매우 늘어납니다.
라이브러리 자체가 어떻게 동작하는진 모르겠는데 Plain text만을 읽는게 아니거나, text를 읽을때 색깔 정보도 무시하지 않고 같이 읽어내서 그런거 같습니다.
Python에는 Pandas라는 좋은 녀석이 있는데 일단은 exe배포에 있어선 C# 하곤 속도나, 특히 용량면에선 비교가 어렵기 때문에...
일단 이 라이브러리를 사용하면 가장 쉬운 해결법은 엑셀 파일에 배경색이나 잡다한 내용을 빼버리는 것입니다.
'프로그래밍 > C#' 카테고리의 다른 글
Excel을 통한 PC SMS 전송 프로그램을 개발했습니다 (73) | 2021.08.23 |
---|---|
[C#] DataGridView Foucs 초기화 & 데이터 크기에 맞춰서 Column 자동 설정 (0) | 2021.07.23 |
[C#] 자연스러운 정렬(natural sort) 사용하기 (0) | 2020.09.16 |
[C#] Selenium IEDRIVER이 작동하지 않을때 해결법 (0) | 2020.03.23 |
[C#] 음성인식 검색기 만들기 0편. 구상 (0) | 2020.03.23 |