Подтвердить что ты не робот

Какой лучший способ экспортировать данные UTF8 в Excel?

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

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

  • предоставление файла TSV UTF-16 Little Endian, который 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, и я решил, что я поделился бы этим здесь для любых других рубинов:

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
4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

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

  • Используйте таблицы, а не запятые.
  • Поля не должны содержать символы новой строки.
  • Используйте UTF-16 Little Endian для отправки файла пользователю. Включите Маленькая спецификация Endian.

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

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

Ответ 4

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

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

Ответ 5

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

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

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

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

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

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

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

Larry

Ответ 6

Я упал на это сообщение, ища ответ 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) }

Ответ 7

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);

Ответ 8

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