2013/9/20

Ruby/Raisl: CSV, Excel 下載問題

最近的CSV/Excel問題大整理及整個解法歷程:

Q1: 下載下來的CSV檔案(UTF-8格式),在Windows下,使用Excel直接打開都是亂碼?

Windows解決祕技:
  1. 先用"筆記本"打開CSV檔案,可以看到中文是正常,選擇另存新檔,編碼選擇ANSI後存檔
  2. 再使用Excel打開重新編碼後的CSV檔案,中文就可以正常顯示


問題發生的原因:

為什麼"筆記本"可以正常打開顯示中文,Excel卻沒有辦法,
研究後發現Excel只接受有BOM表頭的UTF-8檔案,否則中文無法正常顯示,
這點只能怪微軟作手腳,也無可奈何。

所以除非把CSV(UTF-8)檔案加上BOM表頭,否則Excel無法正常打開。

Windows下的vbscript的解法:
  • 為了下載的CSV (UTF-8)檔案,沒有辦法打開,於是寫了一個vbscript (csv_addbom_v3.vbs),可以用滑鼠把下載的CSV檔案,丟到這個csv_addbom_v3.vbs,就可以自動轉檔成有BOM表頭的CSV檔案

從源頭下載的程式著手:
Ruby/Rails

Solution1:
直接在程式中,先塞入BOM表頭
最後產生有BOM表頭, UTF-8編碼的CSV檔案

  # excel csv fromat (BOM + UTF8)
  def export_csv_excel
    ....

    # Add BOM to make excel using utf8 to open csv file
    head = 'EF BB BF'.split(' ').map{|a|a.hex.chr}.join()

    csv_str = CSV.generate(csv = head) do |csv|
      csv << [ , , , ...]
      @invoices.each do |invoice|
        csv << [ , , , ...]
      end
    end

    send_data csv_str, filename: "Invoices-#{Time.now.strftime("%y%m%d%H%M%S")}.csv", type: "text/csv"
end 


Solution2:
使用xml格式, 存成附檔名.xls

reference to
http://railscasts.com/episodes/362-exporting-csv-and-excel


Q2. 下載的CSV檔案,使用Excel打開後,電話欄位的0開頭,總是會被去掉?

把電話資料改成

="0988-888-888"

從源頭下載的程式著手:
Ruby/Rails

"=\"#{invoice.attendee.try(:mobile)}\""


技術提供:Blogger.