ExcelにUTF-8 CSVファイルを自動的に認識させることは可能ですか?


453

一部のデータをCSVファイルにエクスポートするアプリケーションの一部を開発しています。アプリケーションは、すべてのレベルで多言語性を備えているため、常にUTF-8を使用します。しかし、そのようなCSVファイル(発音区別符号、キリル文字、ギリシャ文字を含む)をExcelで開くと、次のような期待される結果が得られませんГ„/Г¤, Г–/Г¶。また、開いているCSVファイルがUTF-8でエンコードされていることをExcelに強制的に理解させる方法がわかりません。またEF BB BF、UTF-8 BOMを指定してみましたが、Excelでは無視されます。

回避策はありますか?

PSどのツールがExcelのように動作する可能性がありますか?


更新

私はコミュニティを質問の定式化と混同したと言わざるを得ません。この質問をしているときに、ExcelでUTF-8のCSVファイルを問題なく、流暢で透過的な方法で開く方法を求めました。しかし、私はそれを自動的に行うことを求める間違った処方を使用しました。これは非常に混乱し、VBAマクロオートメーションと競合します。私が最も感謝しているこの質問には2つの回答があります。Alexによる最初の回答https://stackoverflow.com/a/6002338/166589と、この回答を受け入れました。そしてマークによるhttps://stackoverflow.com/a/6488070/166589少し遅れて登場しました。使いやすさの観点から、ExcelはユーザーフレンドリーなUTF-8 CSVサポートが不足しているように見えたので、両方の答えが正しいと考え、Excelは実際には実行できなかったと述べたので、最初にAlexの答えを受け入れました。透過的に。ここで私は自動的に混乱しました。マークの答えは、より高度なユーザーが期待される結果を達成するためのより複雑な方法を促進します。どちらの回答も素晴らしいですが、Alexの回答は、明確に指定されていない質問に少しよく適合します。


アップデート2

最後の編集から5か月後、何らかの理由でアレックスの回答が消えていることに気づきました。私はそれが技術的な問題ではなかったことを本当に望んでおり、どの回答がより優れているかについてこれ以上議論がないことを願っています。だから私はマークの答えを最高のものとして受け入れています。


1
タブ区切りファイルを使用できますか?もしそうなら、あなたはもっと運があるかもしれません。
Tim Perry、

8
Office 2010+:最適に機能します:BOMと\t区切り文字を含むUTF-16LE 。英語および英語以外のExcel設定で機能します。Ctrl-Sファイル形式などを選択せず​​に押すことができます。Unicode文字は保持されます。
セバスチャン

@Duncan率直に言って、私は混乱しており、「判断する」のは難しいです。私は2年以上前にアレックスの回答を受け入れました(5月14日にQとAの両方)。そしてマークは、驚くほど得点の高いトリッキーな回避策(実際にはチェックしませんでした)を提案して答え、驚くほど私の質問でより多くのポイントを獲得しました人気も。私たちは実際にずっと前に私のプロジェクトでExcelのサポートを拒否しました。Excelが表示され、おそらく(間違っていれば修正してください)、CSVを誤って処理するように思われるため、アレックスの評判スコアを奪いたくありません。申し訳ありません。
Lyubomyr Shaydariv 2013

2
Alexの回答がモデレーターによって削除されました。説明はありませんでしたが、十分な評判があれば、それを見ることができます。
Mark Ransom

1
タイムマシンはまだ存在しないので、意見が分かれるだけです。
osexpert

回答:


398

Alexは正しいですが、csvにエクスポートする必要があるので、csvファイルを開くときにユーザーに次のアドバイスを与えることができます。

  1. エクスポートしたファイルをcsvとして保存します
  2. Excelを開く
  3. データ->外部データのインポート->データのインポートを使用してデータをインポートします
  4. 「csv」のファイルタイプを選択し、ファイルを参照します
  5. インポートウィザードで、File_Originを「65001 UTF」に変更します(または正しい言語の文字識別子を選択します)。
  6. 区切り文字をカンマに変更します
  7. インポート先と終了を選択します

これにより、特殊文字が正しく表示されます。


163

UTF-8のバイト順マーカーは、UTF-8を使用しているという事実をExcel 2007+の手掛かりにします。(このSO投稿を参照してください)。

