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 编辑过 |
关键字查询
相关文章
正在查询... |