it-swarm.asia

كيفية إنشاء ملف Excel (.XLS و .XLSX) في C # دون تثبيت Ms Office؟

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

1727
mistrmark

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

ExcelLibrary

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

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

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

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

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

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

فيما يلي ارتباطان للرجوع السريع:
ExcelLibrary - GNU Less GPL
EPPlus - GNU رخصة عامة أقل (LGPL)
NPOI - ترخيص Apache

فيما يلي بعض أمثلة التعليمات البرمجية لـ 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 يدويًا ، ولكن الوظيفة المذكورة أعلاه هي ما أثار إعجابي حقًا.

965
Mike Webb

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

541
Jan Källman

لقد استخدمت بنجاح المشاريع التالية مفتوحة المصدر:

  • ExcelPackage لتنسيقات OOXML (Office 2007)

  • NPOI لتنسيق .XLS (Office 2003). NPOI 2.0 (بيتا) يدعم أيضا XLSX.

ألقِ نظرة على منشورات المدونة الخاصة بي:

إنشاء جداول بيانات Excel .XLS و .XLSX في C #

NPOI مع جدول Excel ومخطط ديناميكي

160
Leniel Maccaferri

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

بعض الفوائد:

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

الروابط:

156
Pellared

يمكنك استخدام OLEDB لإنشاء ملفات Excel ومعالجتها. تحقق هذا: قراءة وكتابة Excel باستخدام OLEDB .

مثال نموذجي:

using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\temp\\test.xls;Extended Properties='Excel 8.0;HDR=Yes'"))
{
  conn.Open();
  OleDbCommand cmd = new OleDbCommand("CREATE TABLE [Sheet1] ([Column1] string, [Column2] string)", conn);
  cmd.ExecuteNonQuery();
}

تحرير - بعض الروابط الأخرى:

103
Panos

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

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

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

77
Joe Erickson

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

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

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

62
Nate

قد يكون خيار الوزن الخفيف للغاية هو استخدام جداول HTML. ما عليك سوى إنشاء علامات الرأس والجسم والجدول في ملف وحفظه كملف بامتداد .xls. هناك سمات خاصة بـ Microsoft يمكنك استخدامها لتصميم المخرجات ، بما في ذلك الصيغ.

أدرك أنك قد لا تقوم بترميز هذا في تطبيق ويب ، ولكن هنا هو مثال لتكوين ملف Excel عبر جدول HTML. يمكن استخدام هذه التقنية إذا كنت تقوم بترميز تطبيق وحدة التحكم أو تطبيق سطح المكتب أو الخدمة.

59
Forgotten Semicolon

يمكنك استخدام ExcelXmlWriter .

أنه يعمل بشكل جيد.

45
Petr Snobelt

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

يوفر طريقة موجهة للكائن لمعالجة الملفات (على غرار 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");
43
Manuel

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

قد تتأثر إذا لم تجربها.

يرجى تحذيرك من موقف Microsoft الموقف على هذا:

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

42
GEOCHET

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

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

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

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

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

لا يصبح الأمر أبسط من ذلك ...

ولا يتطلب الأمر وجود Excel في الخادم الخاص بك.

31
Mike Gledhill

يمكنك التفكير في إنشاء ملفاتك باستخدام تنسيق جدول بيانات XML 2003 . هذا هو تنسيق XML بسيط باستخدام مخطط توثيق جيد .

23
Sam Warwick

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.

19
Davis Jebaraj

قد ترغب في إلقاء نظرة على GemBox.Spreadsheet .

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

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

18
ManiacZX

حسنا،

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

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

16
Dimi Takis

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

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

15
Sachin Dhir

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

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

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

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

14
biozinc

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

14
Aaron Powell

ما عليك سوى إضافة مرجع آخر إلى حل تابع لجهة خارجية يعالج مشكلتك مباشرةً: http://www.officewriter.com

(إخلاء المسئولية: أعمل لدى SoftArtisans ، الشركة التي تصنع OfficeWriter)

13
Eisbaer

IKVM + POI

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

12
MagicKat

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

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

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

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

12
Ryan Lundy

يمكنك إنشاء ملفات 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};
    }
}
12
user529824

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

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

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

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