誰かが私と同じ問題を抱えている場合、.NETのUTF8エンコーディングクラスは、GetBytes()呼び出しでバイト順マーカーを出力しません。BOMを出力するにはストリーム使用する(または回避策を使用する)必要があります。


18
UTF-8 BOMを挿入する方法のようです。その後は透明です。
vy32 14年

12
私は簡単から.CSVを変換するために、メモ帳++を使用UTF-8するUTF-8 with BOM
セバスチャン・

3
はい-最善の解決策。http応答にヘッダーを設定することに関して、混乱を招く投稿がたくさんあります。これは問題を解決します。同じことは、ファイルをメモ帳で開いて、UTF-8オプションを使用して右下に保存した場合にも見られます。バイト順マーカーも追加します。
user369142

1
@エルメ:私はおそらく(私と同じように)バイトオーダーマーカーで保存していると思ったのですが、一部のライブラリが思ったように動作しなかったためではありませんでした。私はこの回答を追加する価値があると思いました、そして明らかに他の多くの人々もそれが有用であると感じました。とにかく、CSVを使用しないと言ったり、ユーザーに奇妙な方法でファイルを開く方法を指示したりするよりも、良い答えのように思えます。
StriplingWarrior 2016年

1
Mac版のExcelはBOMをまだ無視しているようです。(Excel for Mac2011。)
Thomas Andrews

74

無視されたBOMのバグはExcel 2013で修正されたようです。キリル文字で同じ問題が発生しましたが、BOM文字を追加すると問題が解決しました\uFEFF


8
CSVファイル(Javaで生成)の先頭に\ uFEFFを追加したので、Excelで正しく開くことができます。Thx
Galdo

16
これで私の問題も解決しました。phpでは次のようになり $utf8_with_bom = chr(239) . chr(187) . chr(191) . $csvTextます。
Abdullah

@updolaこのコメントに感謝し、時間を節約してくれました
nathan hayfield

UTF-8は、定義により、BOM文字を使用せず、使用すべきでもありません。ExcelがBOMを読み取る方法は、ASCIIとの下位互換性があるUnicodeよりもUTF-8の利点を台無しにしています。BOMを追加するとExcelは機能しますが、他の適切なUTF-8 / ASCIIファイルの読み取りは中断されます。
ネルソン

1
\ FE \ FFは、Mac OS Excel 2016を日本語の象形文字としてファイル全体にします。
ナキロン2017年

55

非常に多くの答えがあることは信じられないことですが、質問に答えるものはありません:

「この質問をしているときに、ユーザーに問題なくExcelでUTF-8 CSVファイルを開く方法を尋ねました...」

200以上の賛成投票で承認済みの回答としてマークされた回答は、Excelの構成方法をユーザーに手動で提供したくないので、私にとって役に立たないものです。それとは別に:このマニュアルは1つのExcelバージョンに適用されますが、他のExcelバージョンには異なるメニューと構成ダイアログがあります。Excelのバージョンごとにマニュアルが必要になります。

だから問題は、Excelに単純なダブルクリックでUTF8データを表示させる方法ですか?

少なくともExcel 2007では、CSVファイルを使用する場合、UTF8 BOMが無視され、ゴミしか表示されないため、これは不可能です。これはすでにLyubomyr Shaydarivの質問の一部です:

「UTF-8 BOM EF BB BFも指定しようとしましたが、Excelでは無視されます。」

私も同じ体験をします。ロシア語またはギリシャ語のデータをBOMを含むUTF8 CSVファイルに書き込むと、Excelでゴミが発生します。

UTF8 CSVファイルの内容:

Colum1;Column2
Val1;Val2
Авиабилет;Tλληνικ

Excel 2007での結果:

CSV UTF8 Excel

解決策は、CSVをまったく使用しないことです。この形式はMicrosoftによって愚かに実装されているため、コンマまたはセミコロンを区切り文字として使用する場合は、コントロールパネルの地域設定に依存します。そのため、同じCSVファイルが1台のコンピューターでは正しく開くことができますが、別のコンピューターでは開かないことがあります。「CSV」は「カンマ区切り値」を意味しますが、たとえばドイツ語版Windowsではデフォルトでセミコロンを区切り文字として使用する必要がありますが、カンマは機能しません。(ここでは、SSV =セミコロンで区切られた値という名前にする必要があります)CSVファイルは、Windowsの異なる言語バージョン間で交換できません。これは、UTF-8の問題に対する追加の問題です。

