문제

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 접근 방식은 빠르고 쉽지만 특히 DataType이 처리되는 방식과 관련하여 알아야 할 몇 가지 단점이 있습니다.

이 훌륭한 기사는 몇 가지 일반적인 함정을 피하는 데 도움이 될 것입니다.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;
        }
    }
}

쿠그라 Excel 파일을 읽고 쓰는 C#으로 작성된 오픈 소스 구성 요소입니다.

OpenXML 형식(예:xlsx) 저는 OpenXML SDK(http://msdn.microsoft.com/en-us/library/bb448854.aspx)

저는 얼마 전에 C#으로 Excel 파일을 많이 읽었으며 다음과 같은 두 가지 접근 방식을 사용했습니다.

  • Excel의 개체에 직접 액세스하고 메서드와 속성을 통해 이를 조작하는 COM API
  • Excel을 데이터베이스처럼 사용할 수 있게 해주는 ODBC 드라이버입니다.

후자의 접근 방식은 많이 더 빠르게:20개의 열과 200개의 줄이 있는 큰 테이블을 읽는 데는 COM을 통해 30초가 걸리고 ODBC를 통해 0.5초가 걸립니다.따라서 필요한 것이 데이터뿐이라면 데이터베이스 접근 방식을 권장합니다.

건배,

ExcelMapper는 오픈 소스 도구입니다(http://code.google.com/p/excelmapper/)은 Excel 워크시트를 강력한 형식의 개체로 읽는 데 사용할 수 있습니다.xls 및 xlsx 형식을 모두 지원합니다.

.NET을 사용하여 xls/xlsx 파일을 읽는 간단한 방법을 보여주고 싶습니다.다음 내용이 귀하에게 도움이 되기를 바랍니다.

 private DataTable ReadExcelToTable(string path)    
 {

     //Connection String

     string connstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=NO;IMEX=1';";  
     //the same name 
     //string connstring = Provider=Microsoft.JET.OLEDB.4.0;Data Source=" + path + //";Extended Properties='Excel 8.0;HDR=NO;IMEX=1';"; 

     using(OleDbConnection conn = new OleDbConnection(connstring))
     {
        conn.Open();
        //Get All Sheets Name
        DataTable sheetsName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,new object[]{null,null,null,"Table"});  

        //Get the First Sheet Name
        string firstSheetName = sheetsName.Rows[0][2].ToString(); 

        //Query String 
        string sql = string.Format("SELECT * FROM [{0}]",firstSheetName); 
        OleDbDataAdapter ada =new OleDbDataAdapter(sql,connstring);
        DataSet set = new DataSet();
        ada.Fill(set);
        return set.Tables[0];   
   }
 }

코드는 다음 기사에서 가져온 것입니다. http://www.c-sharpcorner.com/uploadfile/d2dcfc/read-excel-file-with-net/.그것으로부터 더 자세한 내용을 얻을 수 있습니다.

무료는 아니지만 최신 Office에는 매우 훌륭한 자동화 .Net API.(오랫동안 API가 있었지만 COM은 지저분했습니다.) Office 앱이 숨겨진 백그라운드 프로세스로 남아 있는 동안 코드에서 원하는/필요한 모든 작업을 수행할 수 있습니다.

제가 이곳에 있지 않다면 용서해 주세요. 하지만 이것이 바로 이것이 아닌가요? 오피스 PIA 위해?

최근에는 LINQ를 좀 더 잘하기 위해....저는 Excel의 자동화 API를 사용하여 파일을 XML 스프레드시트로 저장한 다음 LINQ to XML을 사용하여 해당 파일을 처리했습니다.

.NET용 SpreadsheetGear .NET용 Excel 호환 스프레드시트 구성 요소입니다.당사 홈페이지 오른쪽에서 고객이 성과에 대해 말하는 내용을 확인할 수 있습니다. 제품 페이지.무료로 제공되는 모든 기능을 직접 사용해 볼 수 있습니다. 평가.

스마트XLS Excel 차트, 공식 엔진의 대부분의 기능을 지원하고 excel2007 openxml 형식을 읽고 쓸 수 있는 또 다른 Excel 스프레드시트 구성 요소입니다.

.NET 구성 요소 Excel Reader .NET이 귀하의 요구 사항을 충족할 수 있습니다.XLSX 및 XLS 파일을 읽는 데 충분합니다.그러니 다음에서 시도해 보세요:

http://www.devtriogroup.com/ExcelReader

EXCEL, 고정 길이 또는 파일, 문자열 또는 스트림의 구분된 레코드 등에서 데이터를 가져오거나 내보내는 데 사용하기 쉬운 무료 .NET 라이브러리인 FileHelpers Library를 추천합니다.

Excel 데이터 링크 문서 섹션 http://filehelpers.sourceforge.net/example_exceldatalink.html

Excel을 훨씬 더 깔끔하게 처리할 수 있는 이 오픈 소스 솔루션을 사용해 볼 수 있습니다.

http://excelwrapperdotnet.codeplex.com/

SpreadsheetGear는 정말 훌륭합니다.예, 비용이 많이 들지만 다른 솔루션을 조작하는 것과 비교하면 그만한 가치가 있습니다.빠르고 안정적이며 매우 포괄적입니다. 1년 반 넘게 소프트웨어 업무에 이 제품을 사용한 후 이 제품의 고객 지원이 환상적이라고 말하고 싶습니다!

우리가 사용한 솔루션은 다음을 수행해야 했습니다.

  • 허용하다 읽기 쓰기 Excel에서 생성된 파일
  • BE 빠른 성능면에서 (COM을 사용하는 것과 다름)
  • MS오피스가 되어보세요 독립적인 (MS Office가 설치된 클라이언트 없이도 사용할 수 있어야 함)
  • BE 무료 또는 오픈 소스 (그러나 적극적으로 개발 중)

여러 가지 선택이 있지만 우리가 찾은 것은 NPoi (오래 전부터 존재했던 Java의 .NET 포트 포이 오픈 소스 프로젝트)가 최고가 되려면:http://npoi.codeplex.com/

또한 .doc 및 .ppt 파일 형식으로 작업할 수도 있습니다.

단지 표 형식의 데이터인 경우.다운로드할 수 있는 Marcos Melli의 파일 데이터 도우미를 추천합니다. 여기.

파티에 늦었지만 나는 팬이야 LinqToExcel

주어진 Excel 스프레드시트를 로드하고 이를 수동으로 수행하는 대신 csv로 저장하는 Excel 스프레드시트를 작성할 수 있습니다.

그런 다음 C#에서 자동화할 수 있습니다.

csv에 저장되면 C# 프로그램이 이를 이해할 수 있습니다.

(그리고 누군가 엑셀로 프로그래밍하라고 하면 모르는 척 하는 것이 가장 좋습니다.)

(편집하다:아 네, 롭과 라이언 둘 다 맞습니다)

나는 사람들이 이 목적을 위해 Excel "확장"을 만들어 왔다는 것을 알고 있습니다.
Excel에서 "프로그램 X로 내보내기"라는 버튼을 만든 다음 프로그램이 읽을 수 있는 형식으로 데이터를 내보내고 보냅니다.

http://msdn.microsoft.com/en-us/library/ms186213.aspx 시작하기 좋은 곳이어야합니다.

행운을 빌어요

일부 Excel 파일을 관리해야 하는 빠른 데모 프로젝트를 수행했습니다.GemBox 소프트웨어의 .NET 구성 요소는 내 요구 사항에 적합했습니다.몇 가지 제한 사항이 있는 무료 버전이 있습니다.

http://www.gemboxsoftware.com/GBSpreadsheet.htm

엑셀 패키지 Excel 2007 파일을 읽고 쓰기 위한 오픈 소스(GPL) 구성 요소입니다.소규모 프로젝트에서 사용했는데 API가 간단합니다.XLS가 아닌 XLSX(Excel 200&)에서만 작동합니다.

소스 코드도 잘 정리되어 있고 쉽게 탐색할 수 있는 것 같습니다(저처럼 기능을 확장하거나 사소한 문제를 수정해야 하는 경우).

처음에는 ADO.Net(Excel 연결 문자열) 접근 방식을 시도했지만 불쾌한 해킹으로 가득 차 있었습니다. 두번째 행에 숫자가 포함되어 있으면 아래 열의 모든 필드에 대해 int를 반환하고 맞지 않는 데이터는 조용히 삭제합니다.

우리는 사용 닫힘XML 다소 큰 시스템에서.

  • 무료
  • 설치가 용이함
  • 간단한 코딩
  • 매우 반응형 지원
  • 개발자팀은 극도로 새로운 제안에 열려있습니다.종종 새로운 기능과 버그 수정이 같은 주 내에 구현됩니다.

Take.io 스프레드시트가 이 작업을 무료로 수행해 드립니다.그냥보세요 이것.

방금 사용했어요 엑셀라이브러리 .xls 스프레드시트를 DataSet에 로드합니다.나를 위해 잘 일했습니다.

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