网站链接: 环球网校培训
当前位置: 首页 > 资讯动态  > 平台资讯

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

2025/12/29 23:07:38 人评论

使用JavaScript将表格导出为Excel文件是一种比较常见的导出方法,但复杂表格的导出比较麻烦(比如报表的导出),为此我专门写了一段代码专门处理表格导出,与各位分享一下。  util.js:/** * Utilities for exporting a table as an excel file * @author …

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

相关资讯

  • 2018小程序电商行业报告:用户规模将破5亿,社交玩法促进成单量

    OMO时代已来,小程序将会是最重要的工具。差不多两周前,新榜推送了这篇文章《“一条”“日日煮”抢先入局,内容创业迎来OMO时代?| 新榜观察》,在趋势层面探讨了一个现象,去线下开店似乎正成为潮水的方向。比如,刚拿到C+轮融资的“一条”,宣布未来两年要开100家线下…

    2025/12/29 23:07:38
  • 超2000个小程序被封,押注在这里的7亿多资金风险有多高?

    小程序发布一年后,微信开始了大清理。近日,微信宣布永久封禁976个假货、高仿,数百个“色情、低俗”类,及1000多个现金贷小程序。在此之前,就有头脑王者、荔枝微课、千聊被封,目前,后两者已经解封,但头脑王者还在关闭中。据娱乐资本论旗下剁椒娱投了解,千聊发布了…

    2025/12/29 23:07:38
  • 微信小程序认证有哪些主体类别?

    微信小程序在申请过程中,微信要求所有的小程序都要进行主体登记。那么,对于个体工商户来说,应该选择哪种主体类型进行登记?今天,就来为你详细解析一番。1.微信小程序有哪些主体类别?目前,可以登记注册微信小程序的主体类别,有以下几种:个人企业(包括个体工商户)…

    2025/12/29 23:07:38
  • APP五网合一让手机APP的客量倍增

    APP五网合一让手机APP的客量倍增?如今,不少商家都亟需开发自己的App。有想要扩充购买渠道的,有拥有忠实客户需要提供便捷入口的,还有一些门店商家,需要通过独App,树立品牌形象扩大影响力。  因为时代的驱动, 也给一大波的 外包企业开发公司带来很多的客源收益,深…

    2025/12/29 23:07:38

共有条评论 网友评论

验证码: 看不清楚?