เป็นเรื่องง่ายที่จะสร้างตาราง Excel ในเครื่องใน Asp.net และกระจายออกจากเซิร์ฟเวอร์ แต่เป็นการยากที่จะลบกระบวนการ Excel.exe ที่ฝังอยู่ ดังนั้นอย่าเปิดตัวจัดการงานเพื่อดูว่าสิ่งต่าง ๆ ที่เกี่ยวข้องกับกระบวนการ Excel.exe ยังคงอยู่ในหน่วยความจำหรือไม่ ฉันให้วิธีแก้ปัญหาที่นี่ ซึ่งมีสองวิธี:
"CreateExcelWorkbook" (อธิบายวิธีการสร้างสมุดงาน Excel) วิธีการนี้รันขั้นตอนการจัดเก็บ ส่งคืน DataReader และสร้างสมุดงาน Excel ตาม DataReader บันทึกลงในระบบไฟล์ และสร้างการเชื่อมต่อ "ดาวน์โหลด" เพื่อให้ผู้ใช้ สามารถดาวน์โหลด Excel สามารถนำตารางเข้าบราวเซอร์หรือดาวน์โหลดลงเครื่องได้โดยตรง
วิธีที่สอง: GenerateCSVReport จะทำสิ่งเดียวกันเป็นหลัก ยกเว้นว่าจะบันทึกไฟล์ในรูปแบบ CSV ยังคงนำเข้าสู่ Excel โค้ด CSV สามารถแก้ปัญหาทั่วไปในการพัฒนาได้: คุณมีเลขศูนย์หลายตัวเทลงในคอลัมน์ และโค้ด CSV สามารถมั่นใจได้ว่าเลขศูนย์จะไม่ว่างเปล่า (คำอธิบาย: นี่เป็นปัญหาที่ไม่สามารถบันทึกค่าศูนย์หลายค่าในตาราง Excel ได้)
โซลูชันที่ดาวน์โหลดได้ประกอบด้วยคลาส "SPGen" ที่ถูกต้องซึ่งรันขั้นตอนการจัดเก็บและส่งกลับ DataReader และวิธีการลบที่จะลบไฟล์ที่เก่ากว่าค่าเวลาที่ระบุ วิธีการหลักที่ปรากฏด้านล่างคือ CreateExcelWorkbook
หมายเหตุ: คุณต้องทราบว่าเมื่อเรียกใช้เพจนี้ คุณอาจต้องมีสิทธิ์ของผู้ดูแลระบบในการเขียนไฟล์ Excel และ Csv ในระบบไฟล์ของเซิร์ฟเวอร์ WebSever วิธีที่ง่ายที่สุดในการจัดการกับปัญหานี้คือการเรียกใช้เพจในโฟลเดอร์ของตัวเองและรวมไฟล์การกำหนดค่าของตัวเองไว้ด้วย และเพิ่มองค์ประกอบต่อไปนี้ <identity impersonate ="true" ... ในไฟล์การกำหนดค่า คุณยังต้องมีสิทธิ์ในการเขียนรายการควบคุมการเข้าถึง (ACL) ของโฟลเดอร์ฟิสิคัล เพื่อให้ข้อมูลประจำตัวที่คุณเรียกใช้เพจมีสิทธิ์ในการเขียนเท่านั้น สุดท้ายนี้ คุณจะต้องตั้งค่าการเชื่อมต่อ COM กับไลบรารีประเภท Excel 9.0 หรือ Excel 10 , VS.NET แอสเซมบลีจะถูกสร้างขึ้นสำหรับคุณ ฉันเชื่อว่า Microsoft มีลิงก์บนเว็บไซต์ Office เพื่อดาวน์โหลดชุดประกอบเริ่มต้นของ Microsoft (อาจจะไม่ถูกต้องนะครับ ผมเข้าใจว่าเป็น Assembly ของ .net)
<ตัวตนเลียนแบบ = "true" userName = "adminuser" รหัสผ่าน = "adminpass" />
ให้ความสนใจเป็นพิเศษกับบล็อกโค้ดต่อไปนี้ ซึ่งจะล้างวัตถุ Excel
// ต้องการโค้ดต่อไปนี้ทั้งหมดเพื่อล้างและลบข้อมูลอ้างอิงทั้งหมด!!!
oWB.ปิด(null,null,null);
oXL.สมุดงาน.ปิด();
oXL.ออก();
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 = โมฆะ;
GC.Collect(); // บังคับให้ล้างข้อมูลครั้งสุดท้าย!
นี่เป็นสิ่งจำเป็นเนื่องจาก oSheet", "oWb", 'oRng" และวัตถุอื่นๆ ยังเป็นอินสแตนซ์ของ COM เราต้องการ
เมธอด ReleaseComObject ของคลาส Marshal เพื่อลบออกจาก .NET
private void CreateExcelWorkbook(string spName, SqlParameter[] parms )
-
สตริง strCurrentDir = Server.MapPath(".") + "\";
RemoveFiles(strCurrentDir); // วิธีการล้างไฟล์เก่า
Excel แอปพลิเคชัน oXL;
Excel._Workbook oWB;
Excel._แผ่นงาน oSheet;
oRng
;
-
GC.Collect();// ทำความสะอาดพวก Excel คนอื่นๆ ที่กำลังยุ่งอยู่...
oXL = Excel.Application ใหม่ ();
oXL.Visible = เท็จ;
//รับสมุดงานใหม่
oWB = (Excel._Workbook)(oXL.Workbooks.Add( Missing.Value ));
oSheet = (Excel._Worksheet)oWB.ActiveSheet;
//รับ
สตริงข้อมูลของเรา strConnect = System.Configuration.ConfigurationSettings.AppSettings["connectString"];
SPGen sg = 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())
-
สำหรับ (int k=0;k < myReader.FieldCount;k++)
-
oSheet.Cells[iRow,k+1]= myReader.GetValue(k).ToString();
-
ไอโรว์++;
}//สิ้นสุดในขณะที่
myReader.ปิด();
myReader=null;
//จัดรูปแบบ A1:Z1 ให้เป็นตัวหนา การจัดแนวตั้ง = กึ่งกลาง
oSheet.get_Range("A1", "Z1").Font.Bold = จริง;
oSheet.get_Range("A1", "Z1").VerticalAlignment =Excel.XlVAlign.xlVAlignCenter;
//ปรับคอลัมน์ให้พอดีอัตโนมัติ A:Z
oRng = oSheet.get_Range("A1", "Z1");
oRng.EntireColumn.AutoFit();
oXL.Visible = เท็จ;
oXL.UserControl = เท็จ;
สตริง strFile = "รายงาน" + 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.ปิด(null,null,null);
oXL.สมุดงาน.ปิด();
oXL.ออก();
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 = โมฆะ;
GC.Collect(); // บังคับให้ล้างข้อมูลครั้งสุดท้าย!
สตริง strMachineName = Request.ServerVariables ["SERVER_NAME"];
errLabel.Text="<A href=http://" + strMachineName +"/ExcelGen/" +strFile + ">ดาวน์โหลดรายงาน</a>"
}
จับ (ยกเว้น theException)
-
ข้อความผิดพลาดของสตริง;
errorMessage = "ข้อผิดพลาด: ";
errorMessage = String.Concat ( errorMessage, theException.Message );
errorMessage = String.Concat( errorMessage, " Line: " );
errorMessage = String.Concat ( errorMessage, theException.Source );
errLabel.Text= ข้อความผิดพลาด;
-
-
ต่อไปนี้เป็นบทความต้นฉบับสร้าง
สมุดงาน Excel ASP.NET แบบไดนามิกใน C#
โดย Peter A. Bromberg, Ph.D.
เวอร์ชันที่เหมาะกับเครื่องพิมพ์
นอกจากนี้ยังมีในโซลูชันที่ดาวน์โหลดได้ คลาสยูทิลิตี้ "SPGen" ที่จัดการการรัน
การสร้างสเปรดชีต Excel ดั้งเดิมที่เก็บไว้จากเว็บเซิร์ฟเวอร์ของคุณนั้นไม่ใช่เรื่องยากสำหรับ ASP.NET สิ่งที่อาจเป็นเรื่องยากคือการทำให้อินสแตนซ์ของ Excel.exe หายไป คุณไม่ได้เปิด TaskMgr และเห็น EXCEL.EXE จำนวน 123 อินสแตนซ์ที่ยังคงอยู่ในหน่วยความจำ ฉันให้โซลูชันที่มีสองวิธีที่นี่ "CreateExcelWorkbook" ซึ่งเรียกใช้ขั้นตอนการจัดเก็บที่ส่งคืน DataReader และประกอบสมุดงาน Excel ดั้งเดิมจาก บันทึกลงในระบบไฟล์และสร้างลิงก์ "ดาวน์โหลด" เพื่อให้ผู้ใช้สามารถโหลดรายงานลงใน Excel ในเบราว์เซอร์หรือดาวน์โหลดไฟล์ XLS วิธีที่สอง GenerateCSVReport จะทำสิ่งเดียวกันโดยพื้นฐาน แต่สร้าง CSV แน่นอนว่าไฟล์นี้จะโหลดลงใน Excel ด้วย โค้ด CSV จัดการปัญหาทั่วไปของนักพัฒนาได้อย่างถูกต้อง โดยที่ถ้าคุณมีคอลัมน์ที่มีเลขศูนย์นำหน้า ไฟล์เหล่านั้นก็จะยังคงอยู่
ขั้นตอนและการส่งคืน DataReaders และวิธีการลบไฟล์ XLS หรือ CSV ใด ๆ ที่เก่ากว่าจำนวนนาทีที่ระบุ วิธีการหลักที่แสดงด้านล่างคือวิธี CreateExcelWorkbook
หมายเหตุ: คุณควรทราบว่าคุณอาจต้องเรียกใช้สิ่งนี้ ภายใต้บัญชีที่มีสิทธิ์ระดับผู้ดูแลระบบเนื่องจากต้องมีสิทธิ์ในการเขียนเพื่อจัดเก็บไฟล์ Excel หรือ CSV ที่สร้างขึ้นบนระบบไฟล์ของเว็บเซิร์ฟเวอร์ อาจเป็นวิธีที่ง่ายที่สุดในการจัดการสิ่งนี้คือการมีเพจในโฟลเดอร์ของตัวเองด้วย web.config ของตัวเอง และแทรก <identity impersonate ="true" ... elment คุณอาจต้องเปิดใช้งานการอนุญาต ACL บนโฟลเดอร์จริงด้วย เพื่อให้ข้อมูลประจำตัวที่เพจทำงานภายใต้สิทธิ์ในการเขียน สุดท้าย คุณจะต้องตั้งค่า COM อ้างอิงถึง Excel 9.0 หรือ Excel 10 Typelibrary และให้ VS.NET สร้างแอสเซมบลี Interop ให้กับคุณ ฉันเชื่อว่า MS ยังมีลิงก์บนไซต์ Office ของพวกเขาซึ่งคุณสามารถดาวน์โหลด Office Interop Assemblies หลักได้
<ตัวตนเลียนแบบ = "true" userName = "adminuser" รหัสผ่าน = "adminpass" />
โปรดสังเกตโดยเฉพาะบล็อกโค้ดที่ทำการ "ล้างข้อมูล" ของวัตถุ Excel:
// ต้องการโค้ดต่อไปนี้ทั้งหมดเพื่อล้างและลบข้อมูลอ้างอิงทั้งหมด!!!
oWB.ปิด(null,null,null);
oXL.สมุดงาน.ปิด();
oXL.ออก();
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 = โมฆะ;
GC.Collect(); // บังคับให้ล้างข้อมูลครั้งสุดท้าย!
นี่เป็นสิ่งจำเป็นเนื่องจากวัตถุขนาดเล็กทั้งหมดเหล่านั้น "oSheet", "oWb" , 'oRng" ฯลฯ เป็นอินสแตนซ์ COM ทั้งหมดและเราจำเป็นต้องใช้เมธอด InteropServices ReleaseComObject ของคลาส Marshal เพื่อกำจัดพวกมันใน .NET
ส่วนตัวเป็นโมฆะ CreateExcelWorkbook (สตริง spName, SqlParameter [] parms)
-
สตริง strCurrentDir = Server.MapPath(".") + "\";
RemoveFiles(strCurrentDir); // วิธีการล้างไฟล์เก่า
Excel แอปพลิเคชัน oXL;
Excel._Workbook oWB;
Excel._แผ่นงาน oSheet;
oRng
;
-
GC.Collect();// ทำความสะอาดพวก Excel คนอื่นๆ ที่กำลังยุ่งอยู่...
oXL = Excel.Application ใหม่ ();
oXL.Visible = เท็จ;
//รับสมุดงานใหม่
oWB = (Excel._Workbook)(oXL.Workbooks.Add( Missing.Value ));
oSheet = (Excel._Worksheet)oWB.ActiveSheet;
//รับ
สตริงข้อมูลของเรา strConnect = System.Configuration.ConfigurationSettings.AppSettings["connectString"];
SPGen sg = 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())
-
สำหรับ (int k=0;k < myReader.FieldCount;k++)
-
oSheet.Cells[iRow,k+1]= myReader.GetValue(k).ToString();
-
ไอโรว์++;
}//สิ้นสุดในขณะที่
myReader.ปิด();
myReader=null;
//จัดรูปแบบ A1:Z1 ให้เป็นตัวหนา การจัดแนวตั้ง = กึ่งกลาง
oSheet.get_Range("A1", "Z1").Font.Bold = จริง;
oSheet.get_Range("A1", "Z1").VerticalAlignment =Excel.XlVAlign.xlVAlignCenter;
//ปรับคอลัมน์ให้พอดีอัตโนมัติ A:Z
oRng = oSheet.get_Range("A1", "Z1");
oRng.EntireColumn.AutoFit();
oXL.Visible = เท็จ;
oXL.UserControl = เท็จ;
สตริง strFile = "รายงาน" + 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.ปิด(null,null,null);
oXL.สมุดงาน.ปิด();
oXL.ออก();
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 = โมฆะ;
GC.Collect(); // บังคับให้ล้างข้อมูลครั้งสุดท้าย!
สตริง strMachineName = Request.ServerVariables ["SERVER_NAME"];
errLabel.Text="<A href=http://" + strMachineName +"/ExcelGen/" +strFile + ">ดาวน์โหลดรายงาน</a>"
}
จับ (ยกเว้น theException)
-
ข้อความผิดพลาดของสตริง;
errorMessage = "ข้อผิดพลาด: ";
errorMessage = String.Concat ( errorMessage, theException.Message );
errorMessage = String.Concat( errorMessage, " Line: " );
errorMessage = String.Concat ( errorMessage, theException.Source );
errLabel.Text= ข้อความผิดพลาด;
-
-
-แปลเร็ว ผิดพลาดประการใดขออภัยด้วยคับ ---Xiao Xu
http://macroxu-1982.cnblogs.com/archive/2006/05/31/413879.html