من السهل إنشاء جدول Excel محلي في Asp.net ونشره من الخادم، ولكن من الصعب حذف عملية Excel.exe المضمنة. لذلك لا تفتح مدير المهام لمعرفة ما إذا كانت الأشياء المتعلقة بعملية Excel.exe لا تزال في الذاكرة. أقدم الحل هنا، والذي يوفر طريقتين:
"CreateExcelWorkbook" (يصف كيفية إنشاء مصنف Excel) تعمل هذه الطريقة على تشغيل إجراء مخزن، وإرجاع DataReader وإنشاء مصنف Excel استنادًا إلى DataReader، وحفظه في نظام الملفات، وإنشاء اتصال "تنزيل" بحيث يمكن للمستخدم يمكن تنزيل Excel. يمكن استيراد الجدول إلى المتصفح أو تنزيله مباشرة على الجهاز.
الطريقة الثانية: يقوم GenerateCSVReport بنفس الشيء، باستثناء أنه يحفظ الملف بتنسيق CSV. لا يزال كود CSV مستوردًا في Excel، ويمكنه حل مشكلة شائعة في التطوير: لديك أصفار متعددة يتم سكبها في عمود، ويمكن أن يضمن كود CSV أن الأصفار ليست فارغة. (توضيح: هذه هي مشكلة عدم إمكانية حفظ قيم صفرية متعددة في جدول Excel)
يحتوي الحل القابل للتنزيل على فئة "SPGen" صالحة تقوم بتشغيل إجراء مخزن وإرجاع DataReader، وطريقة إزالة تحذف الملفات الأقدم من قيمة زمنية محددة. الطريقة الرئيسية التي تظهر أدناه هي CreateExcelWorkbook
ملاحظة: يجب أن تدرك أنه عند تشغيل هذه الصفحة، قد تحتاج إلى حقوق المسؤول لكتابة ملفات Excel وCsv في نظام ملفات خادم WebSever. أسهل طريقة للتعامل مع هذه المشكلة هي تشغيل الصفحة في المجلد الخاص بها وتضمين ملف التكوين الخاص بها. وأضف العنصر التالي <identity impersonate ="true" ... في ملف التكوين. لا تزال بحاجة إلى الوصول للكتابة إلى قائمة التحكم في الوصول (ACL) للمجلد الفعلي، فقط حتى تتمتع الهوية التي تقوم بتشغيل الصفحة بحق الوصول للكتابة، وأخيرًا، تحتاج إلى إعداد اتصال COM بمكتبة النوع Excel 9.0 أو Excel 10 ، VS.NET سيتم إنشاء تجميع لك. أعتقد أن Microsoft لديها رابط على موقع Office الخاص بها لتنزيل التجميع الأولي لـ Microsoft. (قد لا يكون دقيقًا، ما أفهمه هو أنه تجميع لـ .net)
<هوية انتحال الشخصية = "صحيح" اسم المستخدم = "المسؤول" كلمة المرور = "adminpass" />
انتبه بشكل خاص إلى مقطع التعليمات البرمجية التالي، الذي يقوم بمسح كائنات Excel.
// بحاجة إلى كافة التعليمات البرمجية التالية لتنظيف وإطفاء كافة المراجع!!!
oWB.Close(null,null,null);
oXL.Workbooks.Close();
oXL.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject (oRng);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oXL);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oWB);
oSheet=null;
oWB=null;
oXL = null;
GC.Collect(); // فرض التنظيف النهائي!
يعد ذلك ضروريًا لأن oSheet و"oWb" و"oRng" والكائنات الأخرى هي أيضًا مثيلات لـ COM. نحتاج إلى
طريقة ReleaseComObject الخاصة بفئة Marshal لإزالتها من .NET
Private void CreateExcelWorkbook(string spName, SqlParameter[] parms. )
{
string strCurrentDir = Server.MapPath(".") + "\";
RemoveFiles(strCurrentDir); // طريقة الأداة المساعدة لتنظيف الملفات القديمة
Excel.Application oXL؛
Excel._Workbook oWB؛
Excel._Worksheet oSheet؛
Excel.Range أو
حاول
{
GC.Collect();// قم بتنظيف أي أشخاص آخرين في برنامج Excel يتسكعون...
oXL = new Excel.Application();
oXL.Visible = false;
// احصل على مصنف جديد.
oWB = (Excel._Workbook)(oXL.Workbooks.Add( Missing.Value ));
oSheet = (Excel._Worksheet)oWB.ActiveSheet;
// احصل على سلسلة البيانات الخاصة بنا
strConnect = System.Configuration.ConfigurationSettings.AppSettings["connectString"];
SPGen sg = new SPGen(strConnect,spName,parms);
SqlDataReader myReader = sg.RunReader();
// إنشاء رأس وورقة...
int iRow =2;
ل(int j=0;j<myReader.FieldCount;j++)
{
oSheet.Cells[1, j+1] = myReader.GetName(j).ToString();
}
// بناء محتويات الورقة
بينما (myReader.Read())
{
for(int k=0;k < myReader.FieldCount;k++)
{
oSheet.Cells[iRow,k+1]= myReader.GetValue(k).ToString();
}
iRow++;
}//انتهى بينما
myReader.Close();
myReader=null;
// تنسيق A1:Z1 كخط غامق، محاذاة رأسية = center.
oSheet.get_Range("A1", "Z1").Font.Bold = true;
oSheet.get_Range("A1", "Z1").VerticalAlignment =Excel.XlVAlign.xlVAlignCenter;
// أعمدة الاحتواء التلقائي A:Z.
oRng = oSheet.get_Range("A1", "Z1");
oRng.EntireColumn.AutoFit();
oXL.Visible = false;
oXL.UserControl = false;
سلسلة strFile ="report" + System.DateTime.Now.Ticks.ToString() +".xls";
oWB.SaveAs( strCurrentDir + strFile،Excel.XlFileFormat.xlWorkbookNormal،
null,null,false,false,Excel.XlSaveAsAccessMode.xlShared,false,false,null,null,null);
// بحاجة إلى كافة التعليمات البرمجية التالية لتنظيف وإطفاء كافة المراجع!!!
oWB.Close(null,null,null);
oXL.Workbooks.Close();
oXL.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject (oRng);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oXL);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oWB);
oSheet=null;
oWB=null;
oXL = null;
GC.Collect(); // فرض التنظيف النهائي!
string strMachineName = Request.ServerVariables["SERVER_NAME"];
errLabel.Text="<A href=http://" + strMachineName +"/ExcelGen/" +strFile + ">تنزيل التقرير</a>"
}
قبض على (استثناء الاستثناء)
{
رسالة خطأ السلسلة؛
errorMessage = "خطأ:"؛
errorMessage = String.Concat( errorMessage, theException.Message );
errorMessage = String.Concat( errorMessage, " Line: ");
errorMessage = String.Concat( errorMessage, theException.Source );
errLabel.Text= errorMessage;
}
}
ما يلي هو المقال الأصلي إنشاء
مصنفات Excel الديناميكية لـ ASP.NET في لغة C#
بقلم Peter A. Bromberg, Ph.D.
نسخة صالحة للطباعة
يوجد أيضًا، في الحل القابل للتنزيل، فئة أدوات مساعدة "SPGen" التي تتعامل مع تشغيل جداول بيانات Excel المخزنة
. إن إنشاء جداول بيانات Excel أصلية من خادم الويب الخاص بك ليس بهذه الصعوبة مع ASP.NET، ما قد يكون صعبًا هو جعل مثيلات Excel.exe تختفي لا تفتح TaskMgr وترى 123 مثيلًا لـ EXCEL.EXE لا تزال موجودة في الذاكرة. أقدم هنا حلاً يحتوي على طريقتين، "CreateExcelWorkbook"، الذي يقوم بتشغيل إجراء مخزن يقوم بإرجاع DataReader ويجمع مصنف Excel الأصلي من. ويحفظه في نظام الملفات، وينشئ رابط "تنزيل" حتى يتمكن المستخدم من تحميل التقرير إلى Excel في متصفحه، أو تنزيل ملف XLS. الطريقة الثانية، GenerateCSVReport، تفعل نفس الشيء بشكل أساسي ولكنها تنشئ ملف CSV الملف الذي سيتم، بالطبع، تحميله أيضًا في Excel. يعالج رمز CSV بشكل صحيح مشكلة مطور شائعة تتمثل في أنه إذا كان لديك عمود يحتوي على أصفار بادئة، فسيتم الاحتفاظ به.
الإجراءات وإرجاع DataReaders، وطريقة الأداة المساعدة RemoveFiles التي تقوم بتنظيف أي ملف XLS أو CSV أقدم من عدد الدقائق المحدد. الطريقة الرئيسية الموضحة أدناه هي طريقة
CreateExcelWorkbook صفحة ضمن حساب يتمتع بامتيازات إدارية لأنه يحتاج إلى أذونات كتابة لتخزين ملفات Excel أو CSV التي تم إنشاؤها على نظام ملفات خادم الويب، ربما تكون أسهل طريقة للتعامل مع ذلك هي وضع الصفحة في مجلد خاص بها مع web.config الخاص بها. وأدخل عنصر <identity impersonate ="true" ... قد تحتاج أيضًا إلى تمكين أذونات قائمة التحكم بالوصول (ACL) على المجلد الفعلي أيضًا حتى تتمتع الهوية التي تعمل بها الصفحة بأذونات الكتابة. وأخيرًا، ستحتاج إلى تعيين COM إلى Excel 9.0 أو Excel 10 Typelibrary واسمح لـ VS.NET بإنشاء تجميعات Interop لك. أعتقد أن MS لديه أيضًا رابط على موقع Office الخاص بهم حيث يمكنك تنزيل تجميعات Interop الأساسية لـ Office.
<هوية انتحال الشخصية = "صحيح" اسم المستخدم = "المسؤول" كلمة المرور = "adminpass" />
لاحظ بشكل خاص مقطع التعليمات البرمجية الذي يقوم "بتنظيف" كائنات Excel:
// تحتاج إلى جميع التعليمات البرمجية التالية لتنظيف جميع المراجع وإطفائها!!!
oWB.Close(null,null,null);
oXL.Workbooks.Close();
oXL.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject (oRng);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oXL);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oWB);
oSheet=null;
oWB=null;
oXL = null;
GC.Collect(); // فرض التنظيف النهائي!
يعد هذا ضروريًا لأن كل هذه الكائنات الصغيرة "oSheet" و"oWb" و'oRng" وما إلى ذلك كلها مثيلات COM ونحتاج إلى استخدام طريقة InteropServices ReleaseComObject الخاصة بفئة Marshal للتخلص منها في .NET.
Private void CreateExcelWorkbook(سلسلة spName، SqlParameter[] بارمس)
{
string strCurrentDir = Server.MapPath(".") + "\";
RemoveFiles(strCurrentDir); // طريقة الأداة المساعدة لتنظيف الملفات القديمة
Excel.Application oXL؛
Excel._Workbook oWB؛
Excel._Worksheet oSheet؛
Excel.Range أو
حاول
{
GC.Collect();// قم بتنظيف أي أشخاص آخرين في برنامج Excel يتسكعون...
oXL = new Excel.Application();
oXL.Visible = false;
// احصل على مصنف جديد.
oWB = (Excel._Workbook)(oXL.Workbooks.Add( Missing.Value ));
oSheet = (Excel._Worksheet)oWB.ActiveSheet;
// احصل على سلسلة البيانات الخاصة بنا
strConnect = System.Configuration.ConfigurationSettings.AppSettings["connectString"];
SPGen sg = new SPGen(strConnect,spName,parms);
SqlDataReader myReader = sg.RunReader();
// إنشاء رأس وورقة...
int iRow =2;
ل(int j=0;j<myReader.FieldCount;j++)
{
oSheet.Cells[1, j+1] = myReader.GetName(j).ToString();
}
// بناء محتويات الورقة
بينما (myReader.Read())
{
for(int k=0;k < myReader.FieldCount;k++)
{
oSheet.Cells[iRow,k+1]= myReader.GetValue(k).ToString();
}
iRow++;
}//انتهى بينما
myReader.Close();
myReader=null;
// تنسيق A1:Z1 كخط غامق، محاذاة رأسية = center.
oSheet.get_Range("A1", "Z1").Font.Bold = true;
oSheet.get_Range("A1", "Z1").VerticalAlignment =Excel.XlVAlign.xlVAlignCenter;
// أعمدة الاحتواء التلقائي A:Z.
oRng = oSheet.get_Range("A1", "Z1");
oRng.EntireColumn.AutoFit();
oXL.Visible = false;
oXL.UserControl = false;
سلسلة strFile ="report" + System.DateTime.Now.Ticks.ToString() +".xls";
oWB.SaveAs( strCurrentDir + strFile،Excel.XlFileFormat.xlWorkbookNormal،
null,null,false,false,Excel.XlSaveAsAccessMode.xlShared,false,false,null,null,null);
// بحاجة إلى كافة التعليمات البرمجية التالية لتنظيف وإطفاء كافة المراجع!!!
oWB.Close(null,null,null);
oXL.Workbooks.Close();
oXL.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject (oRng);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oXL);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oWB);
oSheet=null;
oWB=null;
oXL = null;
GC.Collect(); // فرض التنظيف النهائي!
string strMachineName = Request.ServerVariables["SERVER_NAME"];
errLabel.Text="<A href=http://" + strMachineName +"/ExcelGen/" +strFile + ">تنزيل التقرير</a>"
}
قبض على (استثناء الاستثناء)
{
رسالة خطأ السلسلة؛
errorMessage = "خطأ:"؛
errorMessage = String.Concat( errorMessage, theException.Message );
errorMessage = String.Concat( errorMessage, " Line: ");
errorMessage = String.Concat( errorMessage, theException.Source );
errLabel.Text= errorMessage;
}
}
- تمت الترجمة على عجل، يرجى أن تسامحني إذا كان هناك أي أخطاء مرحبًا بك لتقديم النصيحة والمناقشة --- شياو شو
http://macroxu-1982.cnblogs.com/archive/2006/05/31/413879.html