JS技巧:使用JavaScript将复杂表格导出为Excel
					当前位置:点晴教程→知识管理交流
					
					→『 技术文档交流 』
					
				 
				
 使用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); } } }测试代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional //EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>无标题文档</title> <script src="util.js"></script> </head> <body> 
<table width="200" border="1" onclick="exportAsXls(this)"> <tr> <td colspan="4" rowspan="2">1234678t</td> <td>5</td> <td>k</td> <td colspan="2">mr</td> </tr> <tr> <td>9</td> <td colspan="2" rowspan="3">wgbnpt</td> <td>z</td> </tr> <tr> <td rowspan="2">1013</td> <td colspan="2" rowspan="3">eh14151920</td> <td>11</td> <td>12</td> <td>c</td> </tr> <tr> <td>16</td> <td>17</td> <td>a</td> </tr> <tr> <td>18</td> <td colspan="5">2122dsj</td> </tr> </table> </body> </html> 该文章在 2010/8/17 21:54:28 编辑过  | 
		
			 关键字查询 
				相关文章 
				正在查询...  |