Sangat mudah untuk membuat tabel Excel lokal di Asp.net dan menyebarkannya dari server, namun sulit untuk menghapus proses Excel.exe yang tertanam. Jadi jangan buka task manager untuk melihat apakah hal-hal yang berhubungan dengan proses excel.exe masih ada di memori. Saya memberikan solusi di sini, yang menyediakan dua metode:
"CreateExcelWorkbook" (menjelaskan cara membuat buku kerja Excel) Metode ini menjalankan prosedur tersimpan, mengembalikan DataReader dan menghasilkan buku kerja Excel berdasarkan DataReader, menyimpannya ke sistem file, dan membuat koneksi "unduh" sehingga pengguna dapat mengunduh Excel Tabel dapat diimpor ke browser atau diunduh langsung ke mesin.
Metode kedua: GenerateCSVReport pada dasarnya melakukan hal yang sama, hanya saja ia menyimpan file dalam format CSV. Masih diimpor ke Excel, kode CSV dapat memecahkan masalah umum dalam pengembangan: Anda memiliki beberapa angka nol yang dituangkan ke dalam kolom, dan kode CSV dapat memastikan bahwa angka nol tidak kosong. (Penjelasan: Ini adalah masalah beberapa nilai nol tidak dapat disimpan di tabel Excel)
Solusi yang dapat diunduh berisi kelas "SPGen" yang valid yang menjalankan prosedur tersimpan dan mengembalikan DataReader, dan metode penghapusan yang menghapus file yang lebih lama dari nilai waktu tertentu. Metode utama yang muncul di bawah ini adalah CreateExcelWorkbook
Catatan: Anda harus menyadari bahwa saat menjalankan halaman ini, Anda mungkin memerlukan hak administrator untuk menulis file Excel dan Csv di sistem file server WebSever. Cara termudah untuk mengatasi masalah ini adalah dengan menjalankan halaman di foldernya sendiri dan menyertakan file konfigurasinya sendiri. Dan tambahkan elemen berikut Berikan perhatian khusus pada blok kode berikut, yang menghapus objek Excel. // Butuh semua kode berikut untuk membersihkan dan mematikan semua referensi!!! Hal ini diperlukan karena oSheet", "oWb", 'oRng", dan objek lainnya juga merupakan instance dari COM. Kita memerlukan metode ReleaseComObject kelas Marshal untuk menghapusnya dari .NET private void CreateExcelWorkbook(string spName, SqlParameter[] parms ) Excel.Range oRng; strConnect = System.Configuration.ConfigurationSettings.AppSettings["connectString"]; } Berikut ini adalah artikel asli Membuat Buku Kerja Excel ASP.NET Dinamis Dalam C# Oleh Peter A. Bromberg, Ph.D. Ada juga, dalam solusi yang dapat diunduh, kelas utilitas "SPGen" yang menangani proses pembuatan spreadsheet Excel asli yang disimpan dari server web Anda tidak terlalu sulit dengan ASP.NET. Yang sulit adalah menghilangkan instance Excel.exe Anda tidak membuka TaskMgr dan melihat 123 contoh EXCEL.EXE masih tersimpan di memori. Di sini saya memberikan solusi yang memiliki dua metode, "CreateExcelWorkbook", yang menjalankan prosedur tersimpan yang mengembalikan DataReader dan merakit Buku Kerja Excel asli dari itu, menyimpannya ke sistem file, dan membuat tautan "Unduh" sehingga pengguna dapat memuat laporan ke Excel di browser mereka, atau mengunduh file XLS. Metode kedua, GenerateCSVReport, pada dasarnya melakukan hal yang sama tetapi membuat CSV file yang tentu saja juga akan dimuat ke Excel. Kode CSV dengan benar menangani masalah umum pengembang, yaitu jika Anda memiliki kolom dengan angka nol di depannya, maka kolom tersebut akan dipertahankan. prosedur dan mengembalikan DataReaders, dan metode utilitas HapusFile yang membersihkan file XLS atau CSV yang lebih lama dari jumlah menit yang ditentukan. Metode utama yang disajikan di bawah ini adalah metode CreateExcelWorkbook halaman di bawah akun yang memiliki hak administratif karena memerlukan izin menulis untuk menyimpan file Excel atau CSV yang dihasilkan di sistem file server web. Mungkin cara termudah untuk menangani ini adalah dengan memiliki halaman di foldernya sendiri dengan web.confignya sendiri. dan masukkan elemen Perhatikan khususnya blok kode yang melakukan "pembersihan" objek Excel: // Perlu semua kode berikut untuk membersihkan dan mematikan semua referensi!!! Hal ini diperlukan karena semua objek kecil "oSheet", "oWb", 'oRng", dll. semuanya merupakan instance COM dan kita perlu menggunakan metode InteropServices ReleaseComObject dari kelas Marshal untuk membuangnya di .NET. private void BuatExcelWorkbook(string spName, SqlParameter[] parms) Excel.Range oRng; strConnect = System.Configuration.ConfigurationSettings.AppSettings["connectString"]; } http://macroxu-1982.cnblogs.com/archive/2006/05/31/413879.html
oWB.Tutup(null,null,null);
oXL.Buku Kerja.Tutup();
oXL.Keluar();
Sistem.Runtime.InteropServices.Marshal.ReleaseComObject (oRng);
Sistem.Runtime.InteropServices.Marshal.ReleaseComObject (oXL);
Sistem.Runtime.InteropServices.Marshal.ReleaseComObject (oSheet);
Sistem.Runtime.InteropServices.Marshal.ReleaseComObject (oWB);
oLembar=batal;
oWB=nol;
oXL = nol;
GC.Collect(); // paksakan pembersihan akhir!
{
string strCurrentDir = Server.MapPath(".") + "\";
RemoveFiles(strCurrentDir); // metode utilitas untuk membersihkan file lama
Excel.Aplikasi oXL;
Excel._Buku Kerja oWB;
Excel._Lembar Kerja oLembar;
{
GC.Collect();// bersihkan semua orang excel lain yang berkeliaran...
oXL = Excel.Aplikasi baru();
oXL.Terlihat = salah;
//Dapatkan buku kerja baru.
oWB = (Excel._Workbook)(oXL.Workbooks.Add( Missing.Value ));
oSheet = (Excel._Worksheet)oWB.ActiveSheet;
//dapatkan string Data kami
SPGen sg = SPGen baru(strConnect,spName,parms);
SqlDataReader myReader = sg.RunReader();
// Buat Header dan lembar...
int iRow =2;
untuk(int j=0;j
oSheet.Sel[1, j+1] = myReader.GetName(j).ToString();
}
// membuat isi sheet
sementara (Pembacaku.Baca())
{
untuk(int k=0;k < myReader.FieldCount;k++)
{
oSheet.Cells[iRow,k+1]= myReader.GetValue(k).ToString();
}
iRow++;
}//akhiri sementara
myReader.Tutup();
pembaca saya=batal;
//Format A1:Z1 tebal, perataan vertikal = tengah.
oSheet.get_Range("A1", "Z1").Font.Bold = true;
oSheet.get_Range("A1", "Z1").VerticalAlignment =Excel.XlVAlign.xlVAlignCenter;
//Paskan Otomatis kolom A:Z.
oRng = oSheet.get_Range("A1", "Z1");
oRng.EntireColumn.AutoFit();
oXL.Terlihat = salah;
oXL.UserControl = salah;
string strFile ="laporan" + Sistem.DateTime.Sekarang.Ticks.ToString() +".xls";
oWB.SaveAs( strCurrentDir + strFile,Excel.XlFileFormat.xlWorkbookNormal,
null,null,false,false,Excel.XlSaveAsAccessMode.xlBerbagi,false,false,null,null,null);
// Butuh semua kode berikut untuk membersihkan dan mematikan semua referensi!!!
oWB.Tutup(null,null,null);
oXL.Buku Kerja.Tutup();
oXL.Keluar();
Sistem.Runtime.InteropServices.Marshal.ReleaseComObject (oRng);
Sistem.Runtime.InteropServices.Marshal.ReleaseComObject (oXL);
Sistem.Runtime.InteropServices.Marshal.ReleaseComObject (oSheet);
Sistem.Runtime.InteropServices.Marshal.ReleaseComObject (oWB);
oLembar=batal;
oWB=nol;
oXL = nol;
GC.Collect(); // paksakan pembersihan akhir!
string strMachineName = Permintaan.ServerVariables["SERVER_NAME"];
errLabel.Text="Unduh Laporan";
menangkap (Pengecualian Pengecualian)
{
Pesan kesalahan string;
errorMessage = "Kesalahan: ";
errorMessage = String.Concat( errorMessage, theException.Message );
errorMessage = String.Concat( errorMessage, " Baris: " );
errorMessage = String.Concat( errorMessage, theException.Source );
errLabel.Teks= Pesan kesalahan;
}
}
Versi Ramah Printer
oWB.Tutup(null,null,null);
oXL.Buku Kerja.Tutup();
oXL.Keluar();
Sistem.Runtime.InteropServices.Marshal.ReleaseComObject (oRng);
Sistem.Runtime.InteropServices.Marshal.ReleaseComObject (oXL);
Sistem.Runtime.InteropServices.Marshal.ReleaseComObject (oSheet);
Sistem.Runtime.InteropServices.Marshal.ReleaseComObject (oWB);
oLembar=batal;
oWB=nol;
oXL = nol;
GC.Collect(); // paksakan pembersihan akhir!
{
string strCurrentDir = Server.MapPath(".") + "\";
RemoveFiles(strCurrentDir); // metode utilitas untuk membersihkan file lama
Excel.Aplikasi oXL;
Excel._Buku Kerja oWB;
Excel._Lembar Kerja oLembar;
{
GC.Collect();// bersihkan semua orang excel lain yang berkeliaran...
oXL = Excel.Aplikasi baru();
oXL.Terlihat = salah;
//Dapatkan buku kerja baru.
oWB = (Excel._Workbook)(oXL.Workbooks.Add( Missing.Value ));
oSheet = (Excel._Worksheet)oWB.ActiveSheet;
//dapatkan string Data kami
SPGen sg = SPGen baru(strConnect,spName,parms);
SqlDataReader myReader = sg.RunReader();
// Buat Header dan lembar...
int iRow =2;
untuk(int j=0;j
oSheet.Sel[1, j+1] = myReader.GetName(j).ToString();
}
// membuat isi sheet
sementara (Pembacaku.Baca())
{
untuk(int k=0;k < myReader.FieldCount;k++)
{
oSheet.Cells[iRow,k+1]= myReader.GetValue(k).ToString();
}
iRow++;
}//akhiri sementara
myReader.Tutup();
pembaca saya=batal;
//Format A1:Z1 tebal, perataan vertikal = tengah.
oSheet.get_Range("A1", "Z1").Font.Bold = true;
oSheet.get_Range("A1", "Z1").VerticalAlignment =Excel.XlVAlign.xlVAlignCenter;
//Paskan Otomatis kolom A:Z.
oRng = oSheet.get_Range("A1", "Z1");
oRng.EntireColumn.AutoFit();
oXL.Terlihat = salah;
oXL.UserControl = salah;
string strFile ="laporan" + Sistem.DateTime.Sekarang.Ticks.ToString() +".xls";
oWB.SaveAs( strCurrentDir + strFile,Excel.XlFileFormat.xlWorkbookNormal,
null,null,false,false,Excel.XlSaveAsAccessMode.xlBerbagi,false,false,null,null,null);
// Butuh semua kode berikut untuk membersihkan dan mematikan semua referensi!!!
oWB.Tutup(null,null,null);
oXL.Buku Kerja.Tutup();
oXL.Keluar();
Sistem.Runtime.InteropServices.Marshal.ReleaseComObject (oRng);
Sistem.Runtime.InteropServices.Marshal.ReleaseComObject (oXL);
Sistem.Runtime.InteropServices.Marshal.ReleaseComObject (oSheet);
Sistem.Runtime.InteropServices.Marshal.ReleaseComObject (oWB);
oLembar=batal;
oWB=nol;
oXL = nol;
GC.Collect(); // paksakan pembersihan akhir!
string strMachineName = Permintaan.ServerVariables["SERVER_NAME"];
errLabel.Text="Unduh Laporan";
menangkap (Pengecualian Pengecualian)
{
Pesan kesalahan string;
errorMessage = "Kesalahan: ";
errorMessage = String.Concat( errorMessage, theException.Message );
errorMessage = String.Concat( errorMessage, " Baris: " );
errorMessage = String.Concat( errorMessage, theException.Source );
errLabel.Teks= Pesan kesalahan;
}
}
-Diterjemahkan dengan tergesa-gesa, mohon maaf jika ada kesalahan. Selamat datang untuk memberikan saran dan diskusi---Xiao Xu