`
kenken0y
  • 浏览: 37278 次
社区版块
存档分类
最新评论

rails+extjs中excel导出

阅读更多

网上有extjs的grid直接导出为excel的控件,但是不满足需求,因为grid一般是分页的,而excel导出的时候肯定是全部数据

 

导 出excel这个过程的输入是 列配置信息(列头,字段名,宽度,顺序)

输出时excel文件

生成grid数据和导出 excel的数据要能重用

 

所以把列头信息作为参数传递到服务器端

params = Ext.apply({},this.findParentByType('form').getForm().getValues(),store.baseParams);

var cm = grid.getColumnModel() ;
for (var i = 0; i < cm.getColumnCount(); i++) {
    if (cm.getDataIndex(i)){
        var fld = grid.store.recordType.prototype.fields.get(cm.getDataIndex(i));
        var column_type = 'String';
        switch(fld.type) {
            case "int":
                column_type="int";
                break;
            case "float":
                column_type="float";
                break;
            case "date":
                column_type="date";
                break;
        };
        params['columns['+i+'][hidden]']= cm.isHidden(i);
        params['columns['+i+'][column_width]'] = cm.getColumnWidth(i);
        params['columns['+i+'][column_header]']= cm.getColumnHeader(i);
        params['columns['+i+'][column_type]']  = column_type;
        params['columns['+i+'][data_index]']  = cm.getDataIndex(i);
    }
}
openPostWindow('/car_info/export_to_excel','_blank',params); //注意这行 

 

最后在新窗口打开链接不是用window.open,因为get方式传输数据量有限制,在ie中可能会报错,要用post方式

openPostWindow代码如下:

function openPostWindow(url,name,data){ 
    var tempForm = document.createElement("form"); 
    tempForm.id="tempForm1"; 
    tempForm.method="post"; 
    tempForm.action=url; 
    tempForm.target=name; 
    for(var p in data){ 
        var hideInput = document.createElement("input"); 
        hideInput.type="hidden"; 
        hideInput.name= p;
        hideInput.value= data[p];
        tempForm.appendChild(hideInput);  
    }    
    var request_forgery_protection_token_hideInput = document.createElement("input"); 
    request_forgery_protection_token_hideInput.type="hidden"; 
    request_forgery_protection_token_hideInput.name= "authenticity_token";
    request_forgery_protection_token_hideInput.value= Ext.Ajax.extraParams.authenticity_token;
    tempForm.appendChild(request_forgery_protection_token_hideInput);  

    if(tempForm.attachEvent){
        tempForm.attachEvent("onsubmit",function(){openWindow(name);});
    } else {
        tempForm.addEventListener("submit",function(){openWindow(name);},false); 
    }
    document.body.appendChild(tempForm); 
    if (tempForm.fireEvent) {
        tempForm.fireEvent('onsubmit');
        tempForm.submit();
    } else if (document.createEvent) {
        var ev = document.createEvent('HTMLEvents');
        ev.initEvent('submit', false, true);
        tempForm.dispatchEvent(ev);
    }
    
    document.body.removeChild(tempForm);
    return false;
}

 在firefox和ie中测试通过

 

 

服务器端代码如下

 

    query_params = params
    query_params.delete(:limit)
    query_params.delete(:start)
    result = listdata(query_params)
    
    xls_report = StringIO.new  
    book = Spreadsheet::Workbook.new  
    sheet1 = book.create_worksheet :name => "WORKSHEET_NAME"  

    sheet1.row(0).default_format = Spreadsheet::Format.new :color => :black, :weight => :bold, :size => 10  
    
    keys = params[:columns].keys.compact.collect{|key| key.to_i}.sort.collect{|key| key.to_s}
      
    sheet1.row(0).concat(keys.collect{|key| params[:columns][key][:column_header]})
    row_num = 1
    result[:rows].each do |row|
      sheet1.row(row_num).concat keys.collect{|key| row[params[:columns][key][:data_index]]}
      row_num = row_num + 1
    end
    keys.each_with_index  do |key,index| 
      sheet1.column(index).width = params[:columns][key][:column_width].to_f/10
    end

    book.write xls_report  

    send_data(xls_report.string,
      :filename => 'FILENAME.xls',
      :type => 'application/vnd.ms-excel',
      :disposition => 'inline')

 首先删除limit和start两个参数,然后调用listdata这个取数据的方法(这个方法一般写在model中,这里为了简单写在controller中作为private方法),然后把数据写入到excel流中,最后发送excel流

 

这样excel导出完成,excel和grid从同一来源取数据

并且如果在界面上调整了列的顺序或者宽度,导出的excel会随着变化

 

 

分享到:
评论

相关推荐

    Ruby+Rails+社交+教程

    这个“Ruby+Rails+社交+教程”显然旨在引导开发者如何利用Rails的灵活性和强大功能构建一个完整的社交平台。以下是教程可能涵盖的一些核心知识点: 1. **Ruby基础知识**:首先,你需要对Ruby编程语言有基本的理解,...

    Agile+Web+Development+with+Rails+(4th+Ed....pdf

    Agile+Web+Development+with+Rails+(4th+Ed....pdf

    Ruby+Rails+社交+教程3

    本教程“Ruby+Rails+社交+教程3”旨在帮助开发者掌握如何利用Ruby的强大功能和Rails的优雅设计来构建一个具有用户交互性的社交平台。 首先,让我们深入了解一下Ruby。Ruby是一种面向对象的编程语言,以其简洁、易读...

    Ruby+Rails+社交+进阶教程5

    在本“Ruby+Rails+社交+进阶教程5”中,我们将深入探讨如何利用Ruby on Rails框架构建一个功能丰富的社交网络平台。Ruby on Rails(简称Rails)是一个基于Ruby语言的开源Web应用程序框架,它遵循MVC(模型-视图-控制...

    rails+grape+swagger+devise+capistrano 简单融合示例

    总结来说,这个"rails+grape+swagger+devise+capistrano"的简单融合示例展示了一个完整的、功能齐全的API项目架构。Rails作为基础框架,Grape负责API的构建,Swagger用于API的文档化,Devise处理用户认证,而...

    to_xls-rails:将Rails ActiveRecord或Mongid数据导出到Excel文件

    这个简单的插件使您能够调用to_xls到Rails的数组集合。 数组元素支持对象:ActiveRecord,Mongid,哈希。 在您的Gemfile中: gem 'to_xls-rails' # Last officially released gem # gem "to_xls-rails", :git =&gt; ...

    在RHEL上安裝設置ROR(nginx+passenger+ruby+rails+oracle+netzke)

    安装`netzke-basepack` gem,然后在Rails应用中集成Netzke的组件和配置。 8. **环境变量与权限**: 确保所有必要的环境变量已经设置,如Oracle的`TNS_ADMIN`和`ORACLE_HOME`。同时,要为Rails应用和数据库连接设置...

    math_game:一个实验游戏,练习Rails + Hotwire + Turbo

    两名玩家在五轮中回答简单的数学方程式,每轮有四个备选方案。 游戏仅接受第一个答案。 如果答案正确,则回答者得分为1分。 如果不是,则对手得分为1分。 如果对手已经回答了方程,第二位玩家将无法回答。 在本地...

    Linux系统上配置Nginx+Ruby on Rails+MySQL超攻略

    安装 RVM 通常使用 RVM 或 rbenv 来安装 Ruby,这里选用 RVM。 $ curl -sSL https://get.rvm.io | bash ... 载入 RVM : $ source /home/libuchao/.rvm/scripts/rvm $ rvm -v rvm 1.25.12 (stable) by Wayne E....用 RVM

    rails_docker_template:用于Rails应用程序或Rails + Webpacker应用程序开发的Docker模板

    docker rails模板用于Rails应用程序或Rails + ... script/bootstrapdocker-compose exec rails bash 您可以在docker容器中执行任何命令。入门您可以从这样的模板构建Rails应用程序。 git clone https://github.c

    rails-semantic-react:语义 UI + Rails + React

    Ruby on Rails + 语义 UI + React 小实验使用这三种技术。 我希望这个例子对某人有用 =) 直通车 某些输入(例如复选框)在与语义 UI 一起使用时被 DIV“屏蔽”,因此您无法直接访问输入。 由于 JSX,一些语义 UI ...

    tt-twitter:在Rails + Docker-compose + Heroku Container Registry上的Twitter搜索应用程序

    Rails + Docker-compose + Heroku容器注册表上的twitter搜索应用程序 Ruby版本 2.5.1 系统依赖 码头工人 Heroku 配置 $ git clone https://github.com/tsubasa-tech/tt-twitter.git $ docker-compose run web ...

    Ruby On Rails系列从入门到精通实战教程 Ruby基础+Rails框架+网上商城项目实战

    Ruby On Rails系列从入门到精通实战教程 Ruby基础+Rails框架+网上商城项目实战

    chadder:Rails + Angular 9gag 查看器

    在Chadder项目中,Rails负责处理数据的存储、用户认证、API交互等后端任务。 **Angular**是Google维护的一个JavaScript框架,用于构建单页应用程序(SPA)。Angular采用声明式编程,提供了组件化、依赖注入、数据...

    anime-talk:Rails + JavaScript项目-阶段4

    在“anime-talk: Rails + JavaScript项目-阶段4”中,我们关注的是使用Ruby on Rails框架与JavaScript技术构建一个动漫讨论平台的第四阶段。这个项目旨在教你如何将后端的强大力量与前端的动态交互性相结合,以创建...

    webpackrails-example:Webpack + Rails +React

    这个例子展示了如何使webpack与rails一起使用,它如何使用 gem。 跑步 npm install && bundle && bundle exec rails s 关于版本的通知。 对于Rails 3,请检查您的gem文件,确保所有gem与Rails 3兼容。 对于Rails 4...

    rails金典教材3本

    Ruby+on+Rails+3+Tutorial.pdf 应用Rails进行敏捷Web开发第4版.pdf (Agile Web Development with Rails) Rails.Recipes.Rails.3.Edition.pdf

    docker-rails-nginx-unicorn:Docker Rails + Nginx + Unicorn(来自Ubuntu 16.04和Ruby 2.4.0)

    docker-rails-nginx-unicorn ...在您的项目中创建Dockerfile并粘贴以下代码。 # Dockerfile FROM zeroc0d3/docker-rails-nginx-unicorn MAINTAINER ZeroC0D3 Team (zeroc0d3.0912@gmail.com) EXPOSE 80 添加

    使用Aptana+Rails开发Rails Web应用(中文)

    安装过程中,遵循提示进行,确保选择自定义安装并勾选Rails相关的插件,以便在Aptana中获得对Rails的全面支持。 安装完成后,打开Aptana Studio,创建一个新的Rails项目。在“File”菜单中选择“New”然后点击...

    react-blog:React + Redux + Ruby On Rails 实现的博客系统

    本项是使用 React 实现的个人博客,使用了 Redux 做数据管理,后端使用的是 Ruby On Rails 提供的接口,欢迎大家围观! 本地部署 git clone git@github.com:wewin11235/react-blog.git cd react-blog npm install ...

Global site tag (gtag.js) - Google Analytics