كيف يمكنني إنشاء ملف Excel (.XLS و.XLSX) في C# دون تثبيت Microsoft Office؟[مغلق]

StackOverflow https://stackoverflow.com/questions/151005

  •  02-07-2019
  •  | 
  •  

سؤال

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

هل كانت مفيدة؟

المحلول

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

مكتبة اكسل

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

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

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

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

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

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

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

نصائح أخرى

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

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

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

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

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

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

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

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

بعض الفوائد:

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

الروابط:

يمكنك استخدام 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();
}

تحرير - بعض الروابط الإضافية:

الحل التجاري برنامج SpreadsheetGear لـ .NET سوف تفعل ذلك.

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

تنصل:أنا أملك SpreadsheetGear LLC

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

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

بالنسبة لجميع مشاريعي الجديدة، على الرغم من أنني أستخدم هدف غير مرغوب فيه, ، منفذ .NET الخاص بـ أباتشي النقاط المهمة. NPOI 2.0 (ألفا) كما يدعم XLSX.

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

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

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

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

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

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

يتيح لك RightXML إنشاء ملفات 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");

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

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

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

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

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

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

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

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

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

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

كما أنه لا يتطلب وجود برنامج Excel على الخادم الخاص بك.

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

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

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

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

Syncfusion أساسي 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.

حسنًا،

يمكنك أيضًا استخدام مكتبة تابعة لجهة خارجية مثل اطرح.

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

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

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

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

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

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

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

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

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

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

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

أريد فقط إضافة مرجع آخر إلى حل جهة خارجية يعالج مشكلتك مباشرة: http://www.officewriter.com

(تنصل:أنا أعمل لدى SoftArtisans، الشركة التي تصنع OfficeWriter)

لقد كتبت رمزًا بسيطًا لتصدير مجموعة البيانات إلى برنامج 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();
    }

آيكفم + النقاط المهمة

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

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

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

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

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

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

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

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

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

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 الخاص بك، وقد يساعدك ذلك

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

إن أبسط وأسرع طريقة لإنشاء ملف Excel من C# هي استخدام أداة الإنتاجية Open XML.تأتي أداة إنتاجية Open 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 بسيط على جيثب والتي سيتم تشغيلها على نظام التشغيل Windows لهذا الغرض.هناك فئة نائب تسمى GeneratedClass حيث يمكنك لصق الكود الذي تم إنشاؤه.إذا قمت بإرجاع نسخة واحدة من الملف، فسيتم إنشاء ملف Excel مثل هذا:

enter image description here

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

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

بولتون.

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

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

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

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

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