Artikel ini menjelaskan metode mengekspor Excel oleh JavaScript. Bagikan untuk referensi Anda. Metode implementasi spesifik adalah sebagai berikut:
Salinan kode adalah sebagai berikut: <html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv = "konten tipe" content = "text/html; charset = utf-8"/>
<Title> Cara mengekspor halaman web sebagai dokumen Excel </iteme>
</head>
<body>
<Table id = "TableExcel" CellPacing = "0" CellPadding = "0">
<tr>
<td colspan = "5" align = "center"> Cara mengekspor halaman web sebagai dokumen excel </td>
</tr>
<tr>
<td> Judul kolom 1 </td>
<td> Judul kolom 2 </td>
<td> Judul kolom 3 </td>
<td> Judul kolom 4 </td>
<td> Judul kolom 5 </td>
</tr>
<tr>
<td> aaa </td>
<td> bbb </td>
<td> ccc </td>
<td> ddd </td>
<td> ee </td>
</tr>
<tr>
<td> aaa </td>
<td> bbb </td>
<td> ccc </td>
<td> ddd </td>
<td> eee </td>
</tr>
<tr>
<td> fff </td>
<td> ggg </td>
<td> hhh </td>
<td> iii </td>
<td> jjj </td>
</tr>
</boable>
<input type = "tombol" onclick = "javascript: method1 ('TableExcel');" value = "Metode pertama diimpor ke excel">
<input type = "tombol" ontClick = "javascript: method2 ('TableExcel');" value = "Metode kedua diimpor ke excel">
<input type = "tombol" onclick = "javascript: getxlsfromtbl ('tableExcel', null);" value = "Metode ketiga diimpor ke excel">
<Bahasa skrip = "javascript">
Metode Fungsi1 (TableId) {// Salin seluruh tabel ke Excel
var curtbl = document.getElementByIdx_x_x (TableId);
var oxl = ActivexObject baru ("Excel.Application");
// Buat Objek Ax Excel
var owb = oxl.workbooks.add ();
// Dapatkan objek buku kerja
var osheet = owb.activesheet;
// Aktifkan lembar saat ini
var sel = document.body.createTextrange ();
sel.movetoeLementText (CurtBl);
// Pindahkan konten dalam tabel ke Textrange
sel.select ();
// Pilih semua konten di Textrange
sel.execCommand ("copy");
// Salin konten di Textrange
osheet.paste ();
// Tempel ke Excel aktif
oxl.visible = true;
// atur atribut yang terlihat excel
}
Metode Fungsi2 (TableID) // Baca setiap sel dalam tabel menjadi Excel
{
var curtbl = document.getElementByIdx_x_x (TableId);
var oxl = ActivexObject baru ("Excel.Application");
// Buat Objek Ax Excel
var owb = oxl.workbooks.add ();
// Dapatkan objek buku kerja
var osheet = owb.activesheet;
// Aktifkan lembar saat ini
var lenr = curtbl.rows.length;
// Dapatkan jumlah baris di tabel
untuk (i = 0; i <lenr; i ++)
{
var lenc = curtbl.rows (i) .cells.length;
// Dapatkan jumlah kolom per baris
untuk (j = 0; j <lenc; j ++)
{
osheet.cells (i + 1, j + 1) .value = Curtbl.rows (i) .cells (j) .innerText;
//Penugasan
}
}
oxl.visible = true;
// atur atribut yang terlihat excel
}
fungsi getxlsfromtbl (intblid, inwindow) {
mencoba {
var allstr = "";
var curstr = "";
// alert ("getxlsfromtbl");
if (intblid! = null && intblid! = "" && intblid! = "null") {
Curstr = getTblData (intblid, inwindow);
}
if (curstr! = null) {
allstr += Curstr;
}
kalau tidak {
peringatan ("Tabel yang ingin Anda ekspor tidak ada!");
kembali;
}
var filename = getExcelfilename ();
dofileExport (nama file, allstr);
}
Catch (e) {
alert ("Pengecualian terjadi di Ekspor:" + E.Name + "->" + E.Description + "!");
}
}
fungsi getTblData (intbl, inwindow) {
var baris = 0;
// alert ("getTblData adalah" + inwindow);
var tblDocument = dokumen;
if (!! inwindow && inwindow! = "") {
if (! document.all (inwindow)) {
kembali nol;
}
kalau tidak {
tblDocument = eval_r (inwindow) .document;
}
}
var curtbl = tbldocument.getElementByIdx_x_x (intbl);
var outstr = "";
if (curtbl! = null) {
untuk (var j = 0; j <curtbl.rows.length; j ++) {
// alert ("j is" + j);
untuk (var i = 0; i <curtbl.rows [j] .cells.length; i ++) {
// peringatan ("I is" + i);
if (i == 0 && baris> 0) {
outstr += "";
Baris -= 1;
}
outstr + = curtbl.rows [j] .cells [i] .innerText + "";
if (curtbl.rows [j] .cells [i] .colspan> 1) {
untuk (var k = 0; k <curtbl.rows [j] .cells [i] .colspan - 1; k ++) {
outstr += "";
}
}
if (i == 0) {
if (baris == 0 && curtbl.rows [j] .cells [i] .rowspan> 1) {
baris = CurtBl.rows [j] .cells [i] .rowspan - 1;
}
}
}
outstr += "";
}
}
kalau tidak {
outstr = null;
peringatan (intbl + "tidak ada!");
}
kembali outstr;
}
fungsi getexcelfilename () {
var d = tanggal baru ();
var curyear = d.getYear ();
var curmonth = "" + (d.getMonth () + 1);
var curdate = "" + d.getDate ();
var curhour = "" + d.getHours ();
var curminute = "" + d.getMinutes ();
var cursecond = "" + d.getSeconds ();
if (curmonth.length == 1) {
Curmonth = "0" + Kurmonth;
}
if (curdate.length == 1) {
CURDATE = "0" + CURDATE;
}
if (curhour.length == 1) {
Curhour = "0" + Curhour;
}
if (curminute.length == 1) {
curminute = "0" + curminute;
}
if (cursecond.length == 1) {
Cursecond = "0" + Cursecond;
}
var filename = "leo_zhang" + "_" + Curyear + Curmonth + Curdate + "_"
+ Curhour + curminute + cursecond + ".csv";
// peringatan (nama file);
Kembalikan nama file;
}
fungsi dofileExport (Inname, instr) {
var xlswin = null;
if (!! document.all ("glbhidefrm")) {
xlswin = glbHidefrm;
}
kalau tidak {
var width = 6;
var tinggi = 4;
var openpara = "left =" + (window.screen.width / 2 - width / 2)
+ ", top =" + (window.screen.height / 2 - tinggi / 2)
+ ", scrollbars = tidak, lebar =" + lebar + ", tinggi =" + tinggi;
xlswin = window.open ("", "_blank", openpara);
}
xlswin.document.write (instr);
xlswin.document.close ();
xlswin.document.execCommand ('saveas', true, inname);
xlswin.close ();
}
</script>
</body>
</html>
Berikut ini adalah masalah menangani penutupan proses Excel
Salin kode sebagai berikut: // Masalah Penghancuran di JavaScript (Contoh Objek ActiveX)
// ---------------------------------------------------------
<script>
var strsavelocation = 'file: /// e: /1.xls'
function createxls () {
var excel = new ActivexObject ("Excel.Application");
var wk = excel.workbooks.add ();
wk.saveas (strsavelocation);
wk.saved = true;
excel.quit ();
}
function writexls () {
var excel = new ActivexObject ("Excel.Application");
var wk = excel.workbooks.open (strsavelocation);
var sheet = wk.worksheets (1);
sheet.cells (1, 1) .value = 'test string';
wk.saveas (strsavelocation);
wk.saved = true;
excel.quit ();
}
</script>
<body>
<Tombol OnClick = "Createxls ()"> Buat </button>
<tombol OnClick = "writexls ()"> REWRITE </tombol>
</body>
Dalam contoh ini, tidak ada pengecualian saat mengoperasikan file lokal. -Di sebagian besar, hanya ada beberapa sampah memori. Namun, jika Strsavelocation adalah URL jarak jauh, kredensial akses file lokal akan disimpan, dan hanya satu instance (jarak jauh) yang dapat digunakan untuk mengaktifkan dokumen Excel dan menyimpannya. Jadi, jika Anda mengklik tombol "Tulis ulang" berulang kali, pengecualian akan muncul.
- Perhatikan bahwa ini adalah kode yang disederhanakan untuk contoh file bersama saat beroperasi di SPS. Oleh karena itu, ini bukan diskusi membosankan "akademis", dan ini adalah masalah praktis dalam teknik.
Solusi untuk masalah ini rumit. Ini melibatkan dua masalah:
① rilis voucher lokal
② Rilis instance objek ActiveX
Mari kita mulai dengan masalah "kegagalan" objek di JavaScript. Sederhananya:
① Objek akan tidak valid di luar konteks di mana ia tinggal.
② Objek global akan tidak valid jika tidak dieksekusi (direferensikan).
Misalnya:
Salin kode sebagai berikut: // ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Kapan objek JavaScript akan gagal
// ---------------------------------------------------------
function testObject () {
var _obj1 = objek baru ();
}
function testObject2 () {
var _obj2 = objek baru ();
mengembalikan _obj2;
}
// Contoh 1
testObject ();
// Contoh 2
testObject2 ()
// Contoh 3
var obj3 = testObject2 ();
obj3 = null;
// Contoh 4
var obj4 = testObject2 ();
var arr = [obj4];
obj3 = null;
arr = [];
Dalam empat contoh ini:
- "Contoh 1" Konstruksi _OBJ1 Dalam fungsi testObject (), tetapi ketika fungsi keluar, ia telah meninggalkan konteks fungsi, jadi _OBJ1 tidak valid;
- Dalam "Contoh 2", objek _OBJ2 juga dibangun di testObject2 () dan pingsan, sehingga objek memiliki lingkungan konteks (dan seumur hidup) "di luar fungsi", tetapi karena nilai pengembalian fungsi tidak "dipegang" oleh variabel lain, _OBJ2 segera tidak valid;
- Dalam "Contoh 3", _OBJ2 yang dibangun oleh TestObject2 () dipegang oleh variabel eksternal OBJ3. Pada saat ini, sampai baris kode "OBJ3 = NULL" berlaku, _OBJ2 tidak akan tidak valid karena hubungan referensi menghilang.
- Untuk alasan yang sama seperti pada Contoh 3, _obj2 dalam "Contoh 4" tidak akan tidak valid setelah baris kode "arr = []".
Namun, "kegagalan" objek tidak menunggu untuk "dirilis". Di dalam runtime JavaScript, tidak ada cara untuk memberi tahu pengguna dengan tepat "kapan objek akan dirilis". Ini tergantung pada mekanisme pemulihan memori JavaScript. - Strategi ini mirip dengan mekanisme daur ulang di .NET.
Dalam kode contoh operasi Excel sebelumnya, pemilik objek, yaitu, "excel.exe", hanya akan terjadi setelah "rilis instance objek ActiveX". Kunci file dan kredensial izin sistem operasi terkait dengan proses tersebut. Jadi jika objek hanya "gagal" dan bukan "rilis", maka proses lain akan memiliki masalah saat memproses file dan merujuk pada kredensial izin sistem operasi.
- Beberapa orang mengatakan ini adalah bug dalam mekanisme JavaScript atau COM. Sebenarnya, tidak. Ini disebabkan oleh hubungan yang kompleks antara OS, IE dan JavaScript, bukan masalah independen.
Microsoft telah mengekspos strategi untuk menyelesaikan masalah ini: secara proaktif memanggil proses daur ulang memori.
Proses CollectGarBage () (biasanya disebut sebagai proses GC) disediakan di (Microsoft) JScript. Proses GC digunakan untuk membersihkan "misalignment objek yang gagal" di IE saat ini, yaitu, proses destruktor menyebut objek.
Dalam contoh di atas, kode yang memanggil prosedur GC adalah:
Salin kode sebagai berikut: // ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Metode Panggilan Standar Prosedur GC Saat Memproses Objek ActiveX
// ---------------------------------------------------------
function writexls () {
//(agak...)
excel.quit ();
excel = null;
setTimeout (CollectGarBage, 1);
}
Baris kode pertama memanggil metode Excel.Quit () untuk membuat proses Excel dibatalkan dan keluar. Pada saat ini, karena lingkungan JavaScript memiliki instance objek Excel, proses Excel tidak benar -benar dibatalkan.
Baris kode kedua membuat Excel null untuk menghapus referensi objek, sehingga "membatalkan" objek. Namun, karena objek masih dalam konteks fungsi, jika prosedur GC dipanggil secara langsung, objek masih tidak akan dibersihkan.
Baris kedua kode menggunakan setTimeout () untuk memanggil fungsi CollectGarBage, dan interval waktu diatur ke '1', yang hanya membuat proses GC terjadi setelah fungsi writexls () dijalankan. Dengan cara ini, objek Excel memenuhi dua kondisi "dapat dibersihkan oleh GC": tidak ada referensi dan meninggalkan konteks.
Penggunaan prosedur GC sangat efektif di lingkungan JS menggunakan objek ActiveX. Beberapa objek ActiveX potensial termasuk XML, VML, OWC (Office Web Componet), Flash, dan bahkan Vbarray di JS.
Dari sudut pandang ini, karena arsitektur AJAX mengadopsi XMLHTTP dan juga perlu memenuhi fitur "No Page Switching", secara aktif memanggil proses GC pada waktu yang tepat akan memberi Anda pengalaman efisiensi yang lebih baik menggunakan UI.
Bahkan, bahkan dengan proses GC, masalah Excel yang disebutkan di atas tidak akan sepenuhnya terpecahkan. Karena IE juga menyimpan kredensial izin. Satu -satunya cara untuk membuat kredensial izin halaman diperbarui adalah dengan "beralih ke halaman baru", jadi pada kenyataannya, dalam proyek SPS yang disebutkan sebelumnya, metode yang saya gunakan bukan GC, tetapi kode berikut:
Salin kode sebagai berikut: // ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Kode switching halaman digunakan saat memproses objek ActiveX
// ---------------------------------------------------------
function writexls () {
//(agak...)
excel.quit ();
excel = null;
// Kode berikut digunakan untuk menyelesaikan bug di IE Call Excel, metode yang disediakan di MSDN:
// setTimeout (CollectGarBage, 1);
// Karena keadaan tepercaya dari halaman web tidak dapat dihapus (atau disinkronkan) akan menyebabkan saveas () dan metode lainnya menjadi
// tidak valid lain kali Anda menyebutnya.
location.reload ();
}
Akhirnya, catatan tambahan tentang GC: Ketika formulir IE diminimalkan, IE akan secara aktif menyebutnya sekali.
Fungsi CollectGarBage (). Ini membuat penggunaan memori meningkat secara signifikan setelah jendela IE diminimalkan.
Saya berharap deskripsi dalam artikel ini akan bermanfaat untuk pemrograman web semua orang berdasarkan JavaScript.