Skip to content

Integrations vi

Hammad Maqbool edited this page Oct 29, 2026 · 1 revision

English · 简体中文 · 繁體中文 · Español · العربية · Français · Português (Brasil) · Deutsch · हिन्दी · 日本語 · 한국어 · Русский · Bahasa Indonesia · Türkçe · Italiano · Tiếng Việt

Dùng docxi với Rails, Rack và tác vụ nền

docxi không có plugin và không có tích hợp dựng sẵn. Đây là mã Ruby thuần trả về một StringIO, nên hoạt động ở bất cứ đâu bạn có thể gửi hoặc lưu một chuỗi. Trang này trình bày những cách kết nối thường dùng. Mẫu controller của Rails là mẫu được nêu trong README, và bộ kiểm thử chạy với Rails từ 5.2 đến 8.1 được nạp.

Controller của Rails: gửi tệp tới trình duyệt

class ReportsController < ApplicationController
  def show
    word = Docxi::Document.new
    word.document.p { |p| p.text "Report for #{Date.today}" }

    send_data word.render.string,
              filename: "report.docx",
              type: "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
  end
end

send_data đặt Content-Disposition: attachment, nên trình duyệt sẽ tải tệp xuống. Khi dùng Bundler, docxi được nạp tự động từ Gemfile.

Tác vụ nền của Rails: tạo tệp bên ngoài yêu cầu

Tài liệu lớn, hoặc tài liệu được dựng từ các truy vấn chậm, nên được tạo trong một tác vụ (job):

class MonthlyReportJob < ApplicationJob
  queue_as :default

  def perform(path)
    word = Docxi::Document.new
    word.document.p { |p| p.text "Monthly report", bold: true, size: 16 }

    File.binwrite(path, word.render.string)
  end
end

Tác vụ ghi tệp vào đường dẫn bạn chọn. Tệp được chuyển đi đâu tiếp theo, chẳng hạn vào kho lưu trữ hay gửi qua email, là do ứng dụng của bạn quyết định.

Rack và các framework khác

Bất kỳ ứng dụng Rack nào cũng có thể trả về các byte trực tiếp:

require "docxi"

class ReportApp
  def call(env)
    word = Docxi::Document.new
    word.document.p { |p| p.text "Generated by a Rack app" }

    headers = {
      "content-type" => "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
      "content-disposition" => 'attachment; filename="report.docx"'
    }
    [200, headers, [word.render.string]]
  end
end

Gắn ứng dụng bằng run ReportApp.new trong config.ru. Cách làm tương tự áp dụng được cho Sinatra, Hanami hoặc bất kỳ framework nào có thể gửi một chuỗi làm phần thân phản hồi.

Script và công cụ dòng lệnh

docxi không cần máy chủ cũng không cần phần mềm văn phòng, nên một script Ruby thông thường là đủ:

require "docxi"

word = Docxi::Document.new
word.document.p { |p| p.text "Nightly export" }
File.binwrite(ARGV.fetch(0, "export.docx"), word.render.string)

Trang liên quan


← Trang chủ wiki · README

Clone this wiki locally