<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
    主站蜘蛛池模板: 亚洲一线产区二线产区精华| 中文字幕在线日亚洲9| 免费人成网站7777视频| 无人在线直播免费观看| 国产香蕉九九久久精品免费| 四虎成人精品永久免费AV| 国产麻豆成人传媒免费观看| 四虎国产成人永久精品免费| 91av视频免费在线观看| 99爱免费观看视频在线| 999国内精品永久免费视频| 青青草a免费线观a| 国产jizzjizz视频免费看| www.亚洲精品| 亚洲AV日韩精品久久久久| 中文亚洲AV片不卡在线观看| 亚洲美女视频免费| 亚洲依依成人亚洲社区| 一级毛片免费在线观看网站| 91福利免费网站在线观看| 日韩欧美一区二区三区免费观看| 国产成人免费ā片在线观看| 亚洲无人区一区二区三区| 色婷五月综激情亚洲综合| 水蜜桃视频在线观看免费| 西西大胆无码视频免费| 亚洲av无码精品网站| 99在线免费观看| 久久亚洲中文字幕精品一区四| 亚洲精品无码高潮喷水A片软| 成人特黄a级毛片免费视频| 亚洲视频一区二区三区| 野花香高清视频在线观看免费| 亚洲片国产一区一级在线观看| 精品无码专区亚洲| 在线播放免费人成视频在线观看| 亚洲人成在线精品| 久久综合AV免费观看| 色偷偷亚洲第一综合网| 免费不卡中文字幕在线| 搜日本一区二区三区免费高清视频 |