代码之家  ›  专栏  ›  技术社区  ›  DanSingerman

将Ruby on Rails应用程序中的数据导入Excel电子表格的最佳方法是什么?

  •  3
  • DanSingerman  · 技术社区  · 16 年前

    我知道你在想什么,只需下载CSV格式的数据并导入Excel即可。

    我理想的解决方案将涉及Rails端的大部分繁重工作,因为这是我的技能所在,但我想可能有一些Excel web集成的东西会有所帮助。

    不管怎样,我能就解决这个问题的好方法提出一些建议吗?

    3 回复  |  直到 10 年前
        1
  •  4
  •   randym    13 年前

    axlsx可能是deepexcel工作中最完整的实现。 https://github.com/randym/axlsx

    以下是一个构建微软skydrive模板的示例: enter image description here

    require 'axlsx'
    
    Axlsx::Package.new do |p|
      p.workbook do |wb|
        styles = wb.styles
        header = styles.add_style :bg_color => "DD", :sz => 16, :b => true, :alignment => {:horizontal => :center}
        tbl_header = styles.add_style :b => true, :alignment => { :horizontal => :center }
        ind_header = styles.add_style :bg_color => "FFDFDEDF", :b => true, :alignment => {:indent => 1}
        col_header  = styles.add_style :bg_color => "FFDFDEDF", :b => true, :alignment => { :horizontal => :center }
        label       = styles.add_style :alignment => { :indent => 1 }
        money       = styles.add_style :num_fmt => 5
        t_label       = styles.add_style :b => true, :bg_color => "FFDFDEDF"
        t_money = styles.add_style :b => true, :num_fmt => 5, :bg_color => "FFDFDEDF"
    
        wb.add_worksheet do |sheet|
          sheet.add_row
          sheet.add_row [nil, "College Budget"], :style => [nil, header]
          sheet.add_row
          sheet.add_row [nil, "What's coming in this month.", nil, nil, "How am I doing"], :style => tbl_header
          sheet.add_row [nil, "Item", "Amount", nil, "Item", "Amount"], :style => [nil, ind_header, col_header, nil, ind_header, col_header]
          sheet.add_row [nil, "Estimated monthly net income", 500, nil, "Monthly income", "=C9"], :style => [nil, label, money, nil, label, money]
          sheet.add_row [nil, "Financial aid", 100, nil, "Monthly expenses", "=C27"], :style =>  [nil, label, money, nil, label, money]
          sheet.add_row [nil, "Allowance from mom & dad", 20000, nil, "Semester expenses", "=F19"], :style =>  [nil, label, money, nil, label, money]
          sheet.add_row [nil, "Total", "=SUM(C6:C8)", nil, "Difference", "=F6 - SUM(F7:F8)"], :style => [nil, t_label, t_money, nil, t_label, t_money]
          sheet.add_row
          sheet.add_row [nil, "What's going out this month.", nil, nil, "Semester Costs"], :style => tbl_header
          sheet.add_row [nil, "Item", "Amount", nil, "Item", "Amount"], :style => [nil, ind_header, col_header, nil, ind_header, col_header]
          sheet.add_row [nil, "Rent", 650, nil, "Tuition", 200], :style =>  [nil, label, money, nil, label, money]
          sheet.add_row [nil, "Utilities", 120, nil, "Lab fees", 50], :style =>  [nil, label, money, nil, label, money]
          sheet.add_row [nil, "Cell phone", 100, nil, "Other fees", 10], :style =>  [nil, label, money, nil, label, money]
          sheet.add_row [nil, "Groceries", 75, nil, "Books", 150], :style =>  [nil, label, money, nil, label, money]
          sheet.add_row [nil, "Auto expenses", 0, nil, "Deposits", 0], :style =>  [nil, label, money, nil, label, money]
          sheet.add_row [nil, "Student loans", 0, nil, "Transportation", 30], :style =>  [nil, label, money, nil, label, money]
          sheet.add_row [nil, "Other loans", 350, nil, "Total", "=SUM(F13:F18)"], :style => [nil, label, money, nil, t_label, t_money]
          sheet.add_row [nil, "Credit cards", 450], :style => [nil, label, money]
          sheet.add_row [nil, "Insurance", 0], :style => [nil, label, money]
          sheet.add_row [nil, "Laundry", 10], :style => [nil, label, money]
          sheet.add_row [nil, "Haircuts", 0], :style => [nil, label, money]
          sheet.add_row [nil, "Medical expenses", 0], :style => [nil, label, money]
          sheet.add_row [nil, "Entertainment", 500], :style => [nil, label, money]
          sheet.add_row [nil, "Miscellaneous", 0], :style => [nil, label, money]
          sheet.add_row [nil, "Total", "=SUM(C13:C26)"], :style => [nil, t_label, t_money]
          sheet.add_chart(Axlsx::Pie3DChart) do |chart|
            chart.title = sheet["B11"]
            chart.add_series :data => sheet["C13:C26"], :labels => sheet["B13:B26"]
            chart.start_at 7, 2
            chart.end_at 12, 15
          end
          sheet.add_chart(Axlsx::Bar3DChart, :barDir => :col) do |chart|
            chart.title = sheet["E11"]
            chart.add_series :labels => sheet["E13:E18"], :data => sheet["F13:F18"]
            chart.start_at 7, 16
            chart.end_at 12, 31
          end
          sheet.merged_cells.concat ["B4:C4","E4:F4","B11:C11","E11:F11","B2:F2"]
          sheet.column_widths 2, nil, nil, 2, nil, nil, 2
        end
     end
     p.use_shared_strings = true
     p.serialize 'axlsx.xlsx'
    end
    
        2
  •  2
  •   Mike Woodhouse    16 年前

    出口部分至少涵盖得相当好——这里有几个候选宝石:

    我怀疑(希望!)一旦你有了XLS格式的数据,其余的应该在客户端进行管道处理。

    查看Excel的Web查询功能有什么价值吗?如果用户可以定义他们的选择标准,使得更改不频繁,那么自定义页面(可能只是传递一个表)可以将数据直接放入他们的Excel会话中。只是一个想法。..

        3
  •  0
  •   Alex Blakemore    13 年前

    Ryan Bates刚刚在railscasts.com上发布了一个免费的短片 Exporting CSV and Excel