Excel 문서에서 C#으로 모든 텍스트 데이터를 추출하려고하는데 성능 문제가 있습니다. 다음 코드에서는 통합 문서를 열고 모든 워크 시트를 반복하며 사용 된 범위의 모든 셀을 반복하면서 각 셀의 텍스트를 추출합니다. 문제는 실행하는데 14 초가 걸린다는 것입니다.C# Excel Interop 셀을 반복 할 때 느려짐
public class ExcelFile
{
public string Path = @"C:\test.xlsx";
private Excel.Application xl = new Excel.Application();
private Excel.Workbook WB;
public string FullText;
private Excel.Range rng;
private Dictionary<string, string> Variables;
public ExcelFile()
{
WB = xl.Workbooks.Open(Path);
xl.Visible = true;
foreach (Excel.Worksheet CurrentWS in WB.Worksheets)
{
rng = CurrentWS.UsedRange;
for (int i = 1; i < rng.Count; i++)
{ FullText += rng.Cells[i].Value; }
}
WB.Close(false);
xl.Quit();
}
}
VBA에서 나는 ~ 일초합니다 같은 것을, 할 것입니다 반면 :
Sub run()
Dim strText As String
For Each ws In ActiveWorkbook.Sheets
For Each c In ws.UsedRange
strText = strText & c.Text
Next c
Next ws
End Sub
또는 더 빠르게 (1 초 미만) :
Sub RunFast()
Dim strText As String
Dim varCells As Variant
For Each ws In ActiveWorkbook.Sheets
varCells = ws.UsedRange
For i = 1 To UBound(varCells, 1)
For j = 1 To UBound(varCells, 2)
strText = strText & CStr(varCells(i, j))
Next j
Next i
Next ws
End Sub
아마도 뭔가를 C#의 for 루프에서 일어나는 일입니다. 셀 객체가 아닌 값만 반복 할 수 있도록 배열 유형 객체에 범위를로드 할 수 있습니까 (마지막 예제에서와 같이)?
VBA는 프로세스 내에서 실행되지만 첫 번째 스 니펫은 프로세스 외부에서 실행됩니다. 프로세스 경계를 넘는 것이 느립니다. 배열을 사용하여 EPPlus 또는 ClosedXML과 같은 OpenXML을 기반으로하는 왕복 횟수 또는 진행중인 솔루션을 줄입니다. –
감사합니다 한스 - 궁금한 점이 있다면 왕복을 피하기 위해 배열에 범위를로드하는 방법은 무엇입니까? – pwwolff