指令碼、執行個體代碼、ie安全設定註冊表及執行個體添加信任網站註冊表:http://ded.nuaa.edu.cn/Download/excel.rar
做web開發大家都遇到過列印的問題,對於複雜的表格列印著實令人頭痛,這片文章介紹一下使用excel列印的解決方案。
首先,如果用戶端調用excel必須降低ie安全層級,這樣一些非法的控制項,如3721什麼的都自動安裝了,所以我這樣解決:保持原來的ie設定,把你的網站添加到信任網站,然後更改安全網站的安全層級,這樣就給你的網站設定了一個安全通道,而且阻止了3721等的非法入侵,當然前提是你要讓你的客戶下載一個註冊表並安裝,我是自己做,自己用,所以我得使用者是我說什麼都跟著我做,你們就需要說服客戶了:)。
好,那麼下一步就是如何?列印了,這裡我有非常奪得報表,而且一些非常複雜,如學產生績單,需要按照學年、學期計算學分績點,列印照片,學位授予情況,學籍處理情況,四六級成績,實習,輔修成績,實踐等,那麼我如何把這些資訊完整的列印到用戶端就是非常麻煩的了,所有我用excel,先做一個模版,然後調用模版填充資料,問題又來了,這麼多資料怎麼組織呢,摸索好長時間,突然有個想法,把資料的提取單獨寫一個對象,這樣我的程式就簡潔多了,而且最好的是我任何地方都可以一樣使用它。還說成績單,資料非常大,多的要150條資料,所以我的資料來源選擇了表格,這樣不必費力的產生什麼xml了,顯示的就是我要的資料。ok介紹一下Gettabledata.js:它就是我要的資料對象了,主要功能是從table中提取資料(GetTableData),並提供一個輸出資料的方法(getfielddata),這個準系統可以滿足我多數的需求。這個我自己寫的一個簡介,怕以後我忘了的:),大家看看有什麼不清楚的我補充一下。
//Obj參數指定資料的來源(限定Table),預設第一行為欄位名稱行
//MoveNext方法,參數是表的行向上或向下移動的位元,正數向下移動,負數向上.如.MoveNext(1),.MoveNext(-1)
//GetFieldData方法獲得當前行的指定的列名的數,據如:.GetFieldData("考試成績"):列名.GetFieldData(1):索引
//Sort_desc方法對指定的列按降序排列,如.Sort_desc("學年","學期")
//Sort_asc方法對指定的列按升序排列,如.Sort_asc("考試成績:number"):":"後面的參數制定改列資料類型,此例為數字
//GetData方法返回欄位值為特定值的資料數組,如果沒有欄位值則返回所有該欄位記錄.可以在外部進行其他處理,不建議直接處理資料:如.GetData()
//Delete方法刪除目前記錄,數組減少一行,如:.Delete
//updateField更新當前行的指定的索引資料(索引如果是數字,則是列的索引,為字元,是資料欄位的名稱)如:MyData.UpdateField("課程號",MyData.GetFieldData("原課程號"))
//MoveFirst記錄移動到資料的第一條記錄,注意資料從第二行開始,預設第一行為欄位名稱行
//MoveLast記錄移動到資料的最後一條記錄
//Distinct返回所選記錄的不同記錄的條件個數維數數組,同時升序排序
//初始化,Obj:table的名字,Leftlen:左面多餘資料長度,Rightlen:右面多餘資料長度,
//rows屬性:數組行數,cols:列數
在範例程式碼中Print_bzcjd.js他是列印複雜excel的指令碼,
var xlBook = xls.Workbooks.Open("c:\\xsxycjb.xls");
var xlsheet = xlBook.Worksheets(1)
這個可是使用網路模板,
var xlBook = xls.Workbooks.Open("http://you.com/\PrintTemplates\\xsxycjb.xls");
var xlsheet = xlBook.Worksheets(1)
這個力例子中基本把excel列印需要的技術都展示出來了,片,退出什麼的。
這裡要說明的是table的資料可以是隱藏的,不顯示也可以取出,這樣就可以增加很多資料進來,又不影響介面。
Excel.js:這個是清理excel的指令碼,當結束excel進程的時候它還沒有推出,清理一下,這個就沒有vs好了:(。
這個是一個簡單的樣本,就是你給他一個表格名字就可以了,然後產生一個表格,就是這樣:MakeExcel("TABLE1",true,"1.xls"),其他參數可以不要。
function MakeExcel(Obj,ProceVisible,SaveAsFilename,SortType,SortField){
var MyData= new GetTableData(Obj,0,0);
var myrows=MyData.rows;
var i,j;
try {
var xls = new ActiveXObject ( "Excel.Application" );
}
catch(e) {
alert( "要列印該表,您必須安裝Excel試算表軟體,同時瀏覽器須使用“ActiveX 控制項”,您的瀏覽器須允許執行控制項。 請點擊【協助】瞭解瀏覽器設定方法!");
return "";
}
if (typeof(ProceVisible)=="undefined"){
xls.visible = true;
}
else{
if (ProceVisible=="true"){
xls.visible = true;
}
else
{
xls.visible = false;
}
}
var xlBook = xls.Workbooks.Add;
var xlsheet = xlBook.Worksheets(1);
xls.Cells.Select;
xls.Selection.NumberFormatLocal = "@";
for (i=0;i<MyData.rows ;i++){
for (j=0;j<MyData.cols ;j++){
if (typeof(MyData.GetFieldData(j)) == "number"){
xlsheet.Cells(i+1,j+1).NumberFormatLocal = "0.00_ ";
}
xlsheet.Cells(i+1,j+1).Value= MyData.GetFieldData(j);
}
MyData.MoveNext();
}
if (SaveAsFilename=="" || typeof(SaveAsFilename)=="undefined"){
var fname = xls.Application.GetSaveAsFilename("*.xls", "Excel Spreadsheets (*.xls), *.xls");
if (fname!=""){
xlBook.SaveAs(fname);
}
}
else{
xlBook.SaveAs(SaveAsFilename);
}
xlBook.Close (savechanges=false);
//xls.visible = false;
xls.Quit();
xls=null;
//結束excel進程,退出完成
window.setInterval("Cleanup();",1);
}