栏目导航
热点推荐
- 使用JS进行目录上传(相当于批量
- 推荐学习:精通JS正则表达式
- js创建对象的几种常用方式小结(
- jQuery技巧总结
- 10个JavaScript小技巧
- 非常全面的实用JavaScript开发工
- 网站统计之javascript代码加载优
- JS实现广告顺序轮播和随机轮播四
- 使用javascript让页面自适应
- 24小时退弹一次的代码,可弹SP2S
- (Tips&Tricks;)用客户端模板精简J
- js教程:JavaScript作用域(Scope)
阅览排行
使用JavaScript将复杂表格导出为 Excel
www.jz123.cn 2009-09-18 来源: 中国建站 责任编辑(袁袁) 我要投递新闻
使用JavaScript将表格导出为Excel文件是一种比较常见的导出方法,但复杂表格的导出比较麻烦(比如报表的导出),为此我专门写了一段代码专门处理表格导出,与各位分享一下。
util.js: /** * Utilities for exporting a table as an excel file * @author Daniel.Sun(山风小子) * @version 0.6 */ var idTmr = ""; function Cleanup() { window.clearInterval(idTmr); CollectGarbage(); } function exportAsXls(table) { function ImpactedCell(row, col, offset) { this.row = row; this.col = col; this.offset = offset; } function CurrentCell(row, col, text, colspan, rowspan) { this.row = row; this.col = col; this.text = text; this.colspan = colspan; this.rowspan = rowspan; this.getRow = function getRow() { return this.row; } this.setRow = function setRow(row) { this.row = row; } this.getCol = function getCol() { return this.col; } this.setCol = function setCol(col) { this.col = col; } this.setColspan = function setColspan(colspan) { this.colspan = colspan; } this.getColspan = function getColspan() { return this.colspan; } this.setRowspan = function setRowspan(rowspan) { this.rowspan = rowspan; } this.getRowspan = function getRowspan() { return this.rowspan; } } function CellManager(originalRow, colOffset, impactedCells, currentCell) { this.originalRow = originalRow; this.colOffset = colOffset; this.impactedCells = impactedCells; this.currentCell = currentCell; this.setCurrentCell = function setCurrentCell(currentCell) { this.currentCell = currentCell; } this.setOriginalRow = function setOriginalRow(originalRow) { this.originalRow = originalRow; } this.getCorrectedCol = function getCorrectedCol() { return this.currentCell.getCol() + this.colOffset; } this.setColOffset = function setColOffset(colOffset) { this.colOffset = colOffset; } this.getColOffset = function getColOffset() { return this.colOffset; } this.initColOffset = function initColOffset() { if (this.currentCell.getRow() != this.originalRow) { this.colOffset = 0; } } this.getImpactedCells = function getImpactedCells() { return this.impactedCells; } this.addImpactedCell = function addImpactedCell(impactedCell) { this.impactedCells.push(impactedCell); } this.addImpactedCells = function addImpactedCells() { var currentCell = this.currentCell; for (var i = 1; i < currentCell.getRowspan(); i++) { var impactedRow = currentCell.getRow() + i; this.calcOffset(impactedRow); var impactedCol = this.getCorrectedCol(); var offset = 0; if (currentCell.getColspan()) { offset = currentCell.getColspan(); } else { offset = 1; } this.addImpactedCell(new ImpactedCell(impactedRow, impactedCol, offset)) } } this.calcOffset = function calcOffset(row) { var colOffset = this.colOffset; var result = colOffset; for (var i = 0; i < this.impactedCells.length; i++) { var impactedCell = this.impactedCells[i]; if (row == impactedCell.row && this.getCorrectedCol() == impactedCell.col) { colOffset += impactedCell.offset; result = colOffset; break; } } this.colOffset = result; return result; } this.correctColOffset = function correctColOffset() { var currentCell = this.currentCell; var tmpColOffset; while (true) { this.calcOffset(currentCell.getRow()); tmpColOffset = this.getColOffset(); this.calcOffset(currentCell.getRow()); if (this.getColOffset() == tmpColOffset) { break; } } } this.mergeCells = function mergeCells(oSheet, row1, col1, row2, col2) { oSheet.Range(oSheet.Cells(row1, col1), oSheet.Cells(row2, col2)).MergeCells = true; } this.mergeCellsConditionally = function mergeCellsConditionally(oSheet) { var currentCell = this.currentCell; var colsShouldMerge = currentCell.getColspan() > 1; var rowsShouldMerge = currentCell.getRowspan() > 1; if (colsShouldMerge && !rowsShouldMerge) { this.mergeCells( oSheet, currentCell.getRow(), this.getCorrectedCol(), currentCell.getRow(), this.getCorrectedCol() + currentCell.getColspan() - 1 ); } else if (!colsShouldMerge && rowsShouldMerge) { this.mergeCells( oSheet, currentCell.getRow(), this.getCorrectedCol(), currentCell.getRow() + currentCell.getRowspan() - 1, this.getCorrectedCol() ); } else if (colsShouldMerge && rowsShouldMerge) { this.mergeCells( oSheet, currentCell.getRow(), this.getCorrectedCol(), currentCell.getRow() + currentCell.getRowspan() - 1, this.getCorrectedCol() + currentCell.getColspan() - 1 ); } } } var oXL = new ActiveXObject("Excel.Application"); var oWB = oXL.Workbooks.Add(); var oSheet = oWB.ActiveSheet; var cellManager = new CellManager(0, 0, new Array()); traverseTable( table, function(i, j, cell) { var text = cell.innerText; if (null != text) { var row = i + 1; var col = j + 1; var currentCell = new CurrentCell(row, col, text); cellManager.setCurrentCell(currentCell); cellManager.initColOffset(); cellManager.setOriginalRow(row); var colspan = cell.getAttribute("colspan"); var rowspan = cell.getAttribute("rowspan"); currentCell.setColspan(colspan); currentCell.setRowspan(rowspan); var colsShouldMerge = currentCell.getColspan() > 1; var rowsShouldMerge = currentCell.getRowspan() > 1; cellManager.correctColOffset(); if (rowsShouldMerge) { cellManager.addImpactedCells(); } cellManager.mergeCellsConditionally(oSheet); var cellInSheet = oSheet.Cells(currentCell.getRow(), cellManager.getCorrectedCol()); if (colsShouldMerge) { var align = cell.getAttribute("align"); if ("center" == align) { cellInSheet.HorizontalAlignment = 3; } cellManager.setColOffset(cellManager.getColOffset() + (colspan - 1)); } cellInSheet.NumberFormatLocal = "@"; cellInSheet.value = text; } } ) oXL.Visible = true; oXL.UserControl = true; oXL = null; idTmr = window.setInterval("Cleanup();",1); } function traverseTable(table, action) { for (var i = 0; i < table.rows.length; i++) { var row = table.rows(i); for (var j = 0; j < row.cells.length; j++) { var cell = row.cells(j); action(i, j, cell); } } } |
0
上一篇:24小时退弹一次的代码,可弹SP2SP3遨游 下一篇:js日历控件(可精确到分钟)