如何修复 Rails 导出的 Excel (.xls) 文件中的字符编码?
How to fix character encoding in a Rails exported Excel (.xls) file?
我正在使用一个控制器导出一个 .xls 文件,其中包含几个包含西班牙语翻译文本的字段。
字符编码似乎不正确,因为我在整个文件中看到 Débito Automático
而不是 Débito Automático
之类的词。
我认为 excel 默认为 iso-8859-1 字符编码,但我不知道如何更改或指定 Rails控制器。
def show
...
format.xls do
@enriched_invoices = @enriched_invoices.includes(user: { address: :city })
end
end
end
end
html 响应.xls格式:
<table border="1">
<tr>
<th>Fecha Factura</th>
<th>ID Cliente</th>
<th>user_external_reference</th>
<th>Cliente</th>
<th>Domicilio</th>
<th>Código Postal</th>
<th>Ciudad</th>
<th>DNI</th>
<th>Email</th>
<th>ID Factura</th>
<th>Motivo</th>
<th>Descripción</th>
<th>Estado</th>
<th>Importe del Recibo</th>
<th>Metodo de pago</th>
<th>Estado Ultimo Pago</th>
<th>Descripcion estado Ultimo Pago</th>
<th>Fecha de creación del Pago</th>
<th>Fecha de aprobación del Pago</th>
<th>Monto del pago</th>
<th>Forma de pago</th>
</tr>
<% @enriched_invoices.each do |invoice| %>
<tr>
<td><%= invoice.due_date.strftime("%Y-%m-%d") %></td>
<td><%= invoice.user_id %></td>
<td><%= invoice.user.external_reference %></td>
<td><%= invoice.user.full_name %></td>
<td><%= invoice.user.address&.full_address %></td>
<td><%= invoice.user.address&.cp %></td>
<td><%= invoice.user.address&.city_name.presence || invoice.user.address&.city&.name %></td>
<td><%= invoice.user.doc_number %></td>
<td><%= invoice.user.email %></td>
<td><%= invoice.id %></td>
<td><%= invoice.subscription? ? 'Subscription' : invoice.invoiceable_type %></td>
<td><%= invoice.invoice_items.order(:id).pluck(:description).join('. ') %></td>
<td><%= invoice.status %></td>
<td><%= humanized_money_with_symbol invoice.amount %></td>
<td><%= invoice.payment_method %></td>
<td><%= invoice.last_payment_status %> </td>
<td><%= invoice.last_payment_status_detail %> </td>
<td><%= invoice.last_payment_date_created&.strftime("%Y-%m-%d") %> </td>
<td><%= invoice.last_payment_date_approved&.strftime("%Y-%m-%d") %> </td>
<td><%= humanized_money_with_symbol(Money.new(invoice.last_payment_amount_cents, invoice.amount.currency)) %></td>
<td><%= invoice.last_payment_payment_type %></td>
</tr>
<% end %>
</table>
有没有不用 gem 的方法?
您也许可以通过其中一种方法解决它(通过增加工作的可能性)
为您的响应使用特定布局,明确声明内容采用 UTF-8。不能保证 Excel 会遵守,而且关于它的文档为零。
强制您的渲染管道使用 :xls
格式的特定选项。检查 https://api.rubyonrails.org/classes/ActionController/Renderers.html#method-c-add
改为将您的数据公开为 CSV(同样不能保证 excel 正确解析它)
使用 html 实体代替 utf-8 字节序列:"Descripción"
或者如果代码中有内容,也可以使用 https://rubygems.org/gems/htmlentities 和 HTMLEntities.new.encode(string, :named)
(而不是在模板中)
我正在使用一个控制器导出一个 .xls 文件,其中包含几个包含西班牙语翻译文本的字段。
字符编码似乎不正确,因为我在整个文件中看到 Débito Automático
而不是 Débito Automático
之类的词。
我认为 excel 默认为 iso-8859-1 字符编码,但我不知道如何更改或指定 Rails控制器。
def show
...
format.xls do
@enriched_invoices = @enriched_invoices.includes(user: { address: :city })
end
end
end
end
html 响应.xls格式:
<table border="1">
<tr>
<th>Fecha Factura</th>
<th>ID Cliente</th>
<th>user_external_reference</th>
<th>Cliente</th>
<th>Domicilio</th>
<th>Código Postal</th>
<th>Ciudad</th>
<th>DNI</th>
<th>Email</th>
<th>ID Factura</th>
<th>Motivo</th>
<th>Descripción</th>
<th>Estado</th>
<th>Importe del Recibo</th>
<th>Metodo de pago</th>
<th>Estado Ultimo Pago</th>
<th>Descripcion estado Ultimo Pago</th>
<th>Fecha de creación del Pago</th>
<th>Fecha de aprobación del Pago</th>
<th>Monto del pago</th>
<th>Forma de pago</th>
</tr>
<% @enriched_invoices.each do |invoice| %>
<tr>
<td><%= invoice.due_date.strftime("%Y-%m-%d") %></td>
<td><%= invoice.user_id %></td>
<td><%= invoice.user.external_reference %></td>
<td><%= invoice.user.full_name %></td>
<td><%= invoice.user.address&.full_address %></td>
<td><%= invoice.user.address&.cp %></td>
<td><%= invoice.user.address&.city_name.presence || invoice.user.address&.city&.name %></td>
<td><%= invoice.user.doc_number %></td>
<td><%= invoice.user.email %></td>
<td><%= invoice.id %></td>
<td><%= invoice.subscription? ? 'Subscription' : invoice.invoiceable_type %></td>
<td><%= invoice.invoice_items.order(:id).pluck(:description).join('. ') %></td>
<td><%= invoice.status %></td>
<td><%= humanized_money_with_symbol invoice.amount %></td>
<td><%= invoice.payment_method %></td>
<td><%= invoice.last_payment_status %> </td>
<td><%= invoice.last_payment_status_detail %> </td>
<td><%= invoice.last_payment_date_created&.strftime("%Y-%m-%d") %> </td>
<td><%= invoice.last_payment_date_approved&.strftime("%Y-%m-%d") %> </td>
<td><%= humanized_money_with_symbol(Money.new(invoice.last_payment_amount_cents, invoice.amount.currency)) %></td>
<td><%= invoice.last_payment_payment_type %></td>
</tr>
<% end %>
</table>
有没有不用 gem 的方法?
您也许可以通过其中一种方法解决它(通过增加工作的可能性)
为您的响应使用特定布局,明确声明内容采用 UTF-8。不能保证 Excel 会遵守,而且关于它的文档为零。
强制您的渲染管道使用
:xls
格式的特定选项。检查 https://api.rubyonrails.org/classes/ActionController/Renderers.html#method-c-add改为将您的数据公开为 CSV(同样不能保证 excel 正确解析它)
使用 html 实体代替 utf-8 字节序列:
"Descripción"
或者如果代码中有内容,也可以使用 https://rubygems.org/gems/htmlentities 和HTMLEntities.new.encode(string, :named)
(而不是在模板中)