2009-04-01 4 views
3

당신이 생각하는대로 데이터를 CSV로 다운로드하고 Excel로 가져올 수 있습니다.Ruby on Rails 앱의 데이터를 Excel 스프레드 시트로 가져 오는 가장 좋은 방법은 무엇입니까?

불행히도 우리는 사용자가 Rails 응용 프로그램에서 일부 데이터를 선택한 다음 (즉, 가능한 한 적은 사용자 개입으로 - 이상적인 단일 버튼 누름) 데이터를 내보내고 기존 Excel 스프레드 시트에서 열어야합니다. 데이터에 적용될 다양한 수식 및 매크로 등을 포함합니다.

나의 이상적인 솔루션은 Rails 끝 부분에서 무거운 짐을 지우는 것입니다. 그게 내 기술이있는 곳이지만, Excel 웹 통합 작업에 도움이 될 수 있습니다.

어쨌든 좋은 접근 방법에 대한 권장 사항이 있습니까?

답변

2

수출 부분은 합리적으로 잘 적어도 덮여있다 - 여기 후보 보석 몇입니다 :

내가 의심 (! 희망) 당신은 당신의 데이터를 일단 XLS 양식에서 나머지는 클라이언트 측에서 배관해야합니다.

Excel의 웹 쿼리 기능을 살펴볼 때 가치가 있습니까? 사용자가 변경 사항이 자주 발생하지 않도록 선택 기준을 정의 할 수있는 경우 사용자 정의 페이지 (테이블 만 제공)가 데이터를 Excel 세션으로 곧바로 드롭 할 수 있습니다. 그냥 생각 ...

+0

감사합니다 -이 내가 함께 생각 라인이었다. 불행히도 정의에 따르면 각 요청마다 데이터가 달라집니다. 따라서 어떤면에서는 Excel 웹 쿼리 비트가 데이터를 선택하는 웹 UI 비트와 상호 작용해야합니다. – DanSingerman

4

axlsx에 railscasts.com에서 무료로 짧은 스크린 캐스트를 발표 아마도 깊은 일을 엑셀에 대한 가장 완벽한 구현입니다. 여기 https://github.com/randym/axlsx

는 마이크로 소프트의 스카이 드라이브 템플릿 중 하나를 빌드 예입니다 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 
관련 문제