.net - قم بإنشاء ملف Excel(.XLS و.XLSX)من C#




file-io (25)

إليك طريقة لتنفيذ ذلك باستخدام LINQ to XML ، مع إكمال نموذج التعليمة البرمجية:

بسرعة استيراد وتصدير بيانات Excel مع LINQ إلى XML

إنها معقدة بعض الشيء ، حيث يجب عليك استيراد مساحات الأسماء وما إلى ذلك ، ولكنها تتيح لك تجنب أي تبعيات خارجية.

(أيضا ، بالطبع ، فإنه VB .NET ، وليس C # ، ولكن يمكنك دائما عزل الأشياء VB .NET في مشروعها الخاص لاستخدام XML Literals ، وتفعل كل شيء آخر في C #.)

كيف يمكنني إنشاء جدول بيانات Excel باستخدام C # دون الحاجة إلى تثبيت برنامج Excel على الجهاز الذي يشغل الرمز؟


IKVM + POI

أو ، يمكنك استخدام Interop ...


قد ترغب في إلقاء نظرة على http://www.gemboxsoftware.com/GBSpreadsheetFree.htm .

لديهم نسخة مجانية مع جميع الميزات ولكن تقتصر على 150 صف لكل ورقة و 5 أوراق لكل مصنف ، إذا كان ذلك يقع ضمن احتياجاتك.

لم أكن بحاجة إلى استخدامه بنفسي بعد ، ولكن يبدو مثيرًا للاهتمام.



الحل التجاري ، SpreadsheetGear for .NET سيفعل ذلك.

يمكنك مشاهدة نماذج ASP.NET المباشرة (C # و VB) here وتنزيل نسخة تقييم here .

إخلاء المسؤولية: أنا أملك SpreadsheetGear LLC


بعض الخيارات التي استخدمتها:

إذا كان XLSX أمرًا ExcelPackage : يعد ExcelPackage بداية جيدة ولكنه توفي عندما يتوقف المطور عن العمل. ExML التقطت من هناك وإضافة بعض الميزات. ExML ليس خيارًا سيئًا ، ما زلت ExML في بضعة مواقع إنتاج.

بالنسبة إلى جميع NPOI الجديدة ، على الرغم من ذلك ، فأنا أستخدم NPOI ، وهو منفذ .NET لـ Apache POI . يدعم NPOI 2.0 (Alpha) أيضًا XLSX.



Syncfusion Essential XlsIO يمكن القيام بذلك. لا تعتمد على Microsoft Office ولديها أيضًا دعمًا محددًا للأنظمة الأساسية المختلفة.

نموذج الكود:

//Creates a new instance for ExcelEngine.
ExcelEngine excelEngine = new ExcelEngine();
//Loads or open an existing workbook through Open method of IWorkbooks
IWorkbook workbook = excelEngine.Excel.Workbooks.Open(fileName);
//To-Do some manipulation|
//To-Do some manipulation
//Set the version of the workbook.
workbook.Version = ExcelVersion.Excel2013;
//Save the workbook in file system as xlsx format
workbook.SaveAs(outputFileName);

تتوفر مجموعة عناصر التحكم بأكملها مجانًا من خلال برنامج ترخيص المنتدى إذا كنت مؤهلاً (أقل من مليون دولار أمريكي من الأرباح). ملاحظة: أنا أعمل من أجل Syncfusion.


أوافق على إنشاء جداول بيانات XML ، وإليك مثالاً حول كيفية القيام بذلك لـ C # 3 (الجميع فقط المدونات حول هذا الموضوع في VB 9: P) http://www.aaron-powell.com/linq-to-xml-to-excel




تعمل مكتبات Office 2003 XML المتنوعة بشكل جيد لملفات excel الأصغر. ومع ذلك ، أجد الحجم الهائل لمصنف كبير تم حفظه بتنسيق XML ليكون مشكلة. على سبيل المثال ، يصبح المصنف الذي أعمل معه 40 ميغابايت في صيغة XLSX الجديدة (والمعبأة بشكل أكثر إحكامًا) ملفًا بتنسيق XML بحجم 360 ميغابايت.

وبقدر ما أخذني بحثي ، توجد حزمتان تجاريتان تسمحان بإخراج تنسيقات الملفات الثنائية القديمة. هم انهم:

لا هي رخيصة (500USD و 800USD على التوالي ، على ما أظن). لكن كلاهما يعمل بشكل مستقل عن برنامج Excel نفسه.

ما أود أن أشعر بالفضول بشأنه هو وحدة إخراج Excel لأمثال OpenOffice.org. أتساءل عما إذا كان يمكن نقلها من جافا إلى .Net.


إذا كنت سعيدًا باستخدام تنسيق xlsx ، فجرّب مشروع GitHub codeplex . EPPlus . بدأت مع المصدر من ExcelPackage ، ولكن اليوم هو إعادة كتابة كاملة. يدعم النطاقات ، وتصميم الخلايا ، والرسوم البيانية ، والأشكال ، والصور ، و namesranges ، و autofilter والكثير من الأشياء الأخرى.


وماذا عن استخدام Open XML SDK 2.0 لـ Microsoft Office؟

بعض الفوائد:

  • لا يتطلب تثبيت Office
  • الذي أدلى به مايكروسوفت = وثائق MSDN لائقة
  • واحد فقط. dll لاستخدامه في المشروع
  • SDK يأتي مع العديد من الأدوات مثل فرق ، المدقق ، وما إلى ذلك

الروابط:


قد ترغب بالفعل في التحقق من دروس التشغيل المتداخل . أنت تقول لا OLE (وهذا ليس كذلك) ، ولكن الطبقات التفاعلية سهلة الاستخدام للغاية.

قد يعجبك إذا لم تجربها.

يرجى أن يكون حذر من stance مايكروسوفت على هذا:

لا توصي Microsoft حاليًا ولا تدعم تطبيقات التنفيذ التلقائي لـ Microsoft Office من أي تطبيق أو تطبيق عميل غير مراقب وغير تفاعلي (بما في ذلك ASP و ASP.NET و DCOM و NT Services) ، لأن Office قد يحمل سلوكًا غير مستقر و / أو حالة توقف تام عند تشغيل Office في هذه البيئة.


يوفر بعض موردي مكونات الجهات الخارجية مثل Infragistics أو Syncfusion إمكانات تصدير Excel جيدة جدًا لا تتطلب تثبيت Microsoft Excel.

ونظرًا لأن هؤلاء الموردين يوفرون أيضًا مكونات متطورة لشبكة UI ، فإن هذه المكونات مفيدة بشكل خاص إذا كنت ترغب في تقليد نمط وتخطيط تصدير excel لتقليد الحالة الحالية للشبكة في واجهة المستخدم الخاصة بالتطبيق.

إذا كان الغرض من التصدير هو تنفيذ جانب الخادم مع التركيز على البيانات المراد تصديرها وبدون رابط إلى واجهة المستخدم ، عندها سأذهب إلى أحد الخيارات المجانية المفتوحة المصدر (مثل ExcelLibrary).

لقد سبق لي أن شاركت في المشاريع التي حاولت استخدام أتمتة جانب الخادم في مجموعة Microsoft Office. وبناء على هذه التجربة ، أوصي بشدة بعدم اتباع هذا النهج.


إن أبسط وأسرع طريقة لإنشاء ملف Excel من C # هو استخدام أداة Open XML Productivity Tool. تأتي أداة الإنتاجية Open XML مع تثبيت Open XML SDK. أداة عكس المهندسين أي ملف Excel إلى رمز C #. ثم يمكن استخدام رمز C # لإعادة إنشاء هذا الملف.

نظرة عامة على العملية المعنية هي:

  1. قم بتثبيت Open XML SDK باستخدام الأداة.
  2. قم بإنشاء ملف Excel باستخدام أحدث إصدار من برنامج Excel بالمظهر المطلوب. DesiredLook.xlsx .
  3. باستخدام الأداة ، افتح DesiredLook.xlsx وانقر على زر Reflect Code بالقرب من الجزء العلوي.
  4. سيتم إنشاء رمز C # لملفك في الجزء الأيسر من الأداة. أضف هذا إلى حل C # الخاص بك وقم بتوليد الملفات بتلك النظرة المرغوبة.

كمكافأة ، يعمل هذا الأسلوب لأي ملفات Word و PowerPoint. باعتبارك مطور C # ، ستقوم بإجراء تغييرات على الشفرة لتناسب احتياجاتك.

لقد قمت بتطوير تطبيق WPF بسيط على github الذي سيعمل على Windows لهذا الغرض. هناك فئة عنصر نائب تسمى GeneratedClass حيث يمكنك لصق التعليمة البرمجية التي تم إنشاؤها. إذا رجعت إلى إصدار واحد من الملف ، فستقوم بإنشاء ملف excel مثل:


OpenXML هو أيضًا بديل جيد يساعد على تجنب تثبيت MS Excel على Server.The Open XML SDK 2.0 الذي توفره Microsoft يبسط مهمة معالجة حزم XML المفتوحة وعناصر مخطط XML المفتوحة الأساسية داخل الحزمة. تلزم واجهة برمجة تطبيقات XML المفتوحة (API) العديد من المهام الشائعة التي يقوم بها المطورون على حزم Open XML.

تحقق من ذلك من OpenXML: البديل الذي يساعد على تجنب تثبيت MS Excel على الخادم


إذا كنت تقوم بإنشاء ملفات Excel 2007/2010 ، فقم بتجربة هذا المشروع المفتوح المصدر: http://closedxml.codeplex.com

ويوفر طريقة موجهة للكائنات لمعالجة الملفات (على غرار VBA) دون التعامل مع متاعب مستندات XML. يمكن استخدامه بواسطة أي لغة .NET مثل C # و Visual Basic (VB).

يتيح لك ClosedXML إنشاء ملفات Excel 2007/2010 بدون تطبيق Excel. المثال النموذجي هو إنشاء تقارير Excel على خادم ويب:

var workbook = new XLWorkbook();
var worksheet = workbook.Worksheets.Add("Sample Sheet");
worksheet.Cell("A1").Value = "Hello World!";
workbook.SaveAs("HelloWorld.xlsx");

حسنا،

يمكنك أيضًا استخدام مكتبة طرف ثالث مثل Aspose .

هذه المكتبة لها ميزة أنها لا تتطلب تثبيت برنامج Excel على جهازك والذي سيكون مثاليًا في حالتك.



يمكنك إنشاء ملفات Excel منسقة بشكل جيد باستخدام هذه المكتبة: http://officehelper.codeplex.com/documentation
انظر أدناه عينة:

using (ExcelHelper helper = new ExcelHelper(TEMPLATE_FILE_NAME, GENERATED_FILE_NAME))
{
    helper.Direction = ExcelHelper.DirectionType.TOP_TO_DOWN;
    helper.CurrentSheetName = "Sheet1";
    helper.CurrentPosition = new CellRef("C3");

    //the template xlsx should contains the named range "header"; use the command "insert"/"name".
    helper.InsertRange("header");

    //the template xlsx should contains the named range "sample1";
    //inside this range you should have cells with these values:
    //<name> , <value> and <comment>, which will be replaced by the values from the getSample()
    CellRangeTemplate sample1 = helper.CreateCellRangeTemplate("sample1", new List<string> {"name", "value", "comment"}); 
    helper.InsertRange(sample1, getSample());

    //you could use here other named ranges to insert new cells and call InsertRange as many times you want, 
    //it will be copied one after another;
    //even you can change direction or the current cell/sheet before you insert

    //typically you put all your "template ranges" (the names) on the same sheet and then you just delete it
    helper.DeleteSheet("Sheet3");
}        

حيث تبدو العينة على النحو التالي:

private IEnumerable<List<object>> getSample()
{
    var random = new Random();

    for (int loop = 0; loop < 3000; loop++)
    {
        yield return new List<object> {"test", DateTime.Now.AddDays(random.NextDouble()*100 - 50), loop};
    }
}

إليك مكتبة C # مجانية تمامًا ، والتي تتيح لك التصدير من DataSet أو DataTable أو List<> إلى ملف Excel 2007 .xlsx أصلي ، باستخدام مكتبات OpenXML:

http://mikesknowledgebase.com/pages/CSharp/ExportToExcel.htm

يتم توفير شفرة المصدر كاملة - مجانا - جنبا إلى جنب مع التعليمات ، وتطبيق التجريبي.

بعد إضافة هذه الفئة إلى التطبيق الخاص بك ، يمكنك تصدير DataSet إلى Excel في سطر واحد من التعليمات البرمجية:

CreateExcelFile.CreateExcelDocument(myDataSet, "C:\\Sample.xlsx");

لا تحصل على أبسط من ذلك بكثير ...

ولا تتطلب حتى وجود Excel على خادمك.


يمكنك استخدام مكتبة تسمى ExcelLibrary. إنها مكتبة مجانية مفتوحة المصدر تم نشرها على Google Code:

ExcelLibrary

يبدو أن هذا هو منفذ PHP ExcelWriter الذي ذكرته أعلاه. لن يكتب إلى تنسيق .xlsx الجديد بعد ، لكنهم يعملون على إضافة تلك الوظيفة في.

انها بسيطة جدا وصغيرة وسهل الاستخدام. بالإضافة إلى أنه يحتوي على DataSetHelper يتيح لك استخدام DataSets و DataTables للعمل مع بيانات Excel بسهولة.

يبدو أن ExcelLibrary يعمل فقط مع تنسيق Excel الأقدم (ملفات .xls) ، ولكن قد يكون إضافة دعم في المستقبل لتنسيقات 2007/2010 الأحدث.

يمكنك أيضًا استخدام EPPlus ، الذي يعمل فقط مع ملفات تنسيق Excel 2007/2010 (ملفات .xlsx).

هناك بعض الأخطاء المعروفة مع كل مكتبة كما هو مذكور في التعليقات. وبشكل عام ، يبدو أن EPPlus هو الخيار الأفضل مع مرور الوقت. يبدو أن يتم تحديثها وتوثيقها بشكل أكثر فاعلية.

أيضًا ، كما هو موضح بواسطة @ АртёмЦарионов أدناه ، يدعم EPPlus جداول Pivot وقد تحتوي ExcelLibrary على بعض الدعم ( مشكلة في Pivot table في ExcelLibrary )

في ما يلي رابطان للرجوع إليها بسرعة:
ExcelLibrary - GNU Lesser GPL
EPPlus - رخصة جنو العمومية الصغرى (LGPL)

هنا بعض كود المثال لبرنامج ExcelLibrary:

هنا مثال أخذ البيانات من قاعدة بيانات وإنشاء مصنف منه. لاحظ أن التعليمة البرمجية ExcelLibrary هي سطر واحد في الأسفل:

//Create the data set and table
DataSet ds = new DataSet("New_DataSet");
DataTable dt = new DataTable("New_DataTable");

//Set the locale for each
ds.Locale = System.Threading.Thread.CurrentThread.CurrentCulture;
dt.Locale = System.Threading.Thread.CurrentThread.CurrentCulture;

//Open a DB connection (in this example with OleDB)
OleDbConnection con = new OleDbConnection(dbConnectionString);
con.Open();

//Create a query and fill the data table with the data from the DB
string sql = "SELECT Whatever FROM MyDBTable;";
OleDbCommand cmd = new OleDbCommand(sql, con);
OleDbDataAdapter adptr = new OleDbDataAdapter();

adptr.SelectCommand = cmd;
adptr.Fill(dt);
con.Close();

//Add the table to the data set
ds.Tables.Add(dt);

//Here's the easy part. Create the Excel worksheet from the data set
ExcelLibrary.DataSetHelper.CreateWorkbook("MyExcelFile.xls", ds);

إن إنشاء ملف Excel سهل للغاية. يمكنك أيضًا إنشاء ملفات Excel يدويًا ، ولكن الوظيفة السابقة هي ما أعجبني حقًا.


إجابة جديدة بعد 6 سنوات و 5 أشهر (التسويف).

في حين stringأن الكلمة الرئيسية C # المحجوزة دائمًا ما يكون لها معنى ثابت ، Stringفهي مجرد مُعرّف عادي يمكن أن يشير إلى أي شيء. استنادًا إلى أعضاء النوع الحالي ، قد تكون مساحة الاسم الحالية usingوالتوجيهات المطبقة وموضعها Stringقيمة أو نوعًا مختلفًا عن global::System.String.

سأقدم مثالين usingلن تساعدهما التوجيهات .

أولاً ، عندما Stringتكون قيمة النوع الحالي (أو متغير محلي):

class MySequence<TElement>
{
  public IEnumerable<TElement> String { get; set; }

  void Example()
  {
    var test = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
  }
}

لن يتم ترجمة ما سبق لأنه IEnumerable<>لا يحتوي على عضو غير ثابت يسمى Format، ولا توجد طرق تمديد مطبقة. في الحالة المذكورة أعلاه ، قد يكون من الممكن استخدامها Stringفي سياقات أخرى حيث يكون النوع هو الاحتمال الوحيد في بناء الجملة. على سبيل المثال String local = "Hi mum!";يمكن أن يكون موافق (اعتمادا على مساحة الاسم usingوالتوجيهات).

الأسوأ من ذلك: من String.Concat(someSequence)المحتمل أن يكون النطق (حسب usings) هو الذهاب إلى طريقة تمديد Linq Enumerable.Concat. لن تذهب إلى الأسلوب الساكن string.Concat.

ثانيًا ، عندما Stringيكون نوع آخر متداخلًا داخل النوع الحالي:

class MyPiano
{
  protected class String
  {
  }

  void Example()
  {
    var test1 = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
    String test2 = "Goodbye";
  }
}

لا البيان في Exampleالطريقة compile. هنا Stringهو دائما البيانو string ، MyPiano.String. لا يوجد عضو ( staticأو لا) Formatموجود عليه (أو موروث من فئته الأساسية). ولا "Goodbye"يمكن تحويل القيمة إليه.







c# .net excel file-io