Каков наилучший способ экспорта данных UTF8 в Excel? - PullRequest
27 голосов
/ 16 января 2009

Итак, у нас есть это веб-приложение, в котором мы поддерживаем данные UTF8. Ура UTF8. И мы можем экспортировать предоставленные пользователем данные в CSV без проблем - в тот момент они все еще были в UTF8. Проблема в том, что когда вы открываете типичный CSV-файл UTF8 в Excel, он читает его как текст в кодировке ANSII и, соответственно, пытается прочитать двухбайтовые символы, такие как ø и ü, как два отдельных символа, и в результате вы получаете ошибку.

Итак, я немного покопался (у ребят из Интервалов есть интересный пост об этом здесь ), и есть некоторые ограниченные, если до смешного надоедливые варианты. Среди них:

  • предоставляет файл UTF-16 Little Endian TSV, который Excel будет правильно интерпретировать, но который не будет поддерживать многострочные данные
  • предоставление данных в таблице HTML с расширением mime-типа или расширением файла Excel (не уверен, поддерживает ли этот параметр UTF8)
  • Существует три или четыре способа передачи данных XML в различные последние версии Excel, и те теоретически поддерживают UTF8. SpreadsheetML с использованием пользовательского XSLT или создание нового формата Excel XML с помощью шаблонов.

Похоже, что несмотря ни на что, я, вероятно, захочу продолжить предлагать простой старый файл CSV для людей, которые все равно не используют его для Excel, и отдельный вариант загрузки для Excel.

Какой самый простой способ создания файла Just-For-Excel, который будет правильно поддерживать UTF8, мои дорогие переполнения стека? Если этот самый простой вариант поддерживает только последнюю версию Excel, это по-прежнему представляет интерес.

Я делаю это в стеке Rails, но мне любопытно, как .Net-пользователи и люди в любых фреймворках справляются с этим. Я сам работаю в нескольких различных условиях, и это определенно станет проблемой.

Обновление 2010-10-22: Мы использовали гем Ruport в нашей системе отслеживания времени Tempo , чтобы обеспечить экспорт CSV, когда я впервые опубликовал этот вопрос. Один из моих коллег, Эрик Холленсби, собрал быстрый фильтр для Ruport, чтобы предоставить нам фактический вывод Excel XSL, и я решил поделиться этим здесь с любыми другими пользователями ruby:

require 'rubygems'
require 'ruport'
require 'spreadsheet'
require 'stringio'

Spreadsheet.client_encoding = "UTF-8"

include Ruport::Data

class Ruport::Formatter::Excel < Ruport::Formatter
  renders :excel, :for => Ruport::Controller::Table

  def output
    retval = StringIO.new

    if options.workbook
      book = options.workbook
    else
      book = Spreadsheet::Workbook.new
    end

    if options.worksheet_name
      book_args = { :name => options.worksheet_name }
    else
      book_args = { }
    end

    sheet = book.create_worksheet(book_args)

    offset = 0

    if options.show_table_headers
      sheet.row(0).default_format = Spreadsheet::Format.new(
        options.format_options || 
        { 
          :color => :blue,
          :weight => :bold,
          :size => 18
        }
      )
      sheet.row(0).replace data.column_names
      offset = 1
    end

    data.data.each_with_index do |row, i|
      sheet.row(i+offset).replace row.attributes.map { |x| row.data[x] }
    end

    book.write retval
    retval.seek(0)
    return retval.read
  end
end

Ответы [ 8 ]

9 голосов
/ 21 июля 2010

Я обнаружил, что если для кодировки веб-страницы задать кодировку utf-8, а затем Response.Binary, написать метку порядка байтов UTF-8 (0xEF 0xBB 0xBF) в верхней части файла CSV, то Excel 2007 не уверен насчет других версий) распознает его как utf-8 и правильно его откроет.

7 голосов
/ 19 января 2010

После нескольких часов борьбы с той же проблемой, я нашел этот отличный пост по теме

http://blog.plataformatec.com.br/2009/09/exporting-data-to-csv-and-excel-in-your-rails-app/ цитата:

