سؤال

هل توجد مكتبة مجانية أو مفتوحة المصدر لقراءة ملفات Excel (.xls) مباشرةً من برنامج C#؟

ليس من الضروري أن تكون خيالية للغاية، فقط قم باختيار ورقة عمل وقراءة البيانات كسلاسل.حتى الآن، كنت أستخدم وظيفة التصدير إلى نص Unicode في 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 سريعًا وسهلاً، ولكن به بعض المراوغات التي يجب أن تكون على دراية بها، خاصة فيما يتعلق بكيفية التعامل مع أنواع البيانات.

ستساعدك هذه المقالة الممتازة على تجنب بعض الأخطاء الشائعة: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.إنه يعمل بشكل جيد للغاية وهو قوي إلى حد ما.

إليك بعض التعليمات البرمجية التي كتبتها في C# باستخدام .NET 1.1 منذ بضع سنوات.لست متأكدًا مما إذا كان هذا هو ما تحتاجه بالضبط (وقد لا يكون أفضل رمز لدي :)).

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;
        }
    }
}

كوجرا هو مكون مفتوح المصدر مكتوب بلغة C# يقرأ ويكتب ملفات Excel.

على الرغم من أنك طلبت على وجه التحديد .xls، مما يشير ضمنًا إلى تنسيقات الملفات الأقدم، لتنسيقات OpenXML (على سبيل المثال.xlsx) أوصي بشدة باستخدام OpenXML SDK (http://msdn.microsoft.com/en-us/library/bb448854.aspx)

لقد قمت بالكثير من القراءة من ملفات Excel في C# منذ فترة، واستخدمنا طريقتين:

  • واجهة برمجة تطبيقات COM، حيث يمكنك الوصول إلى كائنات Excel مباشرةً ومعالجتها من خلال الأساليب والخصائص
  • برنامج تشغيل ODBC الذي يسمح باستخدام Excel مثل قاعدة البيانات.

وكان النهج الأخير كثيراً أسرع:ستستغرق قراءة جدول كبير يحتوي على 20 عمودًا و200 سطر 30 ثانية عبر COM، ونصف ثانية عبر ODBC.لذلك أوصي بنهج قاعدة البيانات إذا كان كل ما تحتاجه هو البيانات.

هتافات،

كارل

ExcelMapper هي أداة مفتوحة المصدر (http://code.google.com/p/excelmapper/) التي يمكن استخدامها لقراءة أوراق عمل Excel ككائنات مكتوبة بقوة.وهو يدعم تنسيقات xls وxlsx.

أريد أن أعرض طريقة بسيطة لقراءة ملف xls/xlsx باستخدام .NET.آمل أن يكون ما يلي مفيدًا لك.

 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.(كانت هناك واجهة برمجة تطبيقات لفترة طويلة ولكنها كانت COM سيئة) يمكنك القيام بكل ما تريده/تحتاجه في التعليمات البرمجية، كل ذلك بينما يظل تطبيق Office عبارة عن عملية خلفية مخفية.

اعذرني إذا كنت خارج القاعدة هنا، ولكن أليس هذا ما مكتب PIA من أجل؟

في الآونة الأخيرة، جزئيًا للتحسن في LINQ....لقد كنت أستخدم واجهة برمجة تطبيقات التشغيل الآلي لـ Excel لحفظ الملف كجدول بيانات XML ثم معالجة هذا الملف باستخدام LINQ إلى XML.

برنامج SpreadsheetGear لـ .NET هو مكون جدول بيانات متوافق مع Excel لـ .NET.يمكنك رؤية ما يقوله عملاؤنا عن الأداء على الجانب الأيمن من موقعنا صفحة المنتج.يمكنك تجربتها بنفسك مع البرنامج المجاني الذي يعمل بكامل طاقته تقييم.

سمارت XLS هو مكون آخر لجداول بيانات Excel يدعم معظم ميزات مخططات Excel ومحركات الصيغ ويمكنه قراءة/كتابة تنسيق openxml في Excel2007.

قد يلبي مكون .NET Excel Reader .NET متطلباتك.إنه جيد بما يكفي لقراءة ملفات XLSX وXLS.لذا جربه من:

http://www.devtriogroup.com/ExcelReader

أوصي بمكتبة FileHelpers وهي مكتبة .NET مجانية وسهلة الاستخدام لاستيراد/تصدير البيانات من EXCEL أو السجلات ذات الطول الثابت أو المحددة في الملفات أو السلاسل أو التدفقات + المزيد.

قسم توثيق ارتباط بيانات Excel http://filehelpers.sourceforge.net/example_exceldatalink.html

يمكنك تجربة استخدام هذا الحل مفتوح المصدر الذي يجعل التعامل مع Excel أكثر نظافة.

http://excelwrapperdotnet.codeplex.com/

SpreadsheetGear رائع.نعم، إنها تكلفة، ولكن بالمقارنة مع التلاعب بهذه الحلول الأخرى، فإن الأمر يستحق التكلفة.إنه سريع وموثوق وشامل للغاية، ويجب أن أقول أنه بعد استخدام هذا المنتج في وظيفتي البرمجية بدوام كامل لأكثر من عام ونصف، فإن دعم العملاء لديهم رائع!

الحل الذي استخدمناه يحتاج إلى:

  • يسمح القراءة/الكتابة من ملفات Excel المنتجة
  • يكون سريع في الأداء (ليس مثل استخدام COM)
  • يكون مايكروسوفت أوفيس مستقل (يجب أن تكون قابلة للاستخدام دون تثبيت برامج MS Office على العملاء)
  • يكون حر أو مفتوح المصدر (لكن تم تطويره بنشاط)

هناك العديد من الخيارات، ولكن وجدنا NPoi (منفذ .NET الخاص بـ Java موجود منذ فترة طويلة بوي مشروع مفتوح المصدر) ليكون الأفضل:http://npoi.codeplex.com/

كما يسمح أيضًا بالعمل مع تنسيقات الملفات ‎.doc و‎.ppt

إذا كانت مجرد بيانات جدولية.أوصي بمساعدي بيانات الملفات من Marcos Melli والتي يمكن تنزيلها هنا.

تأخرت في الحفلة، لكني من المعجبين بها LinqToExcel

يمكنك كتابة جدول بيانات Excel يقوم بتحميل جدول بيانات Excel معين وحفظه كملف CSV (بدلاً من القيام بذلك يدويًا).

ثم يمكنك أتمتة ذلك من C#.

وبمجرد وجوده في ملف CSV، يمكن لبرنامج C# أن يفعل ذلك.

(أيضًا، إذا طلب منك شخص ما البرمجة باستخدام برنامج Excel، فمن الأفضل أن تتظاهر بأنك لا تعرف كيفية القيام بذلك)

(يحرر:آه نعم، روب وريان كلاهما على حق)

أعلم أن الأشخاص قاموا بإنشاء "امتداد" لبرنامج Excel لهذا الغرض.
يمكنك بشكل أو بآخر إنشاء زر في Excel يقول "تصدير إلى البرنامج X"، ثم تصدير البيانات وإرسالها بتنسيق يمكن للبرنامج قراءته.

http://msdn.microsoft.com/en-us/library/ms186213.aspx يجب أن يكون مكانًا جيدًا للبدء.

حظ سعيد

لقد قمت للتو بمشروع تجريبي سريع يتطلب إدارة بعض ملفات Excel.كان مكون .NET من برنامج GemBox مناسبًا لاحتياجاتي.لديه نسخة مجانية مع بعض القيود.

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

حزمة اكسل هو مكون مفتوح المصدر (GPL) لقراءة/كتابة ملفات Excel 2007.لقد استخدمته في مشروع صغير، وواجهة برمجة التطبيقات (API) واضحة ومباشرة.يعمل مع XLSX فقط (Excel 200&)، وليس مع XLS.

يبدو أيضًا أن الكود المصدري منظم جيدًا وسهل التجول فيه (إذا كنت بحاجة إلى توسيع الوظائف أو إصلاح المشكلات البسيطة كما فعلت).

في البداية، جربت أسلوب ADO.Net (سلسلة اتصال Excel)، لكنه كان مليئًا بالاختراقات السيئة - على سبيل المثال إذا ثانية يحتوي الصف على رقم، وسيُرجع عدد صحيحًا لجميع الحقول في العمود أدناه ويسقط أي بيانات غير مناسبة بهدوء.

نحن نستخدم مغلقXML في أنظمة كبيرة إلى حد ما.

  • حر
  • سهل التنصيب
  • الترميز إلى الأمام مباشرة
  • جداً دعم سريع الاستجابة
  • فريق التطوير هو للغاية مفتوحة لاقتراحات جديدة.غالبًا ما يتم تنفيذ الميزات الجديدة وإصلاحات الأخطاء في نفس الأسبوع

Take.io سيقوم جدول البيانات بهذا العمل نيابةً عنك، وبدون مقابل.مجرد إلقاء نظرة على هذا.

لقد استخدمت للتو مكتبة اكسل لتحميل جدول بيانات .xls إلى DataSet.عملت بشكل رائع بالنسبة لي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top