문제

Excel 파일에서 데이터를 가져 오기 위해 가져 오기 기능을 작성하려고합니다. 내가 현재하는 방법은 다음과 같습니다.

Private Sub ReadExcel(ByVal childform As PhoneDiag.frmData, ByVal FileName As String)

        Dim xlApp As Excel.Application
        Dim xlWorkBook As Excel.Workbook
        Dim xlWorkSheet As Excel.Worksheet

        xlApp = New Excel.ApplicationClass
        xlWorkBook = xlApp.Workbooks.Open(FileName)
        xlWorkSheet = xlWorkBook.Worksheets(1)
        Dim columnrange = xlWorkSheet.Columns
        Dim therange = xlWorkSheet.UsedRange

        ''Add rows by column
        For rCnt = 2 To therange.Rows.Count

            Dim rowArray(therange.Columns.Count) As String

            For cCnt = 1 To therange.Columns.Count

                Dim Obj = CType(therange.Cells(rCnt, cCnt), Excel.Range)
                Dim celltext As String
                celltext = Obj.Value.ToString
                rowArray((cCnt - 1)) = celltext

            Next

            childform.datagridSample.Rows.Add(rowArray)

        Next

        '' make sure we close the excel.exe service after use
        xlWorkBook.Close()
        xlApp.Quit()
        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkBook)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkSheet)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)

    End Sub

물론 문제는 그것이 끔찍하게 실행된다는 것입니다. 내가 수집 할 수있는 것에서, 그것은 아마도이 줄로 내려 질 것입니다.

Dim Obj = CType(therange.Cells(rCnt, cCnt), Excel.Range)

내가 필요한 것은 셀의 텍스트뿐만 아니라 각 셀에 대한 객체를 만들지 않는 것입니다 (그리고 쓰레기 수집으로 보내지 마십시오). 텍스트를 얻는 더 쉬운 방법이 있습니까?

다른 성능 팁이 보이면 알려주세요. 그것은 대단히 감사 할 것입니다. = b

편집 : 또한 모든 데이터를 보유하기 위해 마스터 배열 (Marr)을 만들려면 두 가지 옵션이 있다는 것을 알고 있습니다. Marr이 크고 서브 어레이가 작거나 Marr가 작아지고 서브 어레이가 더 많은 정보를 보유하는 것이 더 나은 성능이 좋을까요?

가져올 파일이 열보다 더 많은 행을 가질 것이기 때문에 "세트"방법이 있는지 궁금합니다.

도움이 되었습니까?

해결책

셀 콘텐츠를 개별적으로 읽는 것은 큰 성능 킬러입니다. 저의 조언은 먼저 전체 범위를 객체 배열로 읽은 다음 해당 배열에서 데이터를 검색하는 것입니다. 나는 vb.net으로 쓰지 않지만 C#에서 코드는 다음과 같습니다.

Excel.Range firstCell = excelWorksheet.get_Range("A1", Type.Missing);
Excel.Range lastCell = excelWorksheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing);
object[,] cellValues;
Excel.Range worksheetCells = excelWorksheet.get_Range(firstCell, lastCell);
cellValues = worksheetCells.Value2 as object[,];

이 예제는 시트의 전체 내용을 셀 값으로 읽습니다 (널에 대해주의). 동일한 조언이 시트에 글을 쓰는 데 적용됩니다. 한 배열로 한 번에 모두하십시오.
관심이 있으시면 이것에 대한 더 긴 게시물이 있습니다. 거기
아, 그리고 btw, 교체

xlApp = New Excel.ApplicationClass

~에 의해

xlApp = New Excel.Application

다른 팁

다음은 C# 버전이 있습니다 (그러나 당신은 데이터를 얻을 수있는 데이터를 얻을 수있는 C# 버전이 있습니다.

con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+SpreadsheetLocation+";Extended Properties=\"Excel 8.0;IMEX=1;HDR=NO\"");
OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM ["+Worksheet+"$]", con);
DataTable dt = new DataTable();
da.Fill(dt);

여기서 "Spreadsheetlocation"및 "Worksheet"은 각각 파일 경로와 작업대 이름입니다. 그런 다음 원하는 경우 데이터 가능한 행을 배열로 변환 할 수 있습니다.

업데이트 :이 솔루션을 위해 기계에 Excel을 설치할 필요가 없습니다 ...

간단한 독서를 위해 나는 그것을 사용할 것이다 Excel 데이터 리더 CodePlex에서 사용할 수 있습니다.

구성 요소를 사용하는 기계는 Excel을 설치할 필요가 없으며 사용하기 쉽습니다. 워크 시트를 데이터 세트에 읽을 수 있습니다.

.NET 용 SpreadShsetGear 통합 문서를 열고 셀의 원시 값 (숫자, 텍스트, 논리 또는 오류)에 액세스하거나 셀의 형식 텍스트를 얻을 수 있습니다. 스프레드 시트 기어는 Excel과 마찬가지로 COM Interop 대신 응용 프로그램의 일부로 실행되므로 훨씬 빠르게 실행됩니다 (주석 참조. 이 페이지 일부 고객이 성능에 대해 말한 내용을 확인합니다).

라이브 샘플을 볼 수 있습니다 여기 무료 평가판을 다운로드하십시오 여기.

면책 조항 : 스프레드 시트 기어 LLC를 소유하고 있습니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top