IronXL 데이터 로딩 메서드 성능
IronXL에서 대규모 워크시트를 채울 때, 선택하는 로딩 방식은 파일을 생성하는 데 걸리는 시간에 큰 영향을 미칩니다. 아래 벤치마크는 동일한 데이터셋에 대해 세 가지 접근 방식을 비교합니다: 20,000개의 행별 55개의 열은 각각 .xlsx 파일로 디스크에 작성됩니다.
테스트 개요
모든 테스트는 동일한 데이터를 채우고 결과를 디스크에 기록합니다. 초 단위와 결과 파일 크기를 모두 기록합니다.
- 셀 단위로 데이터 추가: ~24초, 3094 KB
DataTable에서 로딩: ~13초, 3094 KB- CSV에서 로딩: ~9초, 3094 KB
파일 크기는 모든 세 가지에서 동일합니다. 파일을 만드는 데 걸리는 시간만 변합니다.
방법들
옵션 1: 셀 단위로 데이터 추가
세 가지 중 가장 느립니다. 각 셀은 중첩 루프를 통해 개별적으로 할당됩니다.
string[] fruits = { "Apples", "Apricot", "Banana", "Blackberry", "Blueberry", "Boysenberry", "Canary Melon", "Cantaloupe",
"Currants", "Dates (tree dried only) Dragon Fruit", "Durian (purchase cut) Figs", "Gooseberry", "Grapes", "Grapefruit",
"Lemon", "Lime", "Loganberry", "Longan", "Loquat", "Lychee", "Mandarin", "Mango",
"Blood Orange", "Papaya", "Passion Fruit", "Peach", "Pear", "Persimmon", "Pineapple", "Plum", "Honeydew",
"Rambutan", "Starfruit", "Tamarind", "Yuzu", "Açaí", "Abiu", "Ackee", "Breadfruit", "Cempedak",
"Cherimoya", "Buddha's Hand", "Citron", "Finger Lime", "Kumquat", "Pomelo", "Tangelo", "Ugli Fruit",
"Galia Melon", "Kiwano (Horned Melon)", "Mouse Melon", "Muskmelon",
"cherry", "nectarine", "Butternut squash"};
var workbook = WorkBook.Create(ExcelFileFormat.XLSX);
var worksheet = workbook.CreateWorkSheet("Fruits");
var columnsTitles = GetExcelCellLetters(fruits.Length);
for (int col = 0; col < columnsTitles.Count; col++)
{
string columnLetter = columnsTitles[col]; // To avoid interpolation that can cause performance issues in large loops because it build string objects in every loop
for (int row = 1; row <= 20000; row++)
{
worksheet[columnLetter + row].Value = fruits[col];
//worksheet.Rows[row].Columns[columnLetter].Value.ToString();
}
}
workbook.SaveAs("C:\\Temp\\ManualCell-by-CellAssignment.xlsx");
private static List<string> GetExcelCellLetters(int iMaxNum)
{
string[] alphabet = { string.Empty, "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };
IEnumerable<string> lst = (from c1 in alphabet
from c2 in alphabet
from c3 in alphabet.Skip(1)
where c1 == string.Empty || c2 != string.Empty
select c1 + c2 + c3).Take(iMaxNum);
return lst.ToList();
}
캐시된 columnLetter를 주목하세요: 내부 루프에서 보간하는 대신 각 열에 대해 열 참조를 한 번 빌드하면 매 반복마다 새 문자열 할당을 피할 수 있습니다. 이 방법은 진정한 셀별 논리 또는 스타일링 필요 시에만 사용하세요.

옵션 2: DataTable 에서 로딩
견고한 중간 지점이며 수동 셀 삽입보다 훨씬 빠릅니다. 메모리에 DataTable를 빌드한 다음 LoadWorkSheet에 전체를 전달합니다.
string[] fruits = { "Apples", "Apricot", "Banana", "Blackberry", "Blueberry", "Boysenberry", "Canary Melon", "Cantaloupe",
"Currants", "Dates (tree dried only) Dragon Fruit", "Durian (purchase cut) Figs", "Gooseberry", "Grapes", "Grapefruit",
"Lemon", "Lime", "Loganberry", "Longan", "Loquat", "Lychee", "Mandarin", "Mango",
"Blood Orange", "Papaya", "Passion Fruit", "Peach", "Pear", "Persimmon", "Pineapple", "Plum", "Honeydew",
"Rambutan", "Starfruit", "Tamarind", "Yuzu", "Açaí", "Abiu", "Ackee", "Breadfruit", "Cempedak",
"Cherimoya", "Buddha's Hand", "Citron", "Finger Lime", "Kumquat", "Pomelo", "Tangelo", "Ugli Fruit",
"Galia Melon", "Kiwano (Horned Melon)", "Mouse Melon", "Muskmelon",
"cherry", "nectarine", "Butternut squash"};
var workbook = WorkBook.Create(ExcelFileFormat.XLSX);
DataTable table = new DataTable("Fruits");
foreach (string fruitName in fruits)
{
table.Columns.Add(fruitName);
}
int rowCount = 20000;
for (int i = 0; i < rowCount; i++)
{
table.Rows.Add(fruits);
}
workbook.LoadWorkSheet(table);
workbook.SaveAs("C:\\Temp\\LoadDataTableDirectly.xlsx");
LoadWorkSheet 은 한 번의 호출로 전체 테이블을 로딩하므로 수동으로 각 셀을 작성하는 것보다 빠른 이유입니다. 데이터가 이미 구조화된 메모리에 있다면 이를 선택하세요.

옵션 3: CSV에서 로딩
전반적으로 가장 빠르고, 평평하고 구분된 데이터에는 자연스러운 선택입니다. CSV 파일에 행을 작성한 후 LoadCSV과 함께 다시 읽으세요.
string[] fruits = { "Apples", "Apricot", "Banana", "Blackberry", "Blueberry", "Boysenberry", "Canary Melon", "Cantaloupe",
"Currants", "Dates (tree dried only) Dragon Fruit", "Durian (purchase cut) Figs", "Gooseberry", "Grapes", "Grapefruit",
"Lemon", "Lime", "Loganberry", "Longan", "Loquat", "Lychee", "Mandarin", "Mango",
"Blood Orange", "Papaya", "Passion Fruit", "Peach", "Pear", "Persimmon", "Pineapple", "Plum", "Honeydew",
"Rambutan", "Starfruit", "Tamarind", "Yuzu", "Açaí", "Abiu", "Ackee", "Breadfruit", "Cempedak",
"Cherimoya", "Buddha's Hand", "Citron", "Finger Lime", "Kumquat", "Pomelo", "Tangelo", "Ugli Fruit",
"Galia Melon", "Kiwano (Horned Melon)", "Mouse Melon", "Muskmelon",
"cherry", "nectarine", "Butternut squash"};
var sb = new StringBuilder();
// Step 1: Add header row
sb.AppendLine(string.Join(",", fruits));
// Step 2: Add 20,000 identical rows
string rowData = string.Join(",", fruits); // same as headers
for (int i = 1; i < 20000; i++)
{
sb.AppendLine(rowData);
}
File.WriteAllText("C:\\Temp\\csvfile.csv", sb.ToString(), Encoding.UTF8);
var workbook = WorkBook.LoadCSV("C:\\Temp\\csvfile.csv");
workbook.SaveAs("C:\\Temp\\LoadFromCSV.xlsx");
LoadCSV은 구분된 텍스트를 대량으로 분석하므로 다른 두 접근 방식을 선도합니다.

결론
IronXL을 사용하여 대량의 데이터셋에서 최고의 성능을 얻으려면:
- CSV 사용: 소스가 이미 평면인 경우 원시 데이터 가져오기에 대한 가장 빠른 경로입니다.
DataTable사용: 데이터가 이미 구조화된 메모리에 있을 때 이상적입니다.- 셀별 작성 피하기: 셀별 논리나 스타일링이 필요할 때만 사용하세요.
세 가지 모두 동일한 파일 크기를 생성합니다. 파일 생성 시간이 크게 달라지는 것은 로딩 방법입니다.

커티스 차우는 칼턴 대학교에서 컴퓨터 과학 학사 학위를 취득했으며, Node.js, TypeScript, JavaScript, React를 전문으로 하는 프론트엔드 개발자입니다. 직관적이고 미적으로 뛰어난 사용자 인터페이스를 만드는 데 열정을 가진 그는 최신 프레임워크를 활용하고, 잘 구성되고 시각적으로 매력적인 매뉴얼을 제작하는 것을 즐깁니다.