12
Simen S
public class GridViewExportUtil
{
    public static void Export(string fileName, GridView gv)
    {
        HttpContext.Current.Response.Clear();
        HttpContext.Current.Response.AddHeader(
            "content-disposition", string.Format("attachment; filename={0}", fileName));
        HttpContext.Current.Response.ContentType = "application/ms-Excel";

        using (StringWriter sw = new StringWriter())
        {
            using (HtmlTextWriter htw = new HtmlTextWriter(sw))
            {
                //  Create a form to contain the grid
                Table table = new Table();

                //  add the header row to the table
                if (gv.HeaderRow != null)
                {
                    GridViewExportUtil.PrepareControlForExport(gv.HeaderRow);
                    table.Rows.Add(gv.HeaderRow);
                }

                //  add each of the data rows to the table
                foreach (GridViewRow row in gv.Rows)
                {
                    GridViewExportUtil.PrepareControlForExport(row);
                    table.Rows.Add(row);
                }

                //  add the footer row to the table
                if (gv.FooterRow != null)
                {
                    GridViewExportUtil.PrepareControlForExport(gv.FooterRow);
                    table.Rows.Add(gv.FooterRow);
                }

                //  render the table into the htmlwriter
                table.RenderControl(htw);

                //  render the htmlwriter into the response
                HttpContext.Current.Response.Write(sw.ToString());
                HttpContext.Current.Response.End();
            }
        }
    }

    /// <summary>
    /// Replace any of the contained controls with literals
    /// </summary>
    /// <param name="control"></param>
    private static void PrepareControlForExport(Control control)
    {
        for (int i = 0; i < control.Controls.Count; i++)
        {
            Control current = control.Controls[i];
            if (current is LinkButton)
            {
                control.Controls.Remove(current);
                control.Controls.AddAt(i, new LiteralControl((current as LinkButton).Text));
            }
            else if (current is ImageButton)
            {
                control.Controls.Remove(current);
                control.Controls.AddAt(i, new LiteralControl((current as ImageButton).AlternateText));
            }
            else if (current is HyperLink)
            {
                control.Controls.Remove(current);
                control.Controls.AddAt(i, new LiteralControl((current as HyperLink).Text));
            }
            else if (current is DropDownList)
            {
                control.Controls.Remove(current);
                control.Controls.AddAt(i, new LiteralControl((current as DropDownList).SelectedItem.Text));
            }
            else if (current is CheckBox)
            {
                control.Controls.Remove(current);
                control.Controls.AddAt(i, new LiteralControl((current as CheckBox).Checked ? "True" : "False"));
            }

            if (current.HasControls())
            {
                GridViewExportUtil.PrepareControlForExport(current);
            }
        }
    }
}

مرحبًا ، هذا الحل هو تصدير طريقة عرض الشبكة إلى ملف Excel الخاص بك ، وقد يساعدك ذلك

12
Gaurav

لقد قمت مؤخرًا باستخدامFlexCel.NETووجدت أنها مكتبة ممتازة! لا أقول ذلك حول الكثير من منتجات البرمجيات. لا جدوى من إعطاء درجة مبيعات كاملة هنا ، يمكنك قراءة جميع الميزات على موقعه على الانترنت.

إنه منتج تجاري ، لكنك تحصل على المصدر الكامل إذا قمت بشرائه. لذلك أفترض أنه يمكنك تجميعها في جمعيتكم إذا كنت تريد ذلك حقًا. وإلا فإنه مجرد تجميع إضافي واحد إلى xcopy - لا يوجد تكوين أو تثبيت أو أي شيء من هذا القبيل.

لا أعتقد أنك ستجد أي طريقة للقيام بذلك بدون مكتبات الطرف الثالث كإطار عمل .NET ، من الواضح أنه لا يحتوي على دعم له و OLE الأتمتة مجرد عالم من الألم .

10
EMP

لقد كتبت رمزًا بسيطًا لتصدير مجموعة البيانات إلى Excel دون استخدام كائن Excel باستخدام System.IO.StreamWriter.

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

