>백엔드 개발 >C++ >C# 또는 VB.NET에서 Excel 시트를 DataTable로 효율적으로 읽으려면 어떻게 해야 합니까?

C# 또는 VB.NET에서 Excel 시트를 DataTable로 효율적으로 읽으려면 어떻게 해야 합니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-31 21:50:17702검색

How can I efficiently read Excel sheets into a DataTable in C# or VB.NET?

Excel 시트를 DataTable로 읽기: 성능 및 효율성 최적화

Excel 데이터를 빠르고 효율적으로 DataTable로 가져오는 일반적인 과제에 직면하셨습니다. Microsoft Excel 드라이버를 사용하는 현재 VB 솔루션은 실행 가능한 접근 방식이지만 향상된 기능을 제공할 수 있는 몇 가지 대체 방법을 살펴보겠습니다.

C# 구현

C#을 선호하는 경우 Ciarán에서 채택한 코드 조각이 있습니다. Walsh의 답변:

string sSheetName = null;
string sConnection = null;
DataTable dtTablesList = default(DataTable);
OleDbCommand oleExcelCommand = default(OleDbCommand);
OleDbDataReader oleExcelReader = default(OleDbDataReader);
OleDbConnection oleExcelConnection = default(OleDbConnection);

sConnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Test.xls;Extended Properties=\"Excel 12.0;HDR=No;IMEX=1\"";

oleExcelConnection = new OleDbConnection(sConnection);
oleExcelConnection.Open();

dtTablesList = oleExcelConnection.GetSchema("Tables");

if (dtTablesList.Rows.Count > 0)
{
    sSheetName = dtTablesList.Rows[0]["TABLE_NAME"].ToString();
}

dtTablesList.Clear();
dtTablesList.Dispose();


if (!string.IsNullOrEmpty(sSheetName))
{
    oleExcelCommand = oleExcelConnection.CreateCommand();
    oleExcelCommand.CommandText = "Select * From [" + sSheetName + "]";
    oleExcelCommand.CommandType = CommandType.Text;
    oleExcelReader = oleExcelCommand.ExecuteReader();
    nOutputRow = 0;

    while (oleExcelReader.Read())
    {
    }
    oleExcelReader.Close();
}
oleExcelConnection.Close();

대안 효율성

.NET용 관리형 Excel 라이브러리와 최신 Excel 파일 형식 지원을 모두 제공하는 NPOI 라이브러리 사용을 고려해 보세요. NPOI는 ODBC 드라이버를 사용할 때보다 향상된 속도를 제공할 수 있습니다.

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;

public static DataTable ReadExcelSheet(string filePath, string sheetName)
{
    var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
    var workbook = new HSSFWorkbook(stream);
    var sheet = workbook.GetSheet(sheetName);
    var table = new DataTable();

    var firstRow = sheet.GetRow(0);
    for (int i = 0; i < firstRow.Cells.Count; i++)
    {
        table.Columns.Add(firstRow.Cells[i].ToString());
    }

    for (int i = 1; i <= sheet.LastRowNum; i++)
    {
        var row = sheet.GetRow(i);
        var dataRow = table.NewRow();
        for (int j = 0; j < row.Cells.Count; j++)
        {
            dataRow[j] = row.Cells[j].ToString();
        }
        table.Rows.Add(dataRow);
    }

    return table;
}

객체 폐기

객체 폐기에 대한 질문에 대해서는 명시적으로 Dispose()를 호출하거나 변수를 설정할 필요가 없습니다. using 블록이 종료되면 개체가 자동으로 삭제되기 때문에 VB 코드에서 Nothing으로 설정됩니다. 그러나 적절한 리소스 관리를 보장하려면 일반적으로 개체를 명시적으로 삭제하는 것이 좋습니다.

빠른 읽기를 위한 CSV 변환

속도가 중요한 요소인 경우 Excel 파일을 CSV 파일로 변환하는 것이 좋습니다. (.csv)을 DataTable로 가져오기 전에. CSV 파일은 간단한 구조의 일반 텍스트 파일로 읽기 속도를 크게 향상시킬 수 있습니다. TextFieldParser 클래스를 사용하면 CSV 파일을 효율적으로 읽을 수 있습니다.

public static DataTable GetDataTableFromCSVFile(string csv_file_path)
{
    var csvData = new DataTable();
    using (var csvReader = new TextFieldParser(csv_file_path))
    {
        csvReader.SetDelimiters(new string[] { "," });
        csvReader.HasFieldsEnclosedInQuotes = true;

        var colFields = csvReader.ReadFields();
        foreach (var column in colFields)
        {
            var dataColumn = new DataColumn(column);
            dataColumn.AllowDBNull = true;
            csvData.Columns.Add(dataColumn);
        }

        while (!csvReader.EndOfData)
        {
            var fieldData = csvReader.ReadFields();
            //Making empty value as null
            for (int i = 0; i < fieldData.Length; i++)
            {
                if (fieldData[i] == string.Empty)
                {
                    fieldData[i] = null;
                }
            }
            csvData.Rows.Add(fieldData);
        }
    }
    return csvData;
}

위 내용은 C# 또는 VB.NET에서 Excel 시트를 DataTable로 효율적으로 읽으려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.