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 <identity impersonate ="true" ... di file konfigurasi. Anda masih memerlukan akses tulis ke daftar kontrol akses (ACL) folder fisik, hanya agar identitas halaman yang Anda jalankan memiliki akses tulis. Terakhir, Anda perlu menyiapkan koneksi COM ke pustaka tipe Excel 9.0 atau Excel 10 , VS.NET Majelis akan dibuat untuk Anda. Saya yakin Microsoft memiliki tautan di situs web Office mereka untuk mengunduh perakitan awal Microsoft. (Ini mungkin tidak akurat, menurut pemahaman saya ini adalah perakitan untuk .net)
<identitas impersonate="true" userName="adminuser" password="adminpass" />
Berikan perhatian khusus pada blok kode berikut, yang menghapus objek Excel.
// 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!
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 )
{
string strCurrentDir = Server.MapPath(".") + "\";
RemoveFiles(strCurrentDir); // metode utilitas untuk membersihkan file lama
Excel.Aplikasi oXL;
Excel._Buku Kerja oWB;
Excel._Lembar Kerja oLembar;
Excel.Range
oRng;
{
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
strConnect = System.Configuration.ConfigurationSettings.AppSettings["connectString"];
SPGen sg = SPGen baru(strConnect,spName,parms);
SqlDataReader myReader = sg.RunReader();
// Buat Header dan lembar...
int iRow =2;
untuk(int j=0;j<myReader.FieldCount;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="<A href=http://" + strMachineName +"/ExcelGen/" +strFile + ">Unduh Laporan</a>";
}
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;
}
}
Berikut ini adalah artikel asli Membuat
Buku Kerja Excel ASP.NET Dinamis Dalam C#
Oleh Peter A. Bromberg, Ph.D.
Versi Ramah Printer
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 <identity impersonate ="true" .... Anda mungkin juga perlu mengaktifkan izin ACL pada folder fisik sehingga identitas yang dijalankan halaman tersebut memiliki izin menulis Referensi COM ke perpustakaan Tipe Excel 9.0 atau Excel 10 dan biarkan VS.NET menghasilkan rakitan Interop untuk Anda. Saya yakin MS juga memiliki tautan di situs Office mereka tempat Anda dapat mengunduh Rakitan Interop utama Office.
<identitas impersonate="true" userName="adminuser" password="adminpass" />
Perhatikan khususnya blok kode yang melakukan "pembersihan" objek Excel:
// Perlu 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!
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)
{
string strCurrentDir = Server.MapPath(".") + "\";
RemoveFiles(strCurrentDir); // metode utilitas untuk membersihkan file lama
Excel.Aplikasi oXL;
Excel._Buku Kerja oWB;
Excel._Lembar Kerja oLembar;
Excel.Range
oRng;
{
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
strConnect = System.Configuration.ConfigurationSettings.AppSettings["connectString"];
SPGen sg = SPGen baru(strConnect,spName,parms);
SqlDataReader myReader = sg.RunReader();
// Buat Header dan lembar...
int iRow =2;
untuk(int j=0;j<myReader.FieldCount;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="<A href=http://" + strMachineName +"/ExcelGen/" +strFile + ">Unduh Laporan</a>";
}
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
http://macroxu-1982.cnblogs.com/archive/2006/05/31/413879.html