2009-04-01 5 views
3

Je sais ce que vous en pensez, il suffit de télécharger les données au format CSV et de les importer dans Excel. Malheureusement, nous demandons à un utilisateur de choisir facilement des données d'une application Rails (c'est-à-dire avec un minimum d'intervention de l'utilisateur - idéalement un simple appui sur un bouton) pour l'exporter et l'ouvrir dans un tableur Excel existant. contient diverses formules et macros, etc., qui seront appliquées aux données.Quel est le meilleur moyen d'obtenir des données d'une application Ruby on Rails dans une feuille de calcul Excel?

Ma solution idéale impliquerait la plupart des charges lourdes à la fin de Rails, car c'est là que mes compétences se trouvent, mais je suppose qu'il pourrait y avoir une sorte de matériel d'intégration web Excel qui pourrait aider.

De toute façon, est-ce que je peux avoir quelques recommandations sur les bonnes approches à cela?

Répondre

2

La partie à l'exportation est assez bien couvert au moins - voici quelques pierres précieuses candidats:

je soupçonne (! Espoir) qu'une fois que vous avez vos données sous forme XLS, le reste doit être plomberie côté client.

Y a-t-il un intérêt à regarder la fonction de requête Web d'Excel? Si l'utilisateur peut définir ses critères de sélection de telle sorte que la modification soit peu fréquente, une page personnalisée (peut-être en livrant simplement une table) peut déposer les données directement dans sa session Excel. Juste une pensée ...

+0

Merci - ce sont les lignes que je pensais le long. Malheureusement, par définition, les données seront différentes sur chaque demande. Donc, d'une manière ou d'une autre, le bit de requête Web Excel doit interagir avec le bit d'interface Web où il choisit les données. – DanSingerman

4

axlsx est probablement la mise en œuvre la plus complète pour exceller en profondeur le travail. https://github.com/randym/axlsx

Voici un exemple qui construit l'un des modèles de Microsoft 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 
Questions connexes