`
Jonefy
  • 浏览: 11822 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

js 导出excel格式文件 含合并列 合并行

阅读更多
function PageToExcel(TableID,FirstRow,LastRowColor,SaveAsName){
this.lastRowColor=LastRowColor==""?0:LastRowColor;
var today=new Date();
this.saveAsName=(SaveAsName==""?today.getYear()+""+(today.getMonth()+1) + today.getDate() + today.getHours() + today.getMinutes() + today.getSeconds()  + ".xls":SaveAsName);
this.tableId=TableID;
this.table=document.getElementById(this.tableId);//导出的table 对象
this.rows=this.table.rows.length;//导出的table总行数
this.colSumCols=this.table.rows(0).cells.length;//第一行总列数
this.fromrow=FirstRow;
this.beginCol=0; //起始列数
this.cols=this.colSumCols;
this.oXL=null;
this.oWB=null;
this.oSheet=null;
this.rowSpans=1; //行合并
this.colSpans=1; //列合并
this.colsName={0:"A",1:"B", 2:"C", 3:"D", 4:"E", 5:"F", 6:"G", 7:"H", 8:"I",9:"J", 10:"K", 11:"L", 12:"M", 13:"N", 14:"O", 15:"P", 16:"Q", 16:"R" ,18:"S", 19:"T", 20:"U", 21:"V", 22:"W", 23:"X", 24:"Y", 25:"Z"};

}
PageToExcel.prototype.DeleteExcelCols=function(NotShowColList){//数组NotShowColList
    //this.notShowColList=NotShowColList;//不显示列集合,1,2,3,1
    //删除excel中的列
   var m=0;
   for(var i=0;i<NotShowColList.length;i++){
   if(i>0){
m++;
}
var temp=NotShowColList[i]- m;
var index=this.colsName[temp];
this.oSheet.Columns(index).Delete;//删除
   }
   m=0;
}
PageToExcel.prototype.CreateExcel=function(ExcelVisible){
   try{
   this.oXL = new ActiveXObject("Excel.Application"); //创建应该对象
   this.oXL.Visible = ExcelVisible;
   this.oWB = this.oXL.Workbooks.Add();//新建一个Excel工作簿
   this.oSheet = this.oWB.ActiveSheet;//指定要写入内容的工作表为活动工作表
   //不显示网格线
   //this.oXL.ActiveWindow.DisplayGridlines=false;
   }catch(e){
alert("请确认安装了非绿色版本的excel!"+e.description);
CloseExcel();
   }
}
//关闭excel
PageToExcel.prototype.CloseExcel=function(){
    this.oXL.DisplayAlerts = false;  
this.oXL.Quit();  
this.oXL = null;  
this.oWB=null;  
this.oSheet=null;
}

PageToExcel.prototype.ChangeElementToLabel=function (ElementObj){

   var GetText="";
   try{
   var childres=ElementObj.childNodes;
 
   }catch(e){ return GetText}
   if(childres.length<=0) return GetText;
   for(var i=0;i<childres.length;i++){
   try{if(childres[i].style.display=="none"||childres[i].type.toLowerCase()=="hidden"){continue;}}
   catch(e){}
   
     try{
      switch (childres[i].nodeName.toLowerCase()){
        case "#text" :
         GetText +=childres[i].nodeValue ;
         break;
        case "br" :
         GetText +="\n";
         break;
        case "img" :
         GetText +="";
         break;
        case "select" :
         GetText +=childres[i].options[childres[i].selectedIndex].innerText ;
         break;
        case "input" :
         if(childres[i].type.toLowerCase()=="submit"||childres[i].type.toLowerCase()=="button"){
          GetText +="";
         }else if(childres[i].type.toLowerCase()=="textarea"){
          GetText +=childres[i].innerText;
         }else{
          GetText +=childres[i].value;
         }
         break;
        default :
         GetText += this.ChangeElementToLabel(childres[i]);
         break;
      }
    
     }catch(e){}
   }
   return GetText;
}

PageToExcel.prototype.SaveAs=function (){
   //保存
   try{
this.oXL.Visible =true;
var fname = this.oXL.Application.GetSaveAsFilename(this.saveAsName, "Excel Spreadsheets (*.xls), *.xls");
if(fname){
this.oWB.SaveAs(fname);
this.oXL.Visible =false;
}
   }catch(e){};
}
PageToExcel.prototype.Exec=function()
{
 
   //寻找列数,考虑到第一行可能存在
   for (var i=0; i<this.colSumCols;i++) {
    var tmpcolspan = this.table.rows(0).cells(i).colSpan;
    if ( tmpcolspan>1 ) {
     this.cols += tmpcolspan-1;
    }
   }
 
   //定义2维容器数据,1:行;2:列;值(0 可以填充,1 已被填充)
   var container=new Array(this.rows);
   for (var i=0;i<this.rows;i++) {
    container[i]=new Array(this.cols);
    for (j=0;j<this.cols;j++) {
     container[i][j]=0;
    }
   }
 
   //将所有单元置为文本,避免非数字列被自动变成科学计数法和丢失前缀的0
   this.oSheet.Range(this.oSheet.Cells(this.fromrow+1,1), this.oSheet.Cells(this.fromrow+this.rows,this.cols)).NumberFormat = "@";
   // 循环行
   for (i=0;i<this.rows;i++){
    //循环列
    for (j=0;j<this.cols;j++){
     //寻找开始列
     for (k=j;k<this.cols;k++){
      if (container[i][k]==0) {
       this.beginCol=k;
       k=this.cols; //退出循环
      }
     }

      //赋值
      //此处相应跟改 根据 标签的类型,替换相关参数
      this.oSheet.Cells(i+1+this.fromrow,this.beginCol+1).value = this.ChangeElementToLabel(this.table.rows(i).cells(j));
      //计算合并列
      try{
     this.colSpans = this.table.rows(i).cells(j).colSpan;
      }catch(e){
     this.colSpans=0  
     }
     if (this.colSpans>1) {
      //合并
      this.oSheet.Range(this.oSheet.Cells(i+1+this.fromrow,this.beginCol+1),this.oSheet.Cells(i+1+this.fromrow,this.beginCol+this.colSpans)).Merge();
     }
     //将当前table位置填写到对应的容器中
     for (k=0; k<this.colSpans;k++) {
      container[i][this.beginCol+k]= 1;
     }
     // 计算合并行
   
     try{
      this.rowSpans = this.table.rows(i).cells(j).rowSpan;
       }catch(e){
       this.rowSpans = 0;
     }
   
     if (this.rowSpans>1) { //行合并
      this.oSheet.Range(this.oSheet.Cells(i+1+this.fromrow,this.beginCol+1),this.oSheet.Cells(i+this.rowSpans+this.fromrow,this.beginCol+this.colSpans)).Merge();
      //将当前table位置填写到对应的容器中
      for (k=1; k<this.rowSpans;k++) { //由于第0行已经被colSpans对应的代码填充了,故这里从第1行开始
       for (l=0;l<this.colSpans;l++) {
        container[i+k][this.beginCol+l]=1;
       }
      }
     }
     //如果开始列+合并列已经等于列数了,故不需要再循环html table
     if (this.beginCol+this.colSpans>=this.cols) j=this.cols;
  
    }
    if(i==0)
    {
     //标题栏
     this.oSheet.Range(this.oSheet.Cells(1,1), this.oSheet.Cells(1,1)).Font.Size=20;
     this.oSheet.Range(this.oSheet.Cells(1,1), this.oSheet.Cells(1,1)).Font.Bold = true;
     this.oSheet.Range(this.oSheet.Cells(1,1), this.oSheet.Cells(1,1)).HorizontalAlignment = -4108; //居中
     this.oSheet.Range(this.oSheet.Cells(1,1), this.oSheet.Cells(1,1)).Rows.RowHeight = 40;
    }
     //自动调整行高
   }
 
   //最后一行是否空色
   try{
    this.oSheet.Range(this.oSheet.Cells(this.rows,1), this.oSheet.Cells(this.rows,1)).Font.Color=this.lastRowColor;
   }catch(e){}

   this.oSheet.Range(this.oSheet.Cells(this.fromrow+2,1), this.oSheet.Cells(this.fromrow+this.rows,this.cols)).Rows.RowHeight=20;
   this.oSheet.Range(this.oSheet.Cells(this.fromrow+2,1), this.oSheet.Cells(this.fromrow+this.rows,this.cols)).Font.Size=10;
   //自动换行
   this.oSheet.Range(this.oSheet.Cells(this.fromrow+2,1), this.oSheet.Cells(this.fromrow+this.rows,this.cols)).WrapText = true;
   //自动调整列宽
   this.oSheet.Range(this.oSheet.Cells(this.fromrow+1,1), this.oSheet.Cells(this.fromrow+this.rows,this.cols)).Columns.AutoFit();
   //点虚线
   //this.oSheet.Range(this.oSheet.Cells(this.fromrow+1,1), this.oSheet.Cells(this.fromrow+this.rows,this.cols)).Borders.LineStyle = -4118;
 
   return this.rows;
}

function test(tabId){
// JavaScript Document
//调用方法
var test=new PageToExcel(tabId,0,255,"测试.xls");//table id , 第几行开始,最后一行颜色 ,保存的文件名
test.CreateExcel(false);
test.Exec();
test.SaveAs();
test.CloseExcel();
//LastRowColor 0黑色 255红色
}
分享到:
评论

相关推荐

    javaScript 导出excel文件

    Cell 结构是指 Excel 文件中单元格的基本结构,包括 X 坐标、Y 坐标、合并列情况、合并行情况和内容等几个方面。 4. 将 HTML 表格转换为 Excel Cell 集合 将 HTML 表格转换为 Excel Cell 集合是指使用 JavaScript ...

    Javascript导出Excel,自动合并单元格、自动列宽、有进度条

    js导出execl,自动合并单元格,自动增行,增列

    前端导出 excel ,设置字体,列宽,行高,对其方式,合并单元格等效果

    总结来说,前端导出Excel涉及到数据转换、样式设置和文件生成等多个步骤。使用像`SheetJS`这样的库可以帮助简化这一过程,但正确配置和优化仍然是关键。在实际项目中,确保按照需求正确设置字体、列宽、行高、对齐...

    将HtmlTable 导出为Execl文件,支持合并单元格、合并行,无需Office支持

    对于合并单元格和合并行,这涉及到跟踪单元格的范围和行列索引,确保在Excel文件中正确地复制这些属性。 例如,如果HTML表格的某个表头单元格跨了两列,那么在创建Excel时,我们需要在对应的行中合并两个单元格。...

    xlsx-js-style导出Excel,带样式合并单元格边框显示不全和动态插入表头 解决

    纯JS导出Excel 处理导出Excel如果是合并单元格了无法显示边框问题 处理插入表头问题 导出Excel样式可自定义

    前端导出excel,可以控制样式,单元格合并居中等

    总结,"xlsx.full.min.js"库为前端开发者提供了一种方便的方式来控制Excel文件的样式和格式,包括单元格的合并与居中,从而在网页上实现高度定制化的Excel导出功能。通过熟练掌握这个库的使用,你可以为用户提供更加...

    vue 导出excel,支持单元格合并,背景色,列宽,字体大小等

    vue 导出excel,支持单元格合并,背景色,列宽,字体大小,一个js 文件就可以搞定

    Export2Excel.js导出excel

    "Export2Excel.js导出excel"是一个针对这种情况的解决方案,它允许在Vue项目中实现前端直接导出Excel文件。下面将详细阐述这个功能的实现原理和涉及的技术。 首先,"Blob.js"是用于处理浏览器中的Blob对象的...

    JS导出excel兼容IE6+、主流浏览器、支持复杂表头和单元格合并

    Javascript导出excel为xlsx格式,兼容IE6+和主流浏览器,下载下来直接可以使用。 其他javascript导出excel插件可看作者文章:https://blog.csdn.net/qq_21693027/article/details/80459677

    VUE导出Excel,两种方法,方法二带样式:文字居中,自动换行,列宽设置,单元格合并,冻结表头等

    SheetJS是一个强大的JavaScript库,它允许开发者读写多种电子表格文件格式,包括XLSX和XLSM。然而,SheetJS的免费版并不支持样式设置,这意味着你不能直接设置单元格的对齐方式、换行或者调整列宽等。这对于需要格式...

    layui数据表格导出Excel插件

    layui数据表格导出Excel插件是一款为layui框架设计的实用工具,它允许用户方便地将layui数据表格中的数据导出到Excel文件中。layui是一款轻量级的前端UI框架,以其简洁、优雅的代码风格和丰富的组件库深受开发者喜爱...

    js导出Excel 、Word [超实用][自动保存样式]

    总结一下,JavaScript导出Excel和Word的关键步骤包括: 1. 获取Table数据和样式信息。 2. 将数据转化为适合Excel或Word的格式。 3. 使用库(如SheetJS、docx)生成相应格式的文件。 4. 创建下载链接或通过服务器完成...

    JS操作Excel:使用js-xlsx实现前端导出Excel文件

    JavaScript是前端开发的主要语言,而js-...使用js-xlsx库实现前端导出Excel文件,首先要确保库已经被正确引入。通常,我们可以通过CDN链接在HTML文件中添加`&lt;script&gt;`标签来引入js-xlsx库,如以下代码所示: ```html ...

    vue查询表单导出excel文件所需的js文件excel.zip

    "vue查询表单导出excel文件所需的js文件excel.zip" 包含了实现这一功能所必要的JavaScript库和可能的配置文件。以下是关于这个主题的详细知识点: 1. **Vue.js**: Vue.js 是一个轻量级的前端框架,它允许开发者以...

    JS导出Excel

    在JavaScript中,导出Excel是一项...以上就是关于使用JavaScript导出Excel,包括自动合并单元格、自动调整列宽以及从HTML表格获取数据的一些关键技术点。实际开发中,还需要结合项目需求和具体库的文档进行细致的实现。

    nodejs将mysql数据库中的数据导出成excel表格文件

    接下来,要将数据库中的数据导出为Excel文件,我们可以使用`xlsx`或` SheetJS `库。`xlsx`库是一个强大的工具,能够读取、写入多种电子表格格式,包括XLS、XLSX和CSV等。在`excel.js`文件中,开发者可能定义了函数,...

    Export2Excel.js+Blob导出为表格数据

    在导出Excel文件时,`Blob.js`的作用是将HTML内容转化为Blob对象。Blob是HTML5中的一个重要特性,它允许开发者处理任意类型的数据,包括音频、视频、图片等,也可以是像HTML这样的文本数据。在本场景中,我们使用`...

    多个excel导出压缩成zip 文件 数据量大导出

    "多个Excel导出压缩成zip文件"的场景通常是为了解决数据量过大导致的文件管理不便、传输效率低以及存储空间占用过多等问题。下面我们将深入探讨这个话题,主要涵盖以下几个方面: 1. **大数据量导出**: - 当数据...

    js导出带样式的excel.zip

    下面我们将详细探讨JavaScript导出Excel的相关知识点以及layui如何在这个过程中发挥作用。 1. **JavaScript导出Excel**: - JavaScript本身并不直接支持创建或编辑二进制文件,如Excel。因此,开发者通常会借助于...

    js实现Excel导出

    在JavaScript(JS)环境中,实现Excel导出是一项常见的需求,特别是在Web应用中处理大量数据时。前后端分离的开发模式下,前端需要处理用户交互,包括数据导出,这就需要我们借助一些库或者API来实现。以下是一些...

Global site tag (gtag.js) - Google Analytics