0

0

JavaScript导出Excel实例详解_javascript技巧

php中文网

php中文网

发布时间:2016-05-16 16:30:18

|

1999人浏览过

|

来源于php中文网

原创

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

复制代码 代码如下:



WEB页面导出为EXCEL文档的方法


































WEB页面导出为EXCEL文档的方法
列标题1 列标题2 列标题3 列标题4 列标题5
aaa bbb ccc ddd eee
AAA BBB CCC DDD EEE
FFF GGG HHH III JJJ




<script language="javascript"><br> function method1(tableid) {//整个表格拷贝到EXCEL中<br> var curTbl = document.getElementByIdx_x_x(tableid);<br> var oXL = new ActiveXObject("Excel.Application");<br> //创建AX对象excel<br> var oWB = oXL.Workbooks.Add();<br> //获取workbook对象<br> var oSheet = oWB.ActiveSheet;<br> //激活当前sheet<br> var sel = document.body.createTextRange();<br> sel.moveToElementText(curTbl);<br> //把表格中的内容移到TextRange中<br> sel.select();<br> //全选TextRange中内容<br> sel.execCommand("Copy");<br> //复制TextRange中内容<br> oSheet.Paste();<br> //粘贴到活动的EXCEL中<br> oXL.Visible = true;<br> //设置excel可见属性<br> }<br> function method2(tableid) //读取表格中每个单元到EXCEL中<br> {<br> var curTbl = document.getElementByIdx_x_x(tableid);<br> var oXL = new ActiveXObject("Excel.Application");<br> //创建AX对象excel<br> var oWB = oXL.Workbooks.Add();<br> //获取workbook对象<br> var oSheet = oWB.ActiveSheet;<br> //激活当前sheet<br> var Lenr = curTbl.rows.length;<br> //取得表格行数<br> for (i = 0; i < Lenr; i++)<br> {<br> var Lenc = curTbl.rows(i).cells.length;<br> //取得每行的列数<br> for (j = 0; j < Lenc; j++)<br> {<br> oSheet.Cells(i + 1, j + 1).value = curTbl.rows(i).cells(j).innerText;<br> //赋值<br> }<br> }<br> oXL.Visible = true;<br> //设置excel可见属性<br> }<br> function getXlsFromTbl(inTblId, inWindow) {<br> try {<br> var allStr = "";<br> var curStr = "";<br> //alert("getXlsFromTbl");<br> if (inTblId != null && inTblId != "" && inTblId != "null") {<br> curStr = getTblData(inTblId, inWindow);<br> }<br> if (curStr != null) {<br> allStr += curStr;<br> }<br> else {<br> alert("你要导出的表不存在!");<br> return;<br> }<br> var fileName = getExcelFileName();<br> doFileExport(fileName, allStr);<br> }<br> catch(e) {<br> alert("导出发生异常:" + e.name + "->" + e.description + "!");<br> }<br> }<br> function getTblData(inTbl, inWindow) {<br> var rows = 0;<br> //alert("getTblData is " + inWindow);<br> var tblDocument = document;<br> if (!!inWindow && inWindow != "") {<br> if (!document.all(inWindow)) {<br> return null;<br> }<br> else {<br> tblDocument = eval_r(inWindow).document;<br> }<br> }<br> var curTbl = tbldocument.getElementByIdx_x_x(inTbl);<br> var outStr = "";<br> if (curTbl != null) {<br> for (var j = 0; j < curTbl.rows.length; j++) {<br> //alert("j is " + j);<br> for (var i = 0; i < curTbl.rows[j].cells.length; i++) {<br> //alert("i is " + i);<br> if (i == 0 && rows > 0) {<br> outStr += "  ";<br> rows -= 1;<br> }<br> outStr += curTbl.rows[j].cells[i].innerText + " ";<br> if (curTbl.rows[j].cells[i].colSpan > 1) {<br> for (var k = 0; k < curTbl.rows[j].cells[i].colSpan - 1; k++) {<br> outStr += "  ";<br> }<br> } <p>if (i == 0) {<br> if (rows == 0 && curTbl.rows[j].cells[i].rowSpan > 1) {<br> rows = curTbl.rows[j].cells[i].rowSpan - 1;<br> }<br> }<br> }<br> outStr += " ";<br> }<br> }<br> else {<br> outStr = null;<br> alert(inTbl + "不存在!");<br> }<br> return outStr;<br> } <p>function getExcelFileName() {<br> var d = new Date();<br> var curYear = d.getYear();<br> var curMonth = "" + (d.getMonth() + 1);<br> var curDate = "" + d.getDate();<br> var curHour = "" + d.getHours();<br> var curMinute = "" + d.getMinutes();<br> var curSecond = "" + d.getSeconds();<br> if (curMonth.length == 1) {<br> curMonth = "0" + curMonth;<br> } <p>if (curDate.length == 1) {<br> curDate = "0" + curDate;<br> } <p>if (curHour.length == 1) {<br> curHour = "0" + curHour;<br> } <p>if (curMinute.length == 1) {<br> curMinute = "0" + curMinute;<br> } <p>if (curSecond.length == 1) {<br> curSecond = "0" + curSecond;<br> } <p>var fileName = "leo_zhang" + "_" + curYear + curMonth + curDate + "_"<br> + curHour + curMinute + curSecond + ".csv";<br> //alert(fileName);<br> return fileName;<br> } <p>function doFileExport(inName, inStr) {<br> var xlsWin = null;<br> if (!!document.all("glbHideFrm")) {<br> xlsWin = glbHideFrm;<br> } <p>else {<br> var width = 6;<br> var height = 4;<br> var openPara = "left=" + (window.screen.width / 2 - width / 2)<br> + ",top=" + (window.screen.height / 2 - height / 2)<br> + ",scrollbars=no,width=" + width + ",height=" + height;<br> xlsWin = window.open("", "_blank", openPara); <p>}<br> xlsWin.document.write(inStr);<br> xlsWin.document.close();<br> xlsWin.document.execCommand('Saveas', true, inName);<br> xlsWin.close();<br> }<br> </script>

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

复制代码 代码如下:
// JavaScript中的析构问题(ActiveX Object示例)
//---------------------------------------------------------
<script><br> var strSaveLocation = 'file:///E:/1.xls'<br> function createXLS() {<br>   var excel = new ActiveXObject("Excel.Application");<br>   var wk = excel.Workbooks.Add();<br>   wk.SaveAs(strSaveLocation);<br>   wk.Saved = true; <p>  excel.Quit();<br> } <p>function writeXLS() {<br>   var excel = new ActiveXObject("Excel.Application");<br>   var wk = excel.Workbooks.Open(strSaveLocation);<br>   var sheet = wk.Worksheets(1);<br>   sheet.Cells(1, 1).Value = '测试字符串';<br>   wk.SaveAs(strSaveLocation);<br>   wk.Saved = true; <p>  excel.Quit();<br> }<br> </script>


 
 

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

立即学习Java免费学习笔记(深入)”;

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

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

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

例如:

复制代码 代码如下:
//---------------------------------------------------------
// JavaScript对象何时失效
//---------------------------------------------------------
function testObject() {
  var _obj1 = new Object();
}

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之间的一种复杂关系所导致的,而非独立的问题。

Logomaster.ai
Logomaster.ai

Logo在线生成工具

下载

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

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

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

复制代码 代码如下:
//---------------------------------------------------------
// 处理ActiveX Object时,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,而是下面这一段代码:

复制代码 代码如下:
//---------------------------------------------------------
// 处理ActiveX Object时采用的页面切换代码
//---------------------------------------------------------
function writeXLS() {
  //(略...)

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

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

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

相关文章

WPS零基础入门到精通全套教程!
WPS零基础入门到精通全套教程!

全网最新最细最实用WPS零基础入门到精通全套教程!带你真正掌握WPS办公! 内含Excel基础操作、函数设计、数据透视表等

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

21

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

23

2026.03.03

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

77

2026.02.28

Golang 工程化架构设计:可维护与可演进系统构建
Golang 工程化架构设计:可维护与可演进系统构建

Go语言工程化架构设计专注于构建高可维护性、可演进的企业级系统。本专题深入探讨Go项目的目录结构设计、模块划分、依赖管理等核心架构原则,涵盖微服务架构、领域驱动设计(DDD)在Go中的实践应用。通过实战案例解析接口抽象、错误处理、配置管理、日志监控等关键工程化技术,帮助开发者掌握构建稳定、可扩展Go应用的最佳实践方法。

60

2026.02.28

Golang 性能分析与运行时机制:构建高性能程序
Golang 性能分析与运行时机制:构建高性能程序

Go语言以其高效的并发模型和优异的性能表现广泛应用于高并发、高性能场景。其运行时机制包括 Goroutine 调度、内存管理、垃圾回收等方面,深入理解这些机制有助于编写更高效稳定的程序。本专题将系统讲解 Golang 的性能分析工具使用、常见性能瓶颈定位及优化策略,并结合实际案例剖析 Go 程序的运行时行为,帮助开发者掌握构建高性能应用的关键技能。

48

2026.02.28

Golang 并发编程模型与工程实践:从语言特性到系统性能
Golang 并发编程模型与工程实践:从语言特性到系统性能

本专题系统讲解 Golang 并发编程模型,从语言级特性出发,深入理解 goroutine、channel 与调度机制。结合工程实践,分析并发设计模式、性能瓶颈与资源控制策略,帮助将并发能力有效转化为稳定、可扩展的系统性能优势。

26

2026.02.27

Golang 高级特性与最佳实践:提升代码艺术
Golang 高级特性与最佳实践:提升代码艺术

本专题深入剖析 Golang 的高级特性与工程级最佳实践,涵盖并发模型、内存管理、接口设计与错误处理策略。通过真实场景与代码对比,引导从“可运行”走向“高质量”,帮助构建高性能、可扩展、易维护的优雅 Go 代码体系。

20

2026.02.27

Golang 测试与调试专题:确保代码可靠性
Golang 测试与调试专题:确保代码可靠性

本专题聚焦 Golang 的测试与调试体系,系统讲解单元测试、表驱动测试、基准测试与覆盖率分析方法,并深入剖析调试工具与常见问题定位思路。通过实践示例,引导建立可验证、可回归的工程习惯,从而持续提升代码可靠性与可维护性。

4

2026.02.27

漫蛙app官网链接入口
漫蛙app官网链接入口

漫蛙App官网提供多条稳定入口,包括 https://manwa.me、https

387

2026.02.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 5.7万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.3万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号