私はいくつかのデータをCSVファイルにエクスポートする役割を担うアプリケーションの一部を開発しています。アプリケーションはすべてのレベルでその多言語の性質のために常にUTF-8を使用します。しかし、そのようなCSVファイル(発音区別符号、キリル文字、ギリシャ文字など)をExcelで開くと、Г„/Г¤, Г–/Г¶
のような何かを示す期待される結果が得られません。そして私は、開いているCSVファイルがUTF-8でエンコードされていることをExcelに理解させる方法を知りません。私はまたUTF-8 BOM EF BB BF
を指定しようとしました、しかしExcelはそれを無視します。
回避策はありますか?
P.SどのツールがExcelのように動作する可能性がありますか?
更新
私はコミュニティを質問の定式化と混同したと言わざるを得ない。私がこの質問をしているとき、私は流暢で透明な方法で、ユーザーにとって何の問題もなくExcelでUTF-8 CSVファイルを開く方法を求めました。しかし、間違った式を使って 自動的に としています。それは非常に紛らわしいです、そしてそれはVBAマクロオートメーションと衝突します。私が最も感謝しているこの質問に対する2つの答えがあります:Alexによる非常に最初の答え https://stackoverflow.com/a/6002338/166589 そして、私はこの答えを受け入れました。そしてMarkによる2番目のものは https://stackoverflow.com/a/6488070/166589 それは少し後で現れました。使いやすさの観点からは、ExcelにはユーザーフレンドリーなUTF-8 CSVサポートが不足しているように思われたので、 both の回答は正しいと考えています。 Excelはそれを透過的に行うことができませんでした。それがここで 自動的に と混同したものです。 Markの答えは、より高度なユーザーが期待される結果を達成するためのより複雑な方法を促進します。両方の答えは素晴らしいです、しかし、アレックスのものは私よりはっきり特定されていない質問に少しよく合います。
アップデート2
最後の編集から5か月後、Alexの答えがなんらかの理由で消えたことに気付きました。私はそれが技術的な問題ではなかったことを本当に願っていますし、どの答えが今よりも大きいかについてのこれ以上の議論がないことを私は願っています。それで、私はマークの答えを最良のものとして受け入れています。
Alexは正しいですが、csvにエクスポートする必要があるので、csvファイルを開くときにユーザーにこのアドバイスを与えることができます。
これにより、特殊文字は正しく表示されます。
UTF-8 Byte-orderマーカーは、あなたがUTF-8を使用しているという事実にExcel 2007+の手がかりになります。 ( this SO post を参照)。
誰かが私と同じ問題を抱えている場合、.NETのUTF8エンコーディングクラスはGetBytes()
呼び出しでバイトオーダーマーカーを出力しません。部品表を出力するには、 ストリームの使用 (または 回避策 )を使用する必要があります。
無視されたBOMのバグはExcel 2013で修正されたようです。私はキリル文字でも同じ問題を抱えていましたが、BOM文字\uFEFF
を追加することは助けになりました。
非常に多くの答えがあるが信じられないほどです。
「私がこの質問をしていたとき、ユーザーに問題なくExcelでUTF-8 CSVファイルを開く方法を要求しました。」
ユーザーに手動でExcelを構成する方法を教えてもらいたくないので、200以上の賛成票で承認された回答としてマークされた回答は私には役に立ちません。それとは別に:このマニュアルは1つのExcelバージョンに適用されますが、他のExcelバージョンは異なるメニューと設定ダイアログを持っています。 Excelのバージョンごとにマニュアルが必要になります。
それでは、問題は、ダブルクリックでExcelにUTF-8データを表示させる方法です。
少なくともExcel 2007では、UTF8 BOMが無視されてゴミしか見えないため、CSVファイルを使用するとこれは不可能です。これはすでにLyubomyr Shaydarivの質問の一部です。
「私もUTF-8 BOM EF BB BFを指定しようとしましたが、Excelはそれを無視します。」
私も同じ経験をします。ロシア語またはギリシャ語のデータをBOM付きのUTF8 CSVファイルに書き込むと、Excelでゴミができます。
UTF8 CSVファイルの内容:
Colum1;Column2
Val1;Val2
Авиабилет;Tλληνικ
Excel 2007の結果:
解決策は、CSVをまったく使用しないことです。このフォーマットは、Microsoftによって非常に愚かに実装されているため、 コントロールパネル if comma または セミコロン の区切り文字として使用されます。したがって、同じCSVファイルを1つのコンピュータで正しく開くことができますが、別のコンピュータでは開くことはできません。 「CSV」は「 カンマ 区切り値」を意味しますが、たとえばドイツ語のWindowsでは、デフォルトでセミコロンを区切り文字として使用する必要がありますが、カンマは機能しません。 (ここではSSV = Semicolon Separated Valuesという名前にします)CSVファイルは、異なる言語バージョンのWindows間で交換することはできません。これはUTF-8の問題に対する追加の問題です。
Excelは何十年も前から存在しています。 Microsoftがこれらすべての年の間にCSVインポートのような基本的なものを実装することができなかったのは残念です。
ただし、同じ値をHTMLファイルに追加し、そのファイルをBOM付きのファイル拡張子 _ xls _ を持つ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の結果:
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の結果:
この場合、テーブル自体だけに黒い境界線と線があります。すべてのセルにグリッド線を表示したい場合は、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の結果:
この回避策を使用しました。
PHPで生成されたCSVファイルについても同じ問題がありました。 Excelは、コンテンツの先頭でセパレータが"sep=,\n"
で定義されている場合はBOMを無視しました(もちろんBOMの後)。
そのため、コンテンツの先頭にBOM("\xEF\xBB\xBF"
)を追加し、fputcsv($fh, $data_array, ";");
を介してセミコロンを区切り文字として設定するとうまくいきます。
古くからの質問ですが、最も簡単な解決策は次のとおりです。
私は過去に同じ問題を抱えていました(Excelが読むことができるファイルを作成する方法、そして他のツールも読むことができます)。 CSVではなくTSVを使用していましたが、エンコーディングに関しても同じ問題が発生しました。
私は、ExcelにUTF-8を自動的に認識させる方法を見つけることができず、ファイルを開く方法の複雑な指示をファイルの消費者に与えようとは思わなかった。そこで私はそれらをUTF-8ではなくUTF-16le(BOM付き)としてエンコードしました。サイズは2倍になりますが、Excelはエンコードを認識できます。そしてそれらはうまく圧縮されるので、サイズはめったに(しかし残念ながら決してないわけではない)重要ではありません。
私が 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で開くことができるはずです。
Notepad ++を介してBOMで.csvファイルをUTF-8に変換できます。
Encoding
→Convert to UTF-8
に行きます。File
→Save
に移動します。Windows 8.1上のMicrosoft Office Professional Plus 2013から64ビットのMicrosoft Excel 2013(15.0.5093.1000)MSO(15.0.5101.1000)で動作し、Unicode以外のプログラムのロケールは "German(Germany)"に設定されています。
これは古い質問ですが、一番上の検索で出てきます。私はcsvファイルの冒頭にBOM文字を追加することが役立つことを多くの努力の後に発見しました。
ここで説明しました: https://sites.google.com/site/ritechtips/home/the-multi-line-fields-csv-file-and-Excel-import---ha
私のようにこのスレッドを達成するExcelでファイルを開くことに興味を持っているユーザーの助けのためだけに。
私は以下のウィザードを使用しました、そしてそれは私のためにうまく働きました、UTF-8ファイルをインポートすること。透過的ではありませんが、ファイルがすでにある場合は便利です。
ソース: https://www.itg.ias.edu/content/how-import-csv-file-uses-utf-8-character-encoding-0 /
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
起源:= 65001はUTF-8です。コンマ:コロンで配布されている.csvファイルの場合はtrue
Personal.xlsbに保存して、いつでも利用できるようにします。マクロ呼び出しボタンを追加してそこからファイルを開くExcelツールバーをカスタマイズします。列の自動調整、配置などのように、マクロにさらにフォーマットを追加できます。
はい、これは可能です。以前に複数のユーザーが指摘したように、ファイルがUTF-8でエンコードされている場合、Excelが正しいByte Order Markを読み取るのに問題があるようです。 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形式が破損します。
これが私の実用的な解決策です。
vbFILEOPEN = "your_utf8_file.csv"
Workbooks.OpenText Filename:=vbFILEOPEN, DataType:=xlDelimited, Semicolon:=True, Local:=True, Origin:=65001
キーはOriginです:= 65001
本当に素晴らしい答えのリストですが、まだかなり良いものが1つ欠けているので、ここで言及します。 google sheets でcsvファイルを開き、Excelファイルとしてローカルコンピュータに保存します。
マイクロソフトとは対照的に、グーグルはUTF-8のcsvファイルをサポートすることに成功したので、それは単にそこでファイルを開くように動作します。そしてExcelフォーマットへのエクスポートもまたうまくいきます。それでこれがすべてのための好ましい解決策ではないかもしれないとしても、それはかなりフェイルセーフであり、クリック数はそれが聞こえるかもしれないほど多くない、特にあなたがとにかくすでにグーグルにログインしているとき。
はい、可能です。 csvを作成するストリームを書くとき、最初にすることはこれです:
myStream.Write(Encoding.UTF8.GetPreamble(), 0, Encoding.UTF8.GetPreamble().Length)
これは問題を正確に解決するものではありませんが、私はこれに遭遇し、上記の解決策がうまくいかなかったり要件を満たせなかったりしたので、vimにアクセスできるときにBOMを追加する別の方法があります。
vim -e -s +"set bomb|set encoding=utf-8|wq" filename.csv
こんにちは私はcsv生成にRuby on Railsを使っています。私たちのアプリケーションでは、私たちは多言語(I18n)に行くことを計画しています、そして、私たちはWindows ExcelのCSVファイルでI18nコンテンツを見ている間、問題に直面しました。
Linux(Ubuntu)とmacで大丈夫でした。
実際のデータを表示するには、Windows Excelにデータを再度インポートする必要があることを確認しました。インポート中に、文字セットを選択するためのオプションが増えます。
しかし、これは一人ひとりのユーザーのために教育することはできませんので、私たちが探している解決策は、ダブルクリックするだけで開くことです。
それからaghuddleston Gist の助けを借りて、ウィンドウズExcelでオープンモードとボムでデータを表示する方法を識別しました。参照で追加されました。
国際化の内容の例
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.write bom
f.write(csv_file)
WindowsとMac
ダブルクリックでファイルを直接開くことができます。
Linux(ubuntu)
私はこのスレッドで見つけることができたすべてを試してみました、そして同様に、何も完全にはうまくいきませんでした。ただし、グーグルシートにインポートしてcsvとしてダウンロードするだけでは、魅力的です。あなたが私の欲求不満の点に来たらそれを試してみてください。
これは古い質問ですが、私は遭遇したばかりの同じような問題を抱えており、解決策は他の人を助けるかもしれません:
CSVテキストデータをファイルに書き出してからExcelで結果の.csvを開くと、すべてのテキストが1つの列にシフトされるという同じ問題がありました。上記の答えを読んだ後、私は次のことを試みました、それは問題を整理するようです。
StreamWriterを作成するときにUTF-8のエンコードを適用してください。それでおしまい。
例:
using (StreamWriter output = new StreamWriter(outputFileName, false, Encoding.UTF8, 2 << 22)) {
/* ... do stuff .... */
output.Close();
}
数日前に同じ問題に直面しましたが、すべてが文字列としてスタイル設定されるため、import from csv
機能を使用できないため、解決策が見つかりませんでした。
私の解決策は、最初にnotpad ++とchange the encode to ASCII
でファイルを開くことでした。次に、Excelでファイルを開くと、期待どおりに機能しました。
あなたがそれを完全に自動にする、ワンクリック、あるいはWebページから自動的にExcelにロードすることを望むが、適切なExcelファイルを生成することができないなら、私は代替としてSYLKフォーマットを見ることをお勧めします。それはCSVほど単純ではありませんが、テキストベースで非常に実装が簡単で、問題なくUTF-8をサポートします。
私はデータを受け取り、ファイルをクリックするだけで直接Excelで開くSYLKファイルを出力するPHPクラスを書きました。書式設定(太字、書式設定番号など)を追加したり、列のサイズを変更したり、列内のテキストに列のサイズを自動調整したりすることもできます。コード全体では、おそらく約100行以下になります。
簡単なスプレッドシートを作成してSYLKとして保存してからテキストエディタで読み込むことで、SYLKをリバースエンジニアリングするのは簡単ではありません。最初のブロックは、あなたが認識することになるヘッダと標準の数値フォーマット(あなたが作成するすべてのファイルであなたが逆流する)です、そしてデータは単にX/Y座標と値です。
私は単純な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);
}
私はもともと次のようなコードを持っていましたが、それを使うとアクセントはメモ帳++では問題ないように見えますが、Excelでは乱用されていました。
using (StreamWriter writer = new StreamWriter(path))
{
SaveCSV(writer);
}
あなたの走行距離は異なるかもしれません - 私は.NET 365とOffice 365からのExcelを使用しています。