public static void exportToExcel(DataSet source, string fileName)
{
        const string endExcelXML = "</Workbook>";
        const string startExcelXML = "<xml version>\r\n<Workbook " +
                 "xmlns=\"urn:schemas-Microsoft-com:office:spreadsheet\"\r\n" +
                 " xmlns:o=\"urn:schemas-Microsoft-com:office:office\"\r\n " +
                 "xmlns:x=\"urn:schemas-    Microsoft-com:office:" +
                 "Excel\"\r\n xmlns:ss=\"urn:schemas-Microsoft-com:" +
                 "office:spreadsheet\">\r\n <Styles>\r\n " +
                 "<Style ss:ID=\"Default\" ss:Name=\"Normal\">\r\n " +
                 "<Alignment ss:Vertical=\"Bottom\"/>\r\n <Borders/>" +
                 "\r\n <Font/>\r\n <Interior/>\r\n <NumberFormat/>" +
                 "\r\n <Protection/>\r\n </Style>\r\n " +
                 "<Style ss:ID=\"BoldColumn\">\r\n <Font " +
                 "x:Family=\"Swiss\" ss:Bold=\"1\"/>\r\n </Style>\r\n " +
                 "<Style     ss:ID=\"StringLiteral\">\r\n <NumberFormat" +
                 " ss:Format=\"@\"/>\r\n </Style>\r\n <Style " +
                 "ss:ID=\"Decimal\">\r\n <NumberFormat " +
                 "ss:Format=\"0.0000\"/>\r\n </Style>\r\n " +
                 "<Style ss:ID=\"Integer\">\r\n <NumberFormat " +
                 "ss:Format=\"0\"/>\r\n </Style>\r\n <Style " +
                 "ss:ID=\"DateLiteral\">\r\n <NumberFormat " +
                 "ss:Format=\"mm/dd/yyyy;@\"/>\r\n </Style>\r\n " +
                 "</Styles>\r\n ";
        System.IO.StreamWriter excelDoc = null;
        excelDoc = new System.IO.StreamWriter(fileName);

        int sheetCount = 1;
        excelDoc.Write(startExcelXML);
        foreach (DataTable table in source.Tables)
        {
            int rowCount = 0;
            excelDoc.Write("<Worksheet ss:Name=\"" + table.TableName + "\">");
            excelDoc.Write("<Table>");
            excelDoc.Write("<Row>");
            for (int x = 0; x < table.Columns.Count; x++)
            {
                excelDoc.Write("<Cell ss:StyleID=\"BoldColumn\"><Data ss:Type=\"String\">");
                excelDoc.Write(table.Columns[x].ColumnName);
                excelDoc.Write("</Data></Cell>");
            }
            excelDoc.Write("</Row>");
            foreach (DataRow x in table.Rows)
            {
                rowCount++;
                //if the number of rows is > 64000 create a new page to continue output
                if (rowCount == 64000)
                {
                    rowCount = 0;
                    sheetCount++;
                    excelDoc.Write("</Table>");
                    excelDoc.Write(" </Worksheet>");
                    excelDoc.Write("<Worksheet ss:Name=\"" + table.TableName + "\">");
                    excelDoc.Write("<Table>");
                }
                excelDoc.Write("<Row>"); //ID=" + rowCount + "
                for (int y = 0; y < table.Columns.Count; y++)
                {
                    System.Type rowType;
                    rowType = x[y].GetType();
                    switch (rowType.ToString())
                    {
                        case "System.String":
                            string XMLstring = x[y].ToString();
                            XMLstring = XMLstring.Trim();
                            XMLstring = XMLstring.Replace("&", "&");
                            XMLstring = XMLstring.Replace(">", ">");
                            XMLstring = XMLstring.Replace("<", "<");
                            excelDoc.Write("<Cell ss:StyleID=\"StringLiteral\">" +
                                           "<Data ss:Type=\"String\">");
                            excelDoc.Write(XMLstring);
                            excelDoc.Write("</Data></Cell>");
                            break;
                        case "System.DateTime":
                            //Excel has a specific Date Format of YYYY-MM-DD followed by  
                            //the letter 'T' then hh:mm:sss.lll Example 2005-01-31T24:01:21.000
                            //The Following Code puts the date stored in XMLDate 
                            //to the format above
                            DateTime XMLDate = (DateTime)x[y];
                            string XMLDatetoString = ""; //Excel Converted Date
                            XMLDatetoString = XMLDate.Year.ToString() +
                                 "-" +
                                 (XMLDate.Month < 10 ? "0" +
                                 XMLDate.Month.ToString() : XMLDate.Month.ToString()) +
                                 "-" +
                                 (XMLDate.Day < 10 ? "0" +
                                 XMLDate.Day.ToString() : XMLDate.Day.ToString()) +
                                 "T" +
                                 (XMLDate.Hour < 10 ? "0" +
                                 XMLDate.Hour.ToString() : XMLDate.Hour.ToString()) +
                                 ":" +
                                 (XMLDate.Minute < 10 ? "0" +
                                 XMLDate.Minute.ToString() : XMLDate.Minute.ToString()) +
                                 ":" +
                                 (XMLDate.Second < 10 ? "0" +
                                 XMLDate.Second.ToString() : XMLDate.Second.ToString()) +
                                 ".000";
                            excelDoc.Write("<Cell ss:StyleID=\"DateLiteral\">" +
                                         "<Data ss:Type=\"DateTime\">");
                            excelDoc.Write(XMLDatetoString);
                            excelDoc.Write("</Data></Cell>");
                            break;
                        case "System.Boolean":
                            excelDoc.Write("<Cell ss:StyleID=\"StringLiteral\">" +
                                        "<Data ss:Type=\"String\">");
                            excelDoc.Write(x[y].ToString());
                            excelDoc.Write("</Data></Cell>");
                            break;
                        case "System.Int16":
                        case "System.Int32":
                        case "System.Int64":
                        case "System.Byte":
                            excelDoc.Write("<Cell ss:StyleID=\"Integer\">" +
                                    "<Data ss:Type=\"Number\">");
                            excelDoc.Write(x[y].ToString());
                            excelDoc.Write("</Data></Cell>");
                            break;
                        case "System.Decimal":
                        case "System.Double":
                            excelDoc.Write("<Cell ss:StyleID=\"Decimal\">" +
                                  "<Data ss:Type=\"Number\">");
                            excelDoc.Write(x[y].ToString());
                            excelDoc.Write("</Data></Cell>");
                            break;
                        case "System.DBNull":
                            excelDoc.Write("<Cell ss:StyleID=\"StringLiteral\">" +
                                  "<Data ss:Type=\"String\">");
                            excelDoc.Write("");
                            excelDoc.Write("</Data></Cell>");
                            break;
                        default:
                            throw (new Exception(rowType.ToString() + " not handled."));
                    }
                }
                excelDoc.Write("</Row>");
            }
            excelDoc.Write("</Table>");
            excelDoc.Write(" </Worksheet>");
            sheetCount++;
        }


        excelDoc.Write(endExcelXML);
        excelDoc.Close();
    }
