JavaScript导出Excel实例详解

前端之家收集整理的这篇文章主要介绍了JavaScript导出Excel实例详解前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

本文实例讲述了JavaScript导出Excel的方法分享给大家供大家参考。具体实现方法如下:

代码如下:
<Meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> WEB<a href="/tag/yemian/" target="_blank" class="keywords">页面</a>导出为EXCEL文档的<a href="/tag/fangfa/" target="_blank" class="keywords">方法</a> 页面导出为EXCEL文档的方法标题1标题2标题3标题4标题5方法导入到EXCEL"> 方法导入到EXCEL"> 方法导入到EXCEL">

下面是处理excel 进程关闭问题

代码如下:
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 = '测试字符串'; wk.SaveAs(strSaveLocation); wk.Saved = true;

excel.Quit(); }

在这个例子中,在本地文件操作时并不会出现异常。——最多只是有一些内存垃圾而已。然而,如果strSaveLocation是一个远程的URL,这时本地将会保存一个文件存取权限的凭证,而且同时只能一个(远程的)实例来开启该excel文档并存储。于是如果反复点击"重写"按钮,就会出现异常。

——注意,这是在SPS中操作共享文件时的一个实例的简化代码。因此,它并非“学术的”无聊讨论,而且工程中的实际问题。

解决这个问题的方法很复杂。它涉及到两个问题: ① 本地凭证的释放 ② ActiveX Object实例的释放

下面我们先从JavaScript中对象的“失效”问题说起。简单的说: ① 一个对象在其生存的上下文环境之外,即会失效。 ② 一个全局的对象在没有被执用(引用)的情况下,即会失效。

例如:

代码如下:

function testObject2() { var _obj2 = new Object(); return _obj2; }

// 示例1 testObject();

// 示例2 testObject2()

// 示例3 var obj3 = testObject2(); obj3 = null;

// 示例4 var obj4 = testObject2(); var arr = [obj4]; obj3 = null; arr = [];

在这四个示例中: - “示例1”在函数testObject()中构造了_obj1,但是在函数退出时,它就已经离开了函数的上下文环境,因此_obj1失效了; - “示例2”中,testObject2()中也构造了一个对象_obj2并传出,因此对象有了“函数外”的上下文环境(和生存周期),然而由于函数的返回值没有被其它变量“持有”,因此_obj2也立即失效了; - “示例3”中,testObject2()构造的_obj2被外部的变量obj3持用了,这时,直到“obj3=null”这行代码生效时,_obj2才会因为引用关系消失而失效。 - 与示例3相同的原因,“示例4”中的_obj2会在“arr=[]”这行代码之后才会失效。

但是,对象的“失效”并不等会“释放”。在JavaScript运行环境的内部,没有任何方式来确切地告诉用户“对象什么时候会释放”。这依赖于JavaScript的内存回收机制。——这种策略与.NET中的回收机制是类同的。

在前面的Excel操作示例代码中,对象的所有者,也就是"EXCEL.EXE"这个进程只能在“ActiveX Object实例的释放”之后才会发生。而文件的锁,以及操作系统的权限凭证是与进程相关的。因此如果对象仅是“失效”而不是“释放”,那么其它进程处理文件和引用操作系统的权限凭据时就会出问题。

——有些人说这是JavaScript或者COM机制的BUG。其实不是,这是OS、IE和JavaScript之间的一种复杂关系所导致的,而非独立的问题。

Microsoft公开了解决这种问题的策略:主动调用内存回收过程。

在(微软的)JScript中提供了一个CollectGarbage()过程(通常简称GC过程),GC过程用于清理当前IE中的“失效的对象失例”,也就是调用对象的析构过程。

在上例中调用GC过程的代码是:

代码如下:
调用方式 //--------------------------------------------------------- function writeXLS() { //(略...)

excel.Quit(); excel = null; setTimeout(CollectGarbage,1); }

第一行代码调用excel.Quit()方法来使得excel进程中止并退出,这时由于JavaScript环境执有excel对象实例,因此excel进程并不实际中止。

第二行代码使excel为null,以清除对象引用,从而使对象“失效”。然而由于对象仍旧在函数上下文环境中,因此如果直接调用GC过程,对象仍然不会被清理。

第三行代码使用setTimeout()来调用CollectGarbage函数,时间间隔设为'1',只是使得GC过程发生在writeXLS()函数执行完之后。这样excel对象就满足了“能被GC清理”的两个条件:没有引用和离开上下文环境。

GC过程的使用,在使用了ActiveX Object的JS环境中很有效。一些潜在的ActiveX Object包括XML、VML、OWC(Office Web Componet)、flash,甚至包括在JS中的VBArray。

从这一点来看,ajax架构由于采用了XMLHTTP,并且同时要满足“不切换页面”的特性,因此在适当的时候主动调用GC过程,会得到更好的效率用UI体验。

事实上,即使使用GC过程,前面提到的excel问题仍然不会被完全解决。因为IE还缓存了权限凭据。使页的权限凭据被更新的唯一方法,只能是“切换到新的页面”,因此事实上在前面提到的那个SPS项目中,我采用的方法并不是GC,而是下面这一段代码

代码如下:
页面切换代码 //--------------------------------------------------------- function writeXLS() { //(略...)

excel.Quit(); excel = null;

// 下面代码用于解决IE call Excel的一个BUG,MSDN中提供的方法:
// setTimeout(CollectGarbage,1);
// 由于不能清除(或同步)网页的受信任状态,所以将导致SaveAs()等方法
// 下次调用时无效.
location.reload();
}

最后之最后,关于GC的一个补充说明:在IE窗体被最小化时,IE将会主动调用一次 CollectGarbage()函数。这使得IE窗口在最小化之后,内存占用会有明显改善。

希望本文所述对大家基于javascript的web程序设计有所帮助。

猜你在找的JavaScript相关文章