Excelは数十年前から存在しています。マイクロソフトがここ何年もの間、CSVインポートなどの基本的なことを実装できなかったのは残念です。


ただし、同じ値をHTMLファイルに入れ、そのファイルをファイル拡張子XLSの BOMを含むUTF8ファイルとして保存すると、正しい結果が得られます。

UTF8 XLSファイルの内容:

<table>
<tr><td>Colum1</td><td>Column2</td></tr>
<tr><td>Val1</td><td>Val2</td></tr>
<tr><td>Авиабилет</td><td>Tλληνικ</td></tr>
</table>

Excel 2007での結果:

UTF8 HTML Excel

Excelで正しく表示されるHTMLの色を使用することもできます。

<style>
.Head { background-color:gray; color:white; }
.Red  { color:red; }
</style>
<table border=1>
<tr><td class=Head>Colum1</td><td class=Head>Column2</td></tr>
<tr><td>Val1</td><td>Val2</td></tr>
<tr><td class=Red>Авиабилет</td><td class=Red>Tλληνικ</td></tr>
</table>

Excel 2007での結果:

UTF8 HTML Excel

この場合、テーブル自体に黒い境界線と線があります。すべてのセルにグリッド線を表示する場合は、HTMLでも可能です。

<html xmlns:x="urn:schemas-microsoft-com:office:excel">
    <head>
        <meta http-equiv="content-type" content="text/plain; charset=UTF-8"/>
        <xml>
            <x:ExcelWorkbook>
                <x:ExcelWorksheets>
                    <x:ExcelWorksheet>
                        <x:Name>MySuperSheet</x:Name>
                        <x:WorksheetOptions>
                            <x:DisplayGridlines/>
                        </x:WorksheetOptions>
                    </x:ExcelWorksheet>
                </x:ExcelWorksheets>
            </x:ExcelWorkbook>
        </xml>
    </head>
    <body>
        <table>
            <tr><td>Colum1</td><td>Column2</td></tr>
            <tr><td>Val1</td><td>Val2</td></tr>
            <tr><td>Авиабилет</td><td>Tλληνικ</td></tr>
        </table>
    </body>
</html>

このコードでは、ワークシートの名前を指定することもできます(ここでは「MySuperSheet」)。

Excel 2007での結果:

ここに画像の説明を入力してください


1
そして、人々がまだそれに答えていることも信じられないほどです。:)ただし、CSVは機能していないと私は主張します。CSVは非常に単純なプレーンストリーミング形式であり、そのプロジェクトに携わっていたとき、コンポーネントの相互作用にも使用していました。HTML形式はその代表的な性質から決して使用しません。そのプロジェクトのユーザーにデータをHTMLにエクスポートさせて、Excelで使いやすくすることはできませんでした。ExcelはUTF-8 CSVに夢中になり、それから5年後に何が変更されたかはわかりません。しかし、そのコンマ、セミコロン、およびタブ区切りのファイルは真の狂気だと思います。
Lyubomyr Shaydariv 2016年

5
グーグルが彼らをここに持ってくるので人々があなたの質問に答えることは信じられないほどではありません:同じ質問ですべて:どうすれば愚かなExcelに私がやりたいことをさせることができますか?「excel csv utf8」という3つの単語をGoogleに入力してください。あなたの質問は、世界で最初の結果です。あなたはベストセラーを書きました!
Elmue 2016年

8
ここで他のどの回答もExcelがCSVファイルを正しく開けない原因を時間をかけて指摘したので、この回答もそれを行わないことは言及する価値があります。最初に受け入れられた回答(モデレーターによって削除された)は、データを直接Excelファイルにエクスポートするか、HTMLファイルをエクスポートしてユーザーがExcelでファイルを開くことを許可することを推奨しました。これらのソリューションはどちらも、XLSファイル拡張子の付いたHTMLファイルを保存するよりもハッキングが少ないですが、実際に質問に答える答えは提案されていません。
StriplingWarrior

3
@Warrior:「しかし、実際に質問に答える答えは提案されていません。」これは正しくありません。私はその質問に答えました:少なくともExcel 2007ではそれは不可能です。これは明確な答えです。ExcelがUTF8 BOMを無視してデータをANSIとして解釈する場合、たとえばギリシャ語またはロシア語のテキストをファイルをダブルクリックするだけでCSVを介してExcelにインポートする方法はありません(これは「ユーザーには何の問題もなく」という質問でした) )。私が提案するのは、ダブルクリックですべてのExcelバージョンで機能し、Excelのメニューで追加の手順を必要としない実用的なソリューションです。
Elmue 16

