[C#] C #에서 Excel 파일 읽기

C # 프로그램에서 직접 Excel 파일 (.xls)을 읽을 수있는 무료 또는 오픈 소스 라이브러리가 있습니까?

워크 시트를 선택하고 데이터를 문자열로 읽는 것만으로는 너무 화려 할 필요는 없습니다. 지금까지 Excel의 유니 코드로 내보내기 텍스트 기능을 사용하고 결과 (탭으로 구분 된) 파일을 구문 분석했지만 수동 단계를 제거하고 싶습니다.



답변

var fileName = string.Format("{0}\\fileNameHere", Directory.GetCurrentDirectory());
var connectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0; data source={0}; Extended Properties=Excel 8.0;", fileName);

var adapter = new OleDbDataAdapter("SELECT * FROM [workSheetNameHere$]", connectionString);
var ds = new DataSet();

adapter.Fill(ds, "anyNameHere");

DataTable data = ds.Tables["anyNameHere"];

이것이 내가 일반적으로 사용하는 것입니다. 테이블을 편집 할 때 일반적으로 AsEnumerable ()을 고정하기 때문에 약간 다릅니다.

var data = ds.Tables["anyNameHere"].AsEnumerable();

LINQ를 사용하여 필드에서 구조체를 검색하고 빌드 할 수 있습니다.

var query = data.Where(x => x.Field<string>("phoneNumber") != string.Empty).Select(x =>
                new MyContact
                    {
                        firstName= x.Field<string>("First Name"),
                        lastName = x.Field<string>("Last Name"),
                        phoneNumber =x.Field<string>("Phone Number"),
                    });


답변

Excel 파일에 포함 된 단순한 데이터 인 경우 ADO.NET을 통해 데이터를 읽을 수 있습니다. 여기에 나열된 연결 문자열을 참조하십시오.

http://www.connectionstrings.com/?carrier=excel2007
또는
http://www.connectionstrings.com/?carrier=excel

라이언

업데이트 : 그런 다음과 같은 것을 통해 워크 시트를 읽을 수 있습니다 select * from [Sheet1$]


답변

ADO.NET 접근 방식은 쉽고 빠르지 만 특히 DataTypes 처리 방법과 관련하여 알아야 할 몇 가지 단점이 있습니다.

이 훌륭한 기사는 일반적인 함정을 피하는 데 도움이됩니다 :
http://blog.lab49.com/archives/196


답변

이것이 내가 Excel 2003에 사용한 것입니다.

Dictionary<string, string> props = new Dictionary<string, string>();
props["Provider"] = "Microsoft.Jet.OLEDB.4.0";
props["Data Source"] = repFile;
props["Extended Properties"] = "Excel 8.0";

StringBuilder sb = new StringBuilder();
foreach (KeyValuePair<string, string> prop in props)
{
    sb.Append(prop.Key);
    sb.Append('=');
    sb.Append(prop.Value);
    sb.Append(';');
}
string properties = sb.ToString();

using (OleDbConnection conn = new OleDbConnection(properties))
{
    conn.Open();
    DataSet ds = new DataSet();
    string columns = String.Join(",", columnNames.ToArray());
    using (OleDbDataAdapter da = new OleDbDataAdapter(
        "SELECT " + columns + " FROM [" + worksheet + "$]", conn))
    {
        DataTable dt = new DataTable(tableName);
        da.Fill(dt);
        ds.Tables.Add(dt);
    }
}


답변

Excel 데이터 리더는 어떻습니까?

http://exceldatareader.codeplex.com/

프로덕션 환경에서 다양한 Excel 파일에서 SQL Server Compact로 많은 양의 데이터를 가져 오기 위해 분노했습니다. 그것은 잘 작동하고 오히려 강력합니다.


답변

몇 년 전에 .NET 1.1을 사용하여 C #으로 작성한 코드가 있습니다. 이것이 정확히 필요한 것인지 확실하지 않습니다 (최고의 코드가 아닐 수도 있습니다 :).

using System;
using System.Data;
using System.Data.OleDb;

namespace ExportExcelToAccess
{
    /// <summary>
    /// Summary description for ExcelHelper.
    /// </summary>
    public sealed class ExcelHelper
    {
        private const string CONNECTION_STRING = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=<FILENAME>;Extended Properties=\"Excel 8.0;HDR=Yes;\";";

        public static DataTable GetDataTableFromExcelFile(string fullFileName, ref string sheetName)
        {
            OleDbConnection objConnection = new OleDbConnection();
            objConnection = new OleDbConnection(CONNECTION_STRING.Replace("<FILENAME>", fullFileName));
            DataSet dsImport = new DataSet();

            try
            {
                objConnection.Open();

                DataTable dtSchema = objConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

                if( (null == dtSchema) || ( dtSchema.Rows.Count <= 0 ) )
                {
                    //raise exception if needed
                }

                if( (null != sheetName) && (0 != sheetName.Length))
                {
                    if( !CheckIfSheetNameExists(sheetName, dtSchema) )
                    {
                        //raise exception if needed
                    }
                }
                else
                {
                    //Reading the first sheet name from the Excel file.
                    sheetName = dtSchema.Rows[0]["TABLE_NAME"].ToString();
                }

                new OleDbDataAdapter("SELECT * FROM [" + sheetName + "]", objConnection ).Fill(dsImport);
            }
            catch (Exception)
            {
                //raise exception if needed
            }
            finally
            {
                // Clean up.
                if(objConnection != null)
                {
                    objConnection.Close();
                    objConnection.Dispose();
                }
            }


            return dsImport.Tables[0];
            #region Commented code for importing data from CSV file.
            //              string strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +"Data Source=" + System.IO.Path.GetDirectoryName(fullFileName) +";" +"Extended Properties=\"Text;HDR=YES;FMT=Delimited\"";
            //
            //              System.Data.OleDb.OleDbConnection conText = new System.Data.OleDb.OleDbConnection(strConnectionString);
            //              new System.Data.OleDb.OleDbDataAdapter("SELECT * FROM " + System.IO.Path.GetFileName(fullFileName).Replace(".", "#"), conText).Fill(dsImport);
            //              return dsImport.Tables[0];

            #endregion
        }

        /// <summary>
        /// This method checks if the user entered sheetName exists in the Schema Table
        /// </summary>
        /// <param name="sheetName">Sheet name to be verified</param>
        /// <param name="dtSchema">schema table </param>
        private static bool CheckIfSheetNameExists(string sheetName, DataTable dtSchema)
        {
            foreach(DataRow dataRow in dtSchema.Rows)
            {
                if( sheetName == dataRow["TABLE_NAME"].ToString() )
                {
                    return true;
                }
            }
            return false;
        }
    }
}


답변

Koogra 는 C #으로 작성된 오픈 소스 구성 요소로 Excel 파일을 읽고 씁니다.