扫描二维码关注

首页 APP开发小程序开发 微信公众号 网站建设 推广运营 关于我们

“学习不仅是掌握知识”

向书本学习,还要向实践学习、向生活学习。消化已有知识,
而且要力求有所发现、有所发明、有所创造

使用JavaScript将复杂表格导出为Excel

2019/4/7 11:21:33

使用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 (colsShou


长沙高新开发区谷苑路186号湖南大学科技园创业大厦429

咨询电话:0731-8225 2399
业务QQ:1020299919
大客户专线:139 7581 8321

友情链接:
Copyright© 2014-2024 湖南省鑫冠计算机系统有限公司 版权所有 ICP备案号:湘ICP备17013418号-1 公安备案号:湘公网安备43019002001544号