<script type="text/javascript" language="javascript"> /* * 默认转换实现函数,如果需要其他功能,需自行扩展
* 参数:
* tableID : HTML中Table对象id属性值
* 详细用法参见以下 TableToExcel 对象定义 
*/ function saveAsExcel(tableID){
var tb = new TableToExcel(tableID);
tb.setFontStyle("Courier New");
tb.setFontSize(10);
tb.setTableBorder(2);
tb.setColumnWidth(7);
tb.isLineWrap(true);
tb.getExcelFile();

/** 功能:HTML中Table对象转换为Excel通用对象.
 * 参数:tableID HTML中Table对象的ID属性值
 * 说明:
 * 能适应复杂的HTML中Table对象的自动转换,能够自动根据行列扩展信息
 * 合并Excel中的单元格,客户端需要安装有Excel
 * 详细的属性、方法引用说明参见:Excel的Microsoft Excel Visual Basic参考
 * 示范:
 * var tb = new TableToExcel('demoTable');
 * tb.setFontStyle("Courier New");
 * tb.setFontSize(10); //推荐取值10
 * tb.setFontColor(6); //一般情况不用设置
 * tb.setBackGround(4); //一般情况不用设置
 * tb.setTableBorder(2); //推荐取值2
 * tb.setColumnWidth(10); //推荐取值10
 * tb.isLineWrap(false);
 * tb.isAutoFit(true);
 * * tb.getExcelFile();
 * 如果设置了单元格自适应,则设置单元格宽度无效
 * 版本:1.0*/
 function TableToExcel(tableID) {
  this.tableBorder = -1; //边框类型,-1没有边框 可取1/2/3/4
  this.backGround = 0; //背景颜色:白色 可取调色板中的颜色编号 1/2/3/4....
  this.fontColor = 1; //字体颜色:黑色
  this.fontSize = 10; //字体大小
  this.fontStyle = "宋体"; //字体类型
  this.rowHeight = 20; //行高
  this.columnWidth = -1; //列宽
  this.lineWrap = true; //是否自动换行
  this.textAlign = -4108; //内容对齐方式 默认为居中
  this.autoFit = true; //是否自适应宽度
  this.tableID = tableID; 
 }
  TableToExcel.prototype.setTableBorder = function (excelBorder) {
  this.tableBorder = excelBorder ;
  }; 
  TableToExcel.prototype.setBackGround = function (excelColor) {
  this.backGround = excelColor;
  }; 
  TableToExcel.prototype.setFontColor = function (excelColor) {
  this.fontColor = excelColor;
  }; 
  TableToExcel.prototype.setFontSize = function (excelFontSize) {
  this.fontSize = excelFontSize;
  }; 
  TableToExcel.prototype.setFontStyle = function (excelFont) {
  this.fontStyle = excelFont;
  }; 
  TableToExcel.prototype.setRowHeight = function (excelRowHeight) {
  this.rowHeight = excelRowHeight;
  }; 
  TableToExcel.prototype.setColumnWidth = function (excelColumnWidth) {
  this.columnWidth = excelColumnWidth;
  }; 
  TableToExcel.prototype.isLineWrap = function (lineWrap) {
  if (lineWrap == false || lineWrap == true) {
  this.lineWrap = lineWrap;
  }
  }; 
  TableToExcel.prototype.setTextAlign = function (textAlign) {
  this.textAlign = textAlign;
  }; 
  TableToExcel.prototype.isAutoFit = function(autoFit){
  if(autoFit == true || autoFit == false)this.autoFit = autoFit ;
  }
  //文件转换主函数
  TableToExcel.prototype.getExcelFile = function () {
  var jXls, myWorkbook, myWorksheet, myHTMLTableCell, myExcelCell, myExcelCell2;
  var myCellColSpan, myCellRowSpan; 
  try {
  jXls = new ActiveXObject('Excel.Application');
  }catch (e) {
  alert("无法启动Excel!\n\n如果您确信您的电脑中已经安装了Excel,"+"那么请调整IE的安全级别。\n\n具体操作:\n\n"+"工具 → Internet选项 → 安全 → 自定义级别 → 对没有标记为安全的ActiveX进行初始化和脚本运行 → 启用");
  return false;
  } 
  jXls.Visible = true;
  myWorkbook = jXls.Workbooks.Add();
  jXls.DisplayAlerts = false;
  myWorkbook.Worksheets(3).Delete();
  myWorkbook.Worksheets(2).Delete();
  jXls.DisplayAlerts = true;
  myWorksheet = myWorkbook.ActiveSheet; 
  var readRow = 0, readCol = 0;var totalRow = 0, totalCol = 0;
  var tabNum = 0; 
  //设置行高、列宽
  if(this.columnWidth != -1)
  myWorksheet.Columns.ColumnWidth = this.columnWidth;
  else
  myWorksheet.Columns.ColumnWidth = 7;
  if(this.rowHeight != -1)
  myWorksheet.Rows.RowHeight = this.rowHeight ; 
  //搜索需要转换的Table对象,获取对应行、列数
  var obj = document.all.tags("table");   for (x = 0; x < obj.length; x++) {
  if (obj[x].id == this.tableID) {
  tabNum = x;
  totalRow = obj[x].rows.length;
  for (i = 0; i < obj[x].rows[0].cells.length; i++) {
  myHTMLTableCell = obj[x].rows(0).cells(i);
  myCellColSpan = myHTMLTableCell.colSpan;
  totalCol = totalCol + myCellColSpan;
  }
  }
  } 
  //开始构件模拟表格
  var excelTable = new Array();
  for (i = 0; i <= totalRow; i++) {
  excelTable[i] = new Array();
  for (t = 0; t <= totalCol; t++) {
  excelTable[i][t] = false;
  }
  } 
  //开始转换表格 
  for (z = 0; z < obj[tabNum].rows.length; z++) {
readRow = z + 1;
  readCol = 0;
  for (c = 0; c < obj[tabNum].rows(z).cells.length; c++) {
  myHTMLTableCell = obj[tabNum].rows(z).cells(c);
  myCellColSpan = myHTMLTableCell.colSpan;
  myCellRowSpan = myHTMLTableCell.rowSpan;
  for (y = 1; y <= totalCol; y++) {
  if (excelTable[readRow][y] == false) {
  readCol = y;
  break;
  }
  }
  if (myCellColSpan * myCellRowSpan > 1) {
  myExcelCell = myWorksheet.Cells(readRow, readCol);
  myExcelCell2 = myWorksheet.Cells(readRow + myCellRowSpan - 1, readCol + myCellColSpan - 1);
  myWorksheet.Range(myExcelCell, myExcelCell2).Merge();
  myExcelCell.HorizontalAlignment = this.textAlign;
  myExcelCell.Font.Size = this.fontSize;
  myExcelCell.Font.Name = this.fontStyle;
  myExcelCell.wrapText = this.lineWrap;
  myExcelCell.Interior.ColorIndex = this.backGround;
  myExcelCell.Font.ColorIndex = this.fontColor;
  if(this.tableBorder != -1){
  myWorksheet.Range(myExcelCell, myExcelCell2).Borders(1).Weight = this.tableBorder ;
  myWorksheet.Range(myExcelCell, myExcelCell2).Borders(2).Weight = this.tableBorder ;
  myWorksheet.Range(myExcelCell, myExcelCell2).Borders(3).Weight = this.tableBorder ;
  myWorksheet.Range(myExcelCell, myExcelCell2).Borders(4).Weight = this.tableBorder ;
  } 
  myExcelCell.Value = myHTMLTableCell.innerText;
  for (row = readRow; row <= myCellRowSpan + readRow - 1; row++) {
  for (col = readCol; col <= myCellColSpan + readCol - 1; col++) {
  excelTable[row][col] = true;
  }
  } 
  readCol = readCol + myCellColSpan;
  } else {
//下面这一行报错
  myExcelCell = myWorksheet.Cells(readRow,readCol);   myExcelCell.Value = myHTMLTableCell.innerText;
  myExcelCell.HorizontalAlignment = this.textAlign;
  myExcelCell.Font.Size = this.fontSize;
  myExcelCell.Font.Name = this.fontStyle;
  myExcelCell.wrapText = this.lineWrap;
  myExcelCell.Interior.ColorIndex = this.backGround;
  myExcelCell.Font.ColorIndex = this.fontColor;
  if(this.tableBorder != -1){
  myExcelCell.Borders(1).Weight = this.tableBorder ;
  myExcelCell.Borders(2).Weight = this.tableBorder ;
  myExcelCell.Borders(3).Weight = this.tableBorder ;
  myExcelCell.Borders(4).Weight = this.tableBorder ;
  }
  excelTable[readRow][readCol] = true;readCol = readCol + 1;
  }
  }
  }
  if(this.autoFit == true)
  myWorksheet.Columns.AutoFit; 
  jXls.UserControl = true;
  jXls = null;
  myWorkbook = null;
  myWorksheet = null;
 };
</script>
<TABLE id='tabId' style="BORDER-COLLAPSE: collapse" borderColor=#000000 cellSpacing=0 width=300 align=center bgColor=#ffffff border=1>
<TBODY>
<TR>
<TD width=100>
<DIV align=center>多行多列</DIV></TD>
<TD width=100>
<DIV align=center>多行多列</DIV></TD>
<TD width=100>
<DIV align=center>多行多列</DIV></TD>
<TR>
<TD>
<DIV align=center>多行多列</DIV></TD>
<TD>
<DIV align=center>多行多列</DIV></TD>
<TD>
<DIV align=center>多行多列</DIV></TD>
<TR>
<TD>
<DIV align=center>多行多列</DIV></TD>
<TD>
<DIV align=center>多行多列</DIV></TD>
<TD>
<DIV align=center>多行多列</DIV></TD></TR></TR></TR></TBODY></TABLE>
<input class='button' type='button' value='导出excel' onclick='saveAsExcel(tabId)'/>

解决方案 »

  1.   

    随便玩的,后续问题表找我。
    <script type="text/javascript" language="javascript">
        
        /* * 默认转换实现函数,如果需要其他功能,需自行扩展
         * 参数:
         * tableID : HTML中Table对象id属性值
         * 详细用法参见以下 TableToExcel 对象定义
         */
        function saveAsExcel(tableID){
            var tb = new TableToExcel(tableID);
            tb.setFontStyle("Courier New");
            tb.setFontSize(10);
            tb.setTableBorder(2);
            tb.setColumnWidth(7);
            tb.isLineWrap(true);
            tb.getExcelFile();
        }
        
        /** 功能:HTML中Table对象转换为Excel通用对象.
         * 参数:tableID HTML中Table对象的ID属性值
         * 说明:
         * 能适应复杂的HTML中Table对象的自动转换,能够自动根据行列扩展信息
         * 合并Excel中的单元格,客户端需要安装有Excel
         * 详细的属性、方法引用说明参见:Excel的Microsoft Excel Visual Basic参考
         * 示范:
         * var tb = new TableToExcel('demoTable');
         * tb.setFontStyle("Courier New");
         * tb.setFontSize(10); //推荐取值10
         * tb.setFontColor(6); //一般情况不用设置
         * tb.setBackGround(4); //一般情况不用设置
         * tb.setTableBorder(2); //推荐取值2
         * tb.setColumnWidth(10); //推荐取值10
         * tb.isLineWrap(false);
         * tb.isAutoFit(true);
         * * tb.getExcelFile();
         * 如果设置了单元格自适应,则设置单元格宽度无效
         * 版本:1.0*/
        function TableToExcel(tableID){
            this.tableBorder = -1; //边框类型,-1没有边框 可取1/2/3/4
            this.backGround = 0; //背景颜色:白色 可取调色板中的颜色编号 1/2/3/4....
            this.fontColor = 1; //字体颜色:黑色
            this.fontSize = 10; //字体大小
            this.fontStyle = "宋体"; //字体类型
            this.rowHeight = 20; //行高
            this.columnWidth = -1; //列宽
            this.lineWrap = true; //是否自动换行
            this.textAlign = -4108; //内容对齐方式 默认为居中
            this.autoFit = true; //是否自适应宽度
            this.tableID = tableID;
        }
        
        TableToExcel.prototype.setTableBorder = function(excelBorder){
            this.tableBorder = excelBorder;
        };
        TableToExcel.prototype.setBackGround = function(excelColor){
            this.backGround = excelColor;
        };
        TableToExcel.prototype.setFontColor = function(excelColor){
            this.fontColor = excelColor;
        };
        TableToExcel.prototype.setFontSize = function(excelFontSize){
            this.fontSize = excelFontSize;
        };
        TableToExcel.prototype.setFontStyle = function(excelFont){
            this.fontStyle = excelFont;
        };
        TableToExcel.prototype.setRowHeight = function(excelRowHeight){
            this.rowHeight = excelRowHeight;
        };
        TableToExcel.prototype.setColumnWidth = function(excelColumnWidth){
            this.columnWidth = excelColumnWidth;
        };
        TableToExcel.prototype.isLineWrap = function(lineWrap){
            if (lineWrap == false || lineWrap == true) {
                this.lineWrap = lineWrap;
            }
        };
        TableToExcel.prototype.setTextAlign = function(textAlign){
            this.textAlign = textAlign;
        };
        TableToExcel.prototype.isAutoFit = function(autoFit){
            if (autoFit == true || autoFit == false) 
                this.autoFit = autoFit;
        }
        //文件转换主函数
        TableToExcel.prototype.getExcelFile = function(){
            var jXls, myWorkbook, myWorksheet, myHTMLTableCell, myExcelCell, myExcelCell2;
            var myCellColSpan, myCellRowSpan;
            try {
                jXls = new ActiveXObject('Excel.Application');
            } 
            catch (e) {
                alert("无法启动Excel!\n\n如果您确信您的电脑中已经安装了Excel," + "那么请调整IE的安全级别。\n\n具体操作:\n \n" + "工具 → Internet选项 → 安全 → 自定义级别 → 对没有标记为安全的ActiveX进行初始化和脚本运行 → 启用");
                return false;
            }
            jXls.Visible = true;
            myWorkbook = jXls.Workbooks.Add();
            jXls.DisplayAlerts = false;
            myWorkbook.Worksheets(3).Delete();
            myWorkbook.Worksheets(2).Delete();
            jXls.DisplayAlerts = true;
            myWorksheet = myWorkbook.ActiveSheet;
            var readRow = 0, readCol = 0;
            var totalRow = 0, totalCol = 0;
            var tabNum = 0;
            //设置行高、列宽
            if (this.columnWidth != -1) 
                myWorksheet.Columns.ColumnWidth = this.columnWidth;
            else 
                myWorksheet.Columns.ColumnWidth = 7;
            if (this.rowHeight != -1) 
                myWorksheet.Rows.RowHeight = this.rowHeight;
            //搜索需要转换的Table对象,获取对应行、列数
            var obj = document.all.tags("table");
            
            for (x = 0; x < obj.length; x++) {
                if (obj[x].id == this.tableID) {
                    tabNum = x;
                    totalRow = obj[x].rows.length;
                    for (i = 0; i < obj[x].rows[0].cells.length; i++) {
                        myHTMLTableCell = obj[x].rows(0).cells(i);
                        myCellColSpan = myHTMLTableCell.colSpan;
                        totalCol = totalCol + myCellColSpan;
                    }
                }
            }
            //开始构件模拟表格
            var excelTable = {};
            //开始转换表格 
            for (z = 0; z < obj[tabNum].rows.length; z++) {
                readRow = z + 1;
                readCol = 0;
                for (c = 0; c < obj[tabNum].rows(z).cells.length; c++) {
                    myHTMLTableCell = obj[tabNum].rows(z).cells(c);
                    myCellColSpan = myHTMLTableCell.colSpan;
                    myCellRowSpan = myHTMLTableCell.rowSpan;
                    for (y = 1; y <= totalCol; y++) {
                        if (!excelTable[[readRow, y]]) {
                            readCol = y;
                            break;
                        }
                    }
                    if (myCellColSpan * myCellRowSpan > 1) {
                        myExcelCell = myWorksheet.Cells([readRow, readCol]);
                        myExcelCell2 = myWorksheet.Cells([readRow + myCellRowSpan - 1, readCol + myCellColSpan - 1]);
                        myWorksheet.Range(myExcelCell, myExcelCell2).Merge();
                        myExcelCell.HorizontalAlignment = this.textAlign;
                        myExcelCell.Font.Size = this.fontSize;
                        myExcelCell.Font.Name = this.fontStyle;
                        myExcelCell.wrapText = this.lineWrap;
                        myExcelCell.Interior.ColorIndex = this.backGround;
                        myExcelCell.Font.ColorIndex = this.fontColor;
                        if (this.tableBorder != -1) {
                            myWorksheet.Range(myExcelCell, myExcelCell2).Borders(1).Weight = this.tableBorder;
                            myWorksheet.Range(myExcelCell, myExcelCell2).Borders(2).Weight = this.tableBorder;
                            myWorksheet.Range(myExcelCell, myExcelCell2).Borders(3).Weight = this.tableBorder;
                            myWorksheet.Range(myExcelCell, myExcelCell2).Borders(4).Weight = this.tableBorder;
                        }
                        myExcelCell.Value = myHTMLTableCell.innerText;
                        for (row = readRow; row <= myCellRowSpan + readRow - 1; row++) {
                            for (col = readCol; col <= myCellColSpan + readCol - 1; col++) {
                                excelTable[[row, col]] = true;
                            }
                        }
                        readCol = readCol + myCellColSpan;
                    }
                    else {
                        //下面这一行报错
                        myExcelCell = myWorksheet.Cells([readRow, readCol]);
                        
                        myExcelCell.Value = myHTMLTableCell.innerText;
                        myExcelCell.HorizontalAlignment = this.textAlign;
                        myExcelCell.Font.Size = this.fontSize;
                        myExcelCell.Font.Name = this.fontStyle;
                        myExcelCell.wrapText = this.lineWrap;
                        myExcelCell.Interior.ColorIndex = this.backGround;
                        myExcelCell.Font.ColorIndex = this.fontColor;
                        if (this.tableBorder != -1) {
                            myExcelCell.Borders(1).Weight = this.tableBorder;
                            myExcelCell.Borders(2).Weight = this.tableBorder;
                            myExcelCell.Borders(3).Weight = this.tableBorder;
                            myExcelCell.Borders(4).Weight = this.tableBorder;
                        }
                        excelTable[[readRow, readCol]] = true;
                        readCol = readCol + 1;
                    }
                }
            }
            if (this.autoFit == true) 
                myWorksheet.Columns.AutoFit;
            jXls.UserControl = true;
            jXls = null;
            myWorkbook = null;
            myWorksheet = null;
        };
    </script>
    <TABLE id='tabId' style="BORDER-COLLAPSE: collapse" borderColor=#000000 cellSpacing=0 width=300 align=center bgColor=#ffffff border=1>
        <TBODY>
            <TR>
                <TD width=100>
                    <DIV align=center>
                        多行多列
                    </DIV>
                </TD>
                <TD width=100>
                    <DIV align=center>
                        多行多列
                    </DIV>
                </TD>
                <TD width=100>
                    <DIV align=center>
                        多行多列
                    </DIV>
                </TD>
                <TR>
                    <TD>
                        <DIV align=center>
                            多行多列
                        </DIV>
                    </TD>
                    <TD>
                        <DIV align=center>
                            多行多列
                        </DIV>
                    </TD>
                    <TD>
                        <DIV align=center>
                            多行多列
                        </DIV>
                    </TD>
                    <TR>
                        <TD>
                            <DIV align=center>
                                多行多列
                            </DIV>
                        </TD>
                        <TD>
                            <DIV align=center>
                                多行多列
                            </DIV>
                        </TD>
                        <TD>
                            <DIV align=center>
                                多行多列
                            </DIV>
                        </TD>
                    </TR>
                </TR>
            </TR>
        </TBODY>
    </TABLE>
    <input class='button' type='button' value='导出excel' onclick='saveAsExcel(tabId)'/>
      

  2.   

    支持一下,虽然是用ActiveX的
    数据导出Excel确实比较麻烦
      

  3.   

    zswang  请再帮帮忙,我导出来的怎么都是一行的啊?帮忙再看看撒。多谢多谢