在很多业务场景中,Rails项目会接收到第三方系统返回的XML格式数据,需要将这些数据整理成Excel报表提供给用户下载。下面我们就一步步实现这个功能。

准备工作
首先需要在Gemfile中添加处理Excel的axlsx gem,以及解析XML的nokogiri gem,然后执行bundle install安装依赖。
# Gemfile中添加以下依赖 gem 'axlsx' gem 'nokogiri'
解析XML数据
假设我们有一段XML格式的用户数据,需要先使用Nokogiri解析出需要的内容。以下是示例XML数据和解析代码:
# 示例XML数据
xml_content = <?xml version="1.0" encoding="UTF-8"?>
<users>
<user>
<id>1</id>
<name>张三</name>
<age>25</age>
<email>zhangsan@ipipp.com</email>
</user>
<user>
<id>2</id>
<name>李四</name>
<age>28</age>
<email>lisi@ipipp.com</email>
</user>
</users>
# 解析XML数据的方法
def parse_xml_data(xml_str)
doc = Nokogiri::XML(xml_str)
users = []
doc.xpath('//user').each do |user_node|
user = {
id: user_node.xpath('id').text.to_i,
name: user_node.xpath('name').text,
age: user_node.xpath('age').text.to_i,
email: user_node.xpath('email').text
}
users << user
end
users
end生成Excel报表
解析完XML数据后,使用axlsx库创建Excel工作簿,填充数据并定义报表样式。
# 生成Excel报表的方法
def generate_excel_report(users)
package = Axlsx::Package.new
workbook = package.workbook
# 添加工作表并设置表头
workbook.add_worksheet(name: "用户报表") do |sheet|
# 定义表头样式
header_style = sheet.styles.add_style(
bg_color: "4F81BD",
fg_color: "FFFFFF",
b: true,
alignment: { horizontal: :center }
)
# 写入表头
sheet.add_row ["用户ID", "姓名", "年龄", "邮箱"], style: header_style
# 写入用户数据
users.each do |user|
sheet.add_row [user[:id], user[:name], user[:age], user[:email]]
end
end
package
end在控制器中提供下载接口
最后在Rails控制器中组合上述方法,提供报表下载的接口。
class ReportsController < ApplicationController
def export_user_excel
# 获取XML数据,实际场景中可能是从文件、接口读取
xml_data = <?xml version="1.0" encoding="UTF-8"?>
<users>
<user>
<id>1</id>
<name>张三</name>
<age>25</age>
<email>zhangsan@ipipp.com</email>
</user>
<user>
<id>2</id>
<name>李四</name>
<age>28</age>
<email>lisi@ipipp.com</email>
</user>
</users>
# 解析XML数据
users = parse_xml_data(xml_data)
# 生成Excel报表
package = generate_excel_report(users)
# 设置响应 header 触发文件下载
send_data package.to_stream.read,
type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
filename: "user_report_#{Time.now.strftime('%Y%m%d%H%M%S')}.xlsx",
disposition: "attachment"
end
private
def parse_xml_data(xml_str)
doc = Nokogiri::XML(xml_str)
users = []
doc.xpath('//user').each do |user_node|
user = {
id: user_node.xpath('id').text.to_i,
name: user_node.xpath('name').text,
age: user_node.xpath('age').text.to_i,
email: user_node.xpath('email').text
}
users << user
end
users
end
def generate_excel_report(users)
package = Axlsx::Package.new
workbook = package.workbook
workbook.add_worksheet(name: "用户报表") do |sheet|
header_style = sheet.styles.add_style(
bg_color: "4F81BD",
fg_color: "FFFFFF",
b: true,
alignment: { horizontal: :center }
)
sheet.add_row ["用户ID", "姓名", "年龄", "邮箱"], style: header_style
users.each do |user|
sheet.add_row [user[:id], user[:name], user[:age], user[:email]]
end
end
package
end
end注意事项
- 如果XML数据量较大,解析时建议分批处理,避免占用过多内存
- 可以根据业务需求调整Excel的样式,比如列宽、单元格格式、边框等
- 实际项目中XML数据可能来自外部接口,需要做好异常处理,避免解析失败导致接口报错
- 如果报表需要支持中文,确保Rails项目的编码配置为UTF-8,避免乱码问题
按照以上步骤,就可以在Ruby on Rails项目中完成XML数据到Excel报表的导出功能,用户访问对应的接口就能下载到整理好的Excel文件。
Ruby_on_RailsXMLExcel导出报表生成axlsx修改时间:2026-05-29 05:05:29