2
これは質問に答えないだけでなく、CSVが「レガシー」および「デッド」であることを表明することは完全に間違っています。使い方がわからないからといって、それが死んでいるわけではありません。また、あなたは明らかにそれがその歴史や今日どのように広く使われているかを理解していません。これはXMLよりも優れており(パケットサイズが小さいため)、ここでの問題は、Microsoftが単にUTF8形式の標準に従っていないことにあります。正解は、Microsoftはもともとエンコーディングに長けていなかったため、Microsoftではなくオープンオフィスを使用することです。
ジェレミー

49

この回避策を使用しました。

  1. CSVをUTF-16 LEに変換
  2. ファイルの先頭にBOMを挿入する
  3. タブをフィールドセパレータとして使用

1
ありがとう!私はこのスレッドで他のすべての答えを試しましたが、UTF-8への変換は単に機能しませんでした。BOMでUTF-16を試したところ、すぐに動作しました。
ハスキー2013年

Excel for Mac 2011の場合、UTF-16リトルエンディアンのcsvファイルで成功しました
マルチダイナミック

おかげで、このソリューションは、ユーザーがExcelで開くことができるUnicode csvをユーザーに提供するのに最適です。
user1073075

21

PHPで生成されたCSVファイルで同じ問題がありました。"sep=,\n"コンテンツの先頭で(ただし、もちろんBOMの後に)区切り記号が定義されている場合、ExcelはBOMを無視しました。

したがって"\xEF\xBB\xBF"、コンテンツの先頭にBOM()を追加し、セミコロンをセパレーターとして設定することでfputcsv($fh, $data_array, ";");うまくいきます。


13

私は過去に同じ問題を抱えていました(Excelが読み取ることができるファイルを作成する方法、および他のツールも読み取ることができる方法)。CSVではなくTSVを使用していましたが、エンコードに関する同じ問題が発生しました。

ExcelにUTF-8を自動的に認識させる方法を見つけることができませんでした。また、ファイルのコンシューマーにファイルを開く方法の複雑な指示を与える意思はありませんでした。そのため、UTF-8ではなくUTF-16le(BOM付き)としてエンコードしました。サイズは2倍ですが、Excelはエンコードを認識できます。また、圧縮率も高いため、サイズが重要になることはめったにありません(悲しいことではありません)。


それは古い質問ですが、人々がまだそれに答えてくれてうれしいです。ありがとうございました。:)
Lyubomyr Shaydariv 2013

1
@LyubomyrShaydariv:この質問に回答したので、最初のBOMがあれば、最新のExcelではUTF-8 CSVファイルを識別できると同僚から言われました。したがって、数年後には、世界中のすべての人(またはとにかく、ファイルを配信するすべての人)がそのバージョンのExcel以降を使用している場合、エンコーディングを変更できる可能性があります:-)
Steve Jessop

