<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    First they ignore you
    then they ridicule you
    then they fight you
    then you win
        -- Mahatma Gandhi
    Chinese => English     英文 => 中文             
    隨筆-221  評論-1047  文章-0  trackbacks-0
    使用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() - 1this.getCorrectedCol()
                    );
                } 
    else if (colsShouldMerge && rowsShouldMerge) {
                    
    this.mergeCells(
                        oSheet,
                        currentCell.getRow(), 
    this.getCorrectedCol(),
                        currentCell.getRow() 
    + currentCell.getRowspan() - 1this.getCorrectedCol() + currentCell.getColspan() - 1
                    );
                }
            }
        }

        
    var oXL = new ActiveXObject("Excel.Application");
        
    var oWB = oXL.Workbooks.Add();
        
    var oSheet = oWB.ActiveSheet;

        
    var cellManager = new CellManager(00new 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>






    posted on 2009-09-13 22:06 山風小子 閱讀(3083) 評論(4)  編輯  收藏 所屬分類: JavaScript
    主站蜘蛛池模板: 亚洲啪啪免费视频| A在线观看免费网站大全| 亚洲久热无码av中文字幕| 亚洲国产精品人久久| 亚洲精品成a人在线观看| 成年在线网站免费观看无广告| 精品无码无人网站免费视频| 岛国精品一区免费视频在线观看| 国产精品亚洲色图| 亚洲日产乱码一二三区别| 亚洲国产成人精品电影| 久久精品亚洲精品国产色婷| 亚洲乱色熟女一区二区三区丝袜| 亚洲国产精品嫩草影院久久| 永久免费无码网站在线观看 | 亚洲国产av无码精品| 成人免费无码大片A毛片抽搐色欲| 毛片无码免费无码播放| 野花香在线视频免费观看大全| 国产精品成人69XXX免费视频| 麻豆va在线精品免费播放| 蜜芽亚洲av无码一区二区三区| 亚洲人成77777在线播放网站不卡| 亚洲国产成a人v在线| 亚洲国产成人精品久久| 亚洲综合久久1区2区3区| 久久亚洲AV无码精品色午夜麻豆| 久久国产亚洲电影天堂| 久久亚洲国产成人亚| 久久99国产亚洲精品观看| 亚洲av中文无码乱人伦在线r▽| 亚洲国产精彩中文乱码AV| 亚洲高清国产拍精品26U| 久久精品国产精品亚洲艾| 久久亚洲私人国产精品| 亚洲成年人电影网站| 亚洲无吗在线视频| 亚洲av最新在线观看网址| 菠萝菠萝蜜在线免费视频| 一级做a爰片久久毛片免费陪 | 国内免费高清在线观看|