[讨论]javascript导出excel
浪漫幕末 2008-08-28 10:23:40 下面是在网上找的一段js导excel代码,我做了一些改动。
function htmlToExcel(elTableOut,elDiv){
try{
//设置导出前的数据,为导出后返回格式而设置
var elDivStrBak = elDiv.innerHTML;
//设置table的border=1,这样到excel中就有表格线
elTableOut.border=1;
//过滤elDiv内容
var elDivStr = elDiv.innerHTML;
elDivStr = replaceHtml(elDivStr,"<A",">");
elDivStr = replaceHtml(elDivStr,"</A",">");
elDiv.innerHTML=elDivStr;
var oRangeRef = document.body.createTextRange();
oRangeRef.moveToElementText( elDiv );
oRangeRef.execCommand("Copy"); //复制内容到剪切板
//返回格式变换以前的内容
elDiv.innerHTML = elDivStrBak;
//内容数据可能很大,所以赋空
elDivStrBak = "";
elDivStr = "";
try {
var oXL = new ActiveXObject("Excel.Application")
}
catch(e) {
alert( "需要安装Excel电子表格软件,同时浏览器须使用“ActiveX 控件”,您的浏览器须允许执行控件。");
return "";
}
var oWB = oXL.Workbooks.Add ;
var oSheet = oWB.ActiveSheet ;
oSheet.Paste();
// oSheet.Cells.NumberFormatLocal = "@";#,##0.00
oSheet.Columns("A:A").ColumnWidth=35;
oSheet.Columns("B:B").ColumnWidth=10;
oSheet.Columns("C:C").ColumnWidth=35;
oSheet.Columns("D:D").ColumnWidth=10;
oSheet.Columns(1).NumberFormatLocal="@";
oSheet.Columns(3).NumberFormatLocal="@";
oSheet.Columns(2).NumberFormatLocal="0.00";//设置格式
oSheet.Columns(4).NumberFormatLocal="0.00";
// oXL.Visible = true;
// oXL.UserControl = true;
var fileName;
// do{
fileName = oXL.Application.GetSaveAsFilename("save.xls", "Excel Spreadsheets (*.xls), *.xls");
// }while(fileName==null||fileName=="")
oWB.SaveAs(fileName);
oXL.DisplayAlerts = "False";
oXL.Quit();
oXL = null;
oSheet = null;
oWB = null;
idTmr = window.setInterval("Cleanup();",1000); //回收内存
}catch(e){
oXL = null;
oSheet = null;
oWB = null;
alert(e.description)
oXL.DisplayAlerts = "False";
oXL.Quit();
CollectGarbage();
}
}
function Cleanup() {
window.clearInterval(idTmr);
CollectGarbage();
}
function replaceHtml(replacedStr,repStr,endStr){
var replacedStrF = "";
var replacedStrB = "";
var repStrIndex = replacedStr.indexOf(repStr);
while(repStrIndex != -1){
replacedStrF = replacedStr.substring(0,repStrIndex);
replacedStrB = replacedStr.substring(repStrIndex,replacedStr.length);
replacedStrB = replacedStrB.substring(replacedStrB.indexOf(endStr)+1,replacedStrB.length);
replacedStr = replacedStrF + replacedStrB;
repStrIndex = replacedStr.indexOf(repStr);
}
return replacedStr;
}
在js里用oXL.Application.GetSaveAsFilename("save.xls", "Excel Spreadsheets (*.xls), *.xls");
确实可以调出excel的保存文件对话框,但是这个对话框不是活动的,必须是“显示桌面”,再打开改IE页面,才能看到这个保存对话框。不知道有没有办法让它直接得到焦点。excel进程可以退出,CollectGarbage()回收js内存。
可以直接用SaveAs()方法用固定文件名固定路径保存。只是用户体验不好。欢迎大家讨论。