Итак, это три правила работа с Excel-friendly-CSV:

  1. Используйте таблицы, а не запятые.
  2. Поля НЕ должны содержать переводы строк.
  3. Используйте UTF-16 Little Endian для отправки файла пользователю. И включить Little Endian BOM вручную.

Однако, если вы используете ruby, ваша проблема решена: сначала у вас есть FasterCSV драгоценный камень

но в итоге я использовал гем электронных таблиц, который напрямую генерирует электронные таблицы (У меня есть ограничение по ссылке, просто таблица Google + rubyforge) Блестящий!

5 голосов
/ 16 января 2009

Вы забыли создать источник данных OleDB и Excel Interop, но есть и проблемы с ними.

Я рекомендую вариант SpreadsheetML . Он работает довольно хорошо, скорее всего, ваша платформа имеет несколько приличных инструментов для создания XML-файлов, и она полностью поддерживается еще в OfficeXP. Office2000 не поддерживается, но личный опыт показывает, что он работает ограниченным образом.

1 голос
/ 15 ноября 2011

Я заглянул в этот пост в поисках ответа Ruby о том, почему Excel не может правильно загрузить CSV с символами utf-8. После поисков и экспериментов это решение сработало для меня:

csv_content = CSV.generate(col_sep: "\t", headers: :first_row, encoding: 'utf-8') do |csv|
  csv << ["header1", "header2"]
  csv << ["content1", "content2"]
end
write_content = Iconv.conv("utf-16le", "utf-8", "\xEF\xBB\xBF")
write_content += Iconv.conv("utf-16le", "utf-8", csv_content)
File.open("listing.csv", 'wb') {|f| f.write(write_content) }
1 голос
/ 07 марта 2009

У меня была точно такая же проблема с отправкой данных UTF8 в Excel. Мое решение:

Текущая версия кода Perl Spreadsheet :: WriteExcel правильно записывает файлы Excel с использованием данных UTF8.

Итак, я написал плагин Rails, который а) открывает двусторонний канал для программы Perl б) отправляет данные по одной строке в perl-программу. Я использую Yaml в качестве формата данных сообщения. (Стандартный Ruby yaml не является UTF8, есть специальная версия, ya2yaml) в) Perl программа создает файл Excel d) Когда программа Rails указывает (через сообщение yaml), что последняя строка была отправлена, программа perl создает файл excel и отправляет статус обратно программе rails.

Конечно, добавление Perl-программы в проект Rails с помощью параллельного процесса и конвейера в значительной степени относится к спектру "Engineering", а не "Computer Science". (Он выполняет свою работу, но не элегантно.) Но он работает хорошо и сэкономил мне недели, которые потребовались бы для переноса кода WriteExcel на Ruby. Также обратите внимание, что в настоящее время доступный Ruby-порт WriteExcel не обрабатывает utf8.

Мой sw - разрешительный открытый исходный код, но я еще не успел выпустить его. Если вы хотите его в его текущем состоянии, см. http://sandbox.kluger.com/write_excel_v.5.tar

Обратите внимание, что вы захотите создавать свои файлы Excel в фоновом режиме, а не в процессе контроллера Rails, поскольку это заблокирует другие клиенты браузера, когда вы не сможете создать файл Excel. Я использую плагин DelayedJob, работает хорошо.

Надеюсь, это поможет,

Larry

1 голос
/ 16 января 2009

Если вы создадите XML с кодировкой utf и сохраните его как .xls, он откроет даже эти двухбайтовые символы:

xml version = "1.0" encoding = "utf-8"

0 голосов
/ 05 марта 2010

Excel не обрабатывает UTF-8 должным образом. Вместо этого вы должны использовать кодовую страницу, которая удовлетворяет вашим потребностям

Response.ContentType = "text/plain";
// codepage: 28591, codepage name:iso-8859-1, codepage display name: Western European (ISO)
Response.ContentEncoding = System.Text.Encoding.GetEncoding(28591);
0 голосов
/ 26 мая 2009

Попробуйте OpenOffice Calc - он намного удобнее для Unicode - как импорт, так и экспорт файлов CSV с кодировкой UTF-8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...