奇妙なことに、私にとっては機能しません。文字を中国語の記号に変換します...(
ヘブライ語と見なさ

「UTF-16 BE with BOM」で保存すると、Excelに漢字が表示されました。「UTF-16 LE with BOM」を試してみたところ、うまくいきました!テストにはSublime Textを使用しました。
Henno

12

古い質問ですが、最も簡単な解決策は次のとおりです。

  1. メモ帳でCSVを開く
  2. 名前を付けて保存->適切なエンコーディングを選択
  3. 新しいファイルを開く

1
どのExcelバージョンを使用していますか?
Lyubomyr Shaydariv 2014

1
華麗で、単純に機能し、問題を解決します(少なくとも私にとって)
Auberon Vacher 2014

1
いいえ、問題はExcelで.csvファイルをcsvファイルとして開くことです。つまり、csvファイルを生成するプロセスがあります。その場合、ユーザーはファイルを開くだけで済みます。ここで彼/彼女はそれ以上のことをする必要があります。
Veverke

2
@Veverke定期的にファイルを生成する場合、これは最善の解決策ではありません。しかし、それが1回限りの場合、この答えは完璧です。これは、メモ帳がBOMをUTF-8またはUTF-16ファイルの先頭に置くため機能します。
Mark Ransom

魅力のように機能します。((:
user2925795

10

私がhttp://thinkinginsoftware.blogspot.com/2017/12/correctly-generate-csv-that-excel-can.htmlに投稿したように:

CSVの生成を担当するソフトウェア開発者に修正を依頼してください。簡単な回避策として、gsedを使用して文字列の先頭にUTF-8 BOMを挿入できます。

gsed -i '1s/^\(\xef\xbb\xbf\)\?/\xef\xbb\xbf/' file.csv

このコマンドは、存在しない場合、UTF-4 BOMを挿入します。したがって、それはべき等コマンドです。これで、ファイルをダブルクリックしてExcelで開くことができるはずです。


これを修正してくれてありがとう。私はcsv ';'を変換しました Notepad ++でUTF-BOMに分離され、Excelがそれを正しく開くことがわかっている。
RandomGuy 2018

まさに必要なもの!ここではPHPでこれを実装する方法へのポインタですstackoverflow.com/questions/25686191/...
EFC

これは、csvファイルのutf文字を認識できなかったExcelの回避策です。したがって、この修正によりExcelの問題が修正されます。
cobp

これは、Excel 2007ギリシャ語バージョンで機能し、コンマセパレーターがありました。ありがとうございました。
NameOfTheRose

fs.createWriteStream(fileName、{encoding: 'UTF-16le'})のエンコーディングを「UTF-16le」に変更し、ExcelがCSVファイルを正しく開いた
rahul shukla

9

Notepad ++を介してBOMで.csvファイルをUTF-8に変換できます。

  1. Notepad ++でファイルを開きます
  2. メニューに移動EncodingConvert to UTF-8
  3. メニューに移動FileSave
  4. Notepad ++を閉じます。
  5. Excelでファイルを開きます。

Microsoft Excel 2013(15.0.5093.1000)MSO(15.0.5101.1000)64ビットWindows 8.1上のMicrosoft Office Professional Plus 2013から64ビットで動作し、非Unicodeプログラムのロケールは「ドイツ語(ドイツ)」に設定されています。


1
あなたの言ったことは、まったく機能しませんでした。変換/エンコード、文字セットの設定、私の場合は何も機能しませんでした。Googleシートにファイルをインポートし、csvとしてダウンロードすると、問題なく動作しました。2045
pakalbekim

1
私はエンコードでそれを変換しなければならなかった- > Cinvert TI UTF-8 BOM Excelバージョン2016
イゴールVuković

4

utf-8テキストおよびcsvファイルを開くための単純なvbaマクロ

Sub OpenTextFile()

   filetoopen = Application.GetOpenFilename("Text Files (*.txt;*.csv), *.txt;*.csv")
   If filetoopen = Null Or filetoopen = Empty Then Exit Sub

   Workbooks.OpenText Filename:=filetoopen, _
   Origin:=65001, DataType:=xlDelimited, Comma:=True

End Sub

Origin:= 65001はUTF-8です。カンマで配布された.csvファイルのカンマ:True

常に利用できるように、Personal.xlsbに保存します。マクロ呼び出しボタンを追加してExcelツールバーをパーソナライズし、そこからファイルを開きます。列のautofitや配置など、より多くのフォーマットをマクロに追加できます。


2
ありがとう。残念ながら、これは本当に上級のExcelユーザーへの提案であり、私がこの質問をすることを目指しているのは、Excelに自動的に実行させることです。
Lyubomyr Shaydariv 2012年

このコードスニペットを使用しようとしましたが、機能しません。私は、Excel 2013を使用
Sharunas Bielskis

3

私のようにこのスレッドを実現するExcelでファイルを開くことに興味があるユーザーを助けるためだけに。

以下のウィザードを使用しましたが、UTF-8ファイルをインポートすることで問題なく動作しました。透過的ではありませんが、すでにファイルがある場合に役立ちます。

  1. Microsoft Excel 2007を開きます。
  2. [データ]メニューバーオプションをクリックします。
  3. From Textアイコンをクリックします。
  4. インポートするファイルの場所に移動します。ファイル名をクリックし、[インポート]ボタンをクリックします。[テキストインポートウィザード-ステップ1または3]ウィンドウが画面に表示されます。
  5. データを最もよく表すファイルタイプを選択します-区切りまたは固定幅。
  6. File originの隣に表示されるドロップダウンリストから65001:Unicode(UTF-8)を選択します。
  7. [次へ]ボタンをクリックして、[テキストインポートウィザード-ステップ2または3]ウィンドウを表示します。
  8. Microsoft Excel 2007にインポートするファイルで使用された区切り記号の横にチェックマークを付けます。データプレビューウィンドウに、選択した区切り記号に基づいてデータがどのように表示されるかが表示されます。
  9. [次へ]ボタンをクリックして、テキストインポートウィザード-ステップ3/3を表示します。
  10. インポートするデータの各列に適切なデータ形式を選択します。必要に応じて、1つ以上のデータ列をインポートしないオプションもあります。
  11. [完了]ボタンをクリックして、Microsoft Excel 2007へのデータのインポートを完了します。

ソース:https : //www.itg.ias.edu/content/how-import-csv-file-uses-utf-8-character-encoding-0


3

はい、可能です。以前に複数のユーザーが指摘したように、ファイルがUTF-8でエンコードされている場合、Excelが正しいバイトオーダーマークを読み取るときに問題が発生するようです。UTF-16では問題がないようで、UTF-8に固有です。これに使用するソリューションは、BOM、TWICEを追加することです。このため、次のsedコマンドを2回実行します。

sed -I '1s/^/\xef\xbb\xbf/' *.csv

ワイルドカードは任意のファイル名に置き換えることができます。ただし、これにより、.csvファイルの先頭でsep =が変更されます。その後、.csvファイルはExcelで通常どおり開きますが、最初のセルに「sep =」を含む追加の行があります。"sep ="は、ソース.csv自体でも削除できますが、VBAでファイルを開くときは、区切り文字を指定する必要があります。

Workbooks.Open(name, Format:=6, Delimiter:=";", Local:=True)

形式6は.csv形式です。ファイルに日付がある場合は、Localをtrueに設定します。Localがtrueに設定されていない場合、日付はアメリカ化され、場合によっては.csv形式が破損します。


1
sedコマンドを実行すると、「sed:invalid option
'I

2

これは私の実用的な解決策です:

vbFILEOPEN = "your_utf8_file.csv"
Workbooks.OpenText Filename:=vbFILEOPEN, DataType:=xlDelimited, Semicolon:=True, Local:=True, Origin:=65001

キーはOrigin:= 65001です


2

はい、可能です。csvを作成するストリームを書き込む場合、最初に行うことは次のとおりです。

myStream.Write(Encoding.UTF8.GetPreamble(), 0, Encoding.UTF8.GetPreamble().Length)

あなたは質問を読みませんでした!Lyubomyr Shaydariv氏は、「UTF-8 BOM EF BB BFも指定しようとしましたが、Excelでは無視されます。」
Elmue 2016年

これは実際のコードです。このリードで.NetアプリケーションからUTF-8ファイルを書き出すと、ExcelはそのファイルをUTF8として認識します。
zax 2016年

それはあなたのエクセルにあるかもしれません。しかし、少なくともExcel 2007では、BOMは完全に無視されます。したがって、すべてのExcelバージョンで機能するコードを作成する場合、そのコードは役に立ちません。
Elmue、2016

2

本当に素晴らしい答えのリストですが、かなり良いものが1つも不足しているため、ここで触れます。Googleシートで csvファイルを開き、Excelファイルとしてローカルコンピューターに保存します。

Microsoftとは対照的に、GoogleはUTF-8のcsvファイルをサポートできるようにしており、そこでファイルを開くだけで動作します。また、Excel形式へのエクスポートも機能します。したがって、これはすべてにとって望ましい解決策ではないかもしれませんが、かなりフェールセーフであり、クリック数は、特にGoogleにすでにログインしている場合は、思ったほど高くありません。


2

これは質問に正確に対処していませんが、これに偶然遭遇し、上記の解決策がうまくいかなかったか、要件を満たせなかったため、vimにアクセスできるときにBOMを追加する別の方法を次に示します。

vim -e -s +"set bomb|set encoding=utf-8|wq" filename.csv

2

こんにちは、CSV生成にRuby on Railsを使用しています。私たちのアプリケーションでは、多言語(I18n)を使用する予定で、Windows ExcelのCSVファイルでI18nコンテンツを表示しているときに問題が発生しました。

Linux(Ubuntu)とMacでは問題ありませんでした。

実際のデータを表示するには、Windowsのデータを再度インポートする必要があることがわかりました。インポート中に、文字セットを選択するためのオプションが増えます。

しかし、これはすべてのユーザーに対して教育することはできません。そのため、私たちが探している解決策は、ダブルクリックだけで開くことです。

その後、我々はaghuddlestonの助けを借りて、優れウィンドウにオープンモードとBOMによってデータを示す方法を特定し要旨。参照で追加されました。

I18nコンテンツの例

MacおよびLinuxの場合

スウェーデン語:Förnamn英語:名

Windowsの場合

スウェーデン語:FÃrnamn英語:名

def user_information_report(report_file_path, user_id)
    user = User.find(user_id)
    I18n.locale = user.current_lang
    open_mode = "w+:UTF-16LE:UTF-8"
    bom = "\xEF\xBB\xBF"
    body user, open_mode, bom
  end

def headers
    headers = [
        "ID", "SDN ID",
        I18n.t('sys_first_name'), I18n.t('sys_last_name'), I18n.t('sys_dob'),
        I18n.t('sys_gender'), I18n.t('sys_email'), I18n.t('sys_address'),
        I18n.t('sys_city'), I18n.t('sys_state'), I18n.t('sys_zip'),
        I18n.t('sys_phone_number')
    ]
  end

def body tenant, open_mode, bom
    File.open(report_file_path, open_mode) do |f|
      csv_file = CSV.generate(col_sep: "\t") do |csv|
        csv << headers
        tenant.patients.find_each(batch_size: 10) do |patient|
          csv <<  [
              patient.id, patient.patientid,
              patient.first_name, patient.last_name, "#{patient.dob}",
              "#{translate_gender(patient.gender)}", patient.email, "#{patient.address_1.to_s} #{patient.address_2.to_s}",
              "#{patient.city}", "#{patient.state}",  "#{patient.zip}",
              "#{patient.phone_number}"
          ]
        end
      end
      f.write bom
      f.write(csv_file)
    end
  end

ここで注意すべき重要な点は、オープンモードとbomです。

open_mode = "w +:UTF-16LE:UTF-8"

bom = "\ xEF \ xBB \ xBF"

CSVを書き込む前にBOMを挿入

f。書き込みbom

f.write(csv_file)

WindowsおよびMac

ファイルをダブルクリックして直接開くことができます。

Linux(ubuntu)

ファイルを開くときに、セパレータオプションを要求します->「TAB」を選択します ここに画像の説明を入力してください


1

数日前に同じ問題に直面しましたが、import from csvすべてを文字列としてスタイル設定するために機能を使用できないため、解決策を見つけることができませんでした。

私の解決策は、最初にnotpad ++とでファイルを開くことでしたchange the encode to ASCII。次に、Excelでファイルを開くだけで、期待どおりに動作しました。


1

PHPでは、$ bomを$ csv_stringの前に追加するだけです。

$bom = sprintf( "%c%c%c", 239, 187, 191); // EF BB BF
file_put_contents( $file_name, $bom . $csv_string );

MS Excel 2016、php 7.2.4でテスト済み


0

これは古い質問ですが、私が遭遇したばかりの同様の問題があり、解決策は他の人を助けるかもしれません:

CSVテキストデータをファイルに書き込み、結果の.csvをExcelで開くと同じ問題が発生し、すべてのテキストが1つの列にシフトされました。上記の回答を読んだ後、私は次のことを試しました、これは問題を整理しているようです。

StreamWriterを作成するときに、UTF-8のエンコーディングを適用します。それでおしまい。

例:

using (StreamWriter output = new StreamWriter(outputFileName, false, Encoding.UTF8, 2 << 22)) {
   /* ... do stuff .... */
   output.Close();
}

@elmue少し詳しく説明しますか?最初に正しいエンコーディングを使用してCSVを確実に出力すると、ワークフローの後半でExcelとの互換性の問題が発生しなくなりますか?
Rex

using()ステートメントがある場合、output.Close()は必要ないため、コードは間違っています。そのExcel CSVのインポートとは別に、非常に原始的です。まったく使用しません。Excelにインポートする場合は、代わりにHTMLテーブルを使用して、Excelで開きます。
Elmue

@Elmueを明確にしていただきありがとうございます。残念ながら、クローズだけでなく破棄明示的に必要とされるいくつかのシナリオ(ネットワークドライブ全体のファイルを含む)に遭遇しました。私が思うように私はへの呼び出しを見て覚えている理由が見つからないClose()中でDispose、スタックが、我々はそこに行くの。また、CSVインポートがプリミティブであるという記述は、提案した非効率的なHTMLアプローチを必要としないため、誤りです。プレーンテキストデータを取るために、追加のプログラムのステップを作成する実際には、HTMLに変換し、その後 Excelに引っ張っはカウンター直感的なようだ
レックス

続き...しかし、異なるシナリオには異なる要件があり、私の例は、OPが要求
Rex

元の質問をもう一度読んでください:「UTF-8 BOM EF BB BFも指定しようとしましたが、Excelでは無視されます。」同じことをテストして同じ結果が得られました。ExcelはUTf8 BOMを認識しません。それを試してみてください!CSVファイルを作成し、ギリシャ語またはロシア語の文字を挿入します。次に、それをExcelで開くと、ゴミ箱が表示されます。だからあなたの答えは何も解決しません。
Elmue 2016年

0

完全に自動、ワンクリック、またはWebページなどからExcelに自動的にロードしたいが、適切なExcelファイルを生成できない場合は、代わりにSYLK形式を検討することをお勧めします。わかりました。CSVほど単純ではありませんが、テキストベースで実装が非常に簡単で、問題なくUTF-8をサポートしています。

データを受け取り、ファイルをクリックするだけでExcelで直接開くSYLKファイルを出力するPHPクラスを作成しました(または、正しいMIMEタイプでWebページにファイルを書き込むと、Excelを自動起動します。書式設定(太字、特定の方法で数値を書式設定するなど)を追加し、列のサイズを変更するか、列のテキストに列の自動サイズを設定します。すべてのコードのすべてがおそらく約100行以下です。

シンプルなスプレッドシートを作成してSYLKとして保存し、それをテキストエディターで読み取ることで、SYLKをリバースエンジニアリングするのは非常に簡単です。最初のブロックは、ヘッダーと認識できる標準の数値形式(作成するすべてのファイルで逆流するだけ)であり、データは単にX / Y座標と値です。


0
  1. LibreOffice Calcのダウンロードとインストール
  2. LibreOffice Calcで任意のcsvファイルを開きます
  3. テキストのインポートウィザードが表示されることを感謝します...
  4. ...区切り文字と文字エンコードオプションを選択します
  5. Calcで結果のデータを選択し、Excelにコピーして貼り付けます

0

単純なC#アプリケーションからcsvファイルを生成していますが、同じ問題が発生しました。私の解決策は、ファイルが次のようにUTF8エンコーディングで書かれていることを確認することでした:

// Use UTF8 encoding so that Excel is ok with accents and such.
using (StreamWriter writer = new StreamWriter(path, false, Encoding.UTF8))
{
    SaveCSV(writer);
}

私はもともと次のコードを持っていましたが、これはアクセントがNotepad ++ではうまく見えますが、Excelでは壊れていました。

using (StreamWriter writer = new StreamWriter(path))
{
    SaveCSV(writer);
}

マイレージは異なる場合があります-私はOffice 365の.NET 4とExcelを使用しています。


0

Office 365の実用的なソリューション

  • 保存UTF-16(LE、BEなし)
  • セパレータを使用 \t

PHPのコード

$header = ['číslo', 'vytvořeno', 'ěščřžýáíé'];
$fileName = 'excel365.csv';
$fp = fopen($fileName, 'w');
fputcsv($fp, $header, "\t");
fclose($fp);

$handle = fopen($fileName, "r");
$contents = fread($handle, filesize($fileName));
$contents = iconv('UTF-8', 'UTF-16', $contents);
fclose($handle);

$handle = fopen($fileName, "w");
fwrite($handle, $contents);
fclose($handle);

-1

まず、ExcelスプレッドシートをUnicodeテキストとして保存します。Internet Explorerを使用してTXTファイルを開き、[名前を付けて保存] TXTエンコーディングをクリックします-適切なエンコーディングを選択します(Win Cyrillic 1251など)。


-1

私はこのスレッドで見つけることができるすべてのものと同様のものを試しましたが、完全には機能しませんでした。ただし、グーグルシートにインポートしてcsvとしてダウンロードするだけでも魅力的でした。あなたが私の欲求不満のポイントに来たらそれを試してみてください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.