10
Harsha.Vaswani

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

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

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

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

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

 enter image description here

9
Taterhead

انظر إلى عينات كيفية إنشاء ملفات Excel.

هناك أمثلة في C # و VB.NET

يدير ملفات XSL XSLX و CSV Excel.

http://www.devtriogroup.com/ExcelJetcell/Samples

8
Bonnie Cornell

بعض أتمتة Excel المفيدة في C # ، يمكنك العثور عليها من الرابط التالي.

http://csharp.net-informations.com/Excel/csharp-Excel-tutorial.htm

بولتون.

8
user35711

هل سبق لك أن حاولت sylk؟

اعتدنا على إنشاء أوراق excel في آسيا والمحيط الهادئ كلاسيك ، والآن نحن نبحث عن excelgenerater أيضا.

مزايا sylk هي ، يمكنك تنسيق الخلايا.

7
Stefan Koelle

حل Java مفتوح المصدر هو Apache POI . ربما هناك طريقة لإعداد التشغيل المتداخل هنا ، لكنني لا أعرف ما يكفي عن Java للإجابة على ذلك.

عندما اكتشفت هذه المشكلة ، انتهى بي الأمر باستخدام تجميعات Interop.

4
Nick

ابحث عن ExtremeML. إنها مكتبة رائعة تتيح لك استخدام تنسيق OpenXML لإنشاء ملفات OpenXML.

إنه أيضًا مشروع مفتوح المصدر.

http://www.extrememl.com/

4
Jens

http://www.codeproject.com/KB/cs/Excel_and_C_.aspx <= لماذا لا تستخدم الطاقة المدمجة في النوافذ فقط ، فقط قم بتثبيت Office على الخادم ، يمكن أتمتة أي تطبيق تقوم بتثبيته.

أسهل بكثير فقط استخدام الأساليب الأصلية.

إذا تم تثبيته ، فيمكنك استخدامه ، وهذه هي الميزة الأكثر روعة وتحت المستخدمة في النوافذ التي كان يطلق عليها اسم COM في الأيام الخوالي ، ويوفر لك الكثير من الوقت والألم.

أو حتى أسهل من مجرد استخدام اللوازم ref lib MS - http://csharp.net-informations.com/Excel/csharp-create-Excel.htm

3
Craig Mc

يمكنك فقط كتابتها إلى XML باستخدام تنسيق Excel XML وتسميتها بامتداد .XLS وسيتم فتحها باستخدام Excel. يمكنك التحكم في كل التنسيقات (الغامق ، العروض ، إلخ) في عنوان ملف XML.

يوجد مثال XML من ويكيبيديا .

3
ScaleOvenStove

أحد الخيارات السهلة التي يتم التغاضي عنها غالبًا هو إنشاء تقرير .rdlc باستخدام Microsoft Reporting وتصديره إلى تنسيق Excel. يمكنك تصميمه في الاستوديو المرئي وإنشاء الملف باستخدام:

localReport.Render("EXCELOPENXML", null, ((name, ext, encoding, mimeType, willSeek) => stream = new FileStream(name, FileMode.CreateNew)), out warnings);

يمكنك أيضًا تصديره .doc أو .pdf ، باستخدام "WORDOPENXML" و "PDF" على التوالي ، وهو مدعوم في العديد من الأنظمة الأساسية المختلفة مثل ASP.NET و SSRS.

من الأسهل إجراء تغييرات في مصمم مرئي حيث يمكنك مشاهدة النتائج ، وثق بي ، بمجرد البدء في تجميع البيانات وتنسيق رؤوس المجموعات وإضافة أقسام جديدة ، لا ترغب في العبث بعشرات نقاط XML.

2
AlexDev

منذ بعض الوقت ، قمت بإنشاء DLL أعلى NPOI. من السهل جدًا استخدامه:

IList<DummyPerson> dummyPeople = new List<DummyPerson>();
//Add data to dummyPeople...
IExportEngine engine = new ExcelExportEngine();
engine.AddData(dummyPeople); 
MemoryStream memory = engine.Export();

يمكنك قراءة المزيد حول هذا الموضوع على هنا .

بالمناسبة ، هو 100 ٪ مفتوحة المصدر. لا تتردد في استخدام وتحرير ومشاركة ؛)

1
Vladimir Venegas

إذا قمت بإنشاء جدول بيانات أو datagridview من التعليمات البرمجية ، يمكنك حفظ جميع البيانات باستخدام هذه الطريقة البسيطة. هذه الطريقة غير موصى بها ولكن تعمل بنسبة 100 ٪ ، حتى لو لم تقم بتثبيت MS Excel في جهاز الكمبيوتر الخاص بك.

try
 {
  SaveFileDialog saveFileDialog1 = new SaveFileDialog();
  saveFileDialog1.Filter = "Excel Documents (*.xls)|*.xls";
  saveFileDialog1.FileName = "Employee Details.xls";
  if (saveFileDialog1.ShowDialog() == DialogResult.OK)
  {
  string fname = saveFileDialog1.FileName;
  StreamWriter wr = new StreamWriter(fname);
  for (int i = 0; i <DataTable.Columns.Count; i++)
  {
  wr.Write(DataTable.Columns[i].ToString().ToUpper() + "\t");
  }
  wr.WriteLine();

  //write rows to Excel file
  for (int i = 0; i < (DataTable.Rows.Count); i++)
  {
  for (int j = 0; j < DataTable.Columns.Count; j++)
  {
  if (DataTable.Rows[i][j] != null)
  {
  wr.Write(Convert.ToString(getallData.Rows[i][j]) + "\t");
  }
   else
   {
   wr.Write("\t");
   }
   }
   //go to next line
   wr.WriteLine();
   }
   //close file
   wr.Close();
   }
   }
   catch (Exception)
   {
    MessageBox.Show("Error Create Excel Sheet!");
   }
1
Gayan Chinthaka Dharmarathna

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

var dt = "your code for getting data into datatable";
            Response.ClearContent();
            Response.AddHeader("content-disposition", string.Format("attachment;filename={0}.xls", DateTime.Now.ToString("yyyy-MM-dd")));
            Response.ContentType = "application/vnd.ms-Excel";
            string tab = "";
            foreach (DataColumn dataColumn in dt.Columns)
            {
                Response.Write(tab + dataColumn.ColumnName);
                tab = "\t";
            }
            Response.Write("\n");
            int i;
            foreach (DataRow dataRow in dt.Rows)
            {
                tab = "";
                for (i = 0; i < dt.Columns.Count; i++)
                {
                    Response.Write(tab + dataRow[i].ToString());
                    tab = "\t";
                }
                Response.Write("\n");
            }
            Response.End();
0
Shubham

لحفظ xls في تنسيق xlsx ، نحتاج فقط إلى استدعاء الأسلوب SaveAs من مكتبة Microsoft.Office.Interop.Excel. ستستغرق هذه الطريقة حوالي 16 معلمة وأحدها تنسيق الملف أيضًا.

مستند Microsoft: هنا وسائط وسيطة SaveAs

الكائن الذي نحتاج إلى تمريره مثل

wb.SaveAs(filename, 51, System.Reflection.Missing.Value,
System.Reflection.Missing.Value, false, false, 1,1, true, 
System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value)

51 هنا هي قيمة التعداد لـ XLSX

بالنسبة لـ SaveAs بتنسيقات ملفات مختلفة ، يمكنك الرجوع إلى xlFileFormat

0
Vijay Dodamani