web-dev-qa-db-ja.com

Excel用CSVファイルの生成、値内に改行を入れる方法

Excel用のファイルを生成する必要があります。このファイルの値の一部には複数の行が含まれています。

英語以外のテキストも含まれているため、ファイルはUnicodeである必要があります。

生成するファイルは次のようになります(UTF8では、英語以外のテキストが混在し、多くの行があります)

Header1,Header2,Header3
Value1,Value2,"Value3 Line1
Value3 Line2"

複数行の値は二重引用符で囲まれ、通常の毎日の改行が含まれていることに注意してください。

私がウェブ上で見つけたものによると、これは動作するはずですが、少なくともExcel 2007とUTF8ファイルを勝ち取らないと、Excelは3行目を最初のデータ行の2行目ではなく2行目のデータ行として扱います。

これは顧客のマシンで実行する必要があり、Excelのバージョンを制御できないため、Excel 2000以降で動作するソリューションが必要です。

ありがとう

編集:Excel用(Unicode、タブ区切り、フィールド内の改行なし)と他の世界用(UTF8、標準CSV)の2つのCSVオプションを使用して、問題を「解決」しました。

私が探していたものではありませんが、少なくともそれは動作します(これまで)

145
Nir

スペース文字がデータの一部である場合にのみ、フィールドの先頭にスペース文字が必要です。 Excelは先頭のスペースを削除しません。見出しとデータフィールドに不要なスペースができます。さらに悪いことに、3番目の列の改行を「保護」する必要がある"は、フィールドの先頭にないため無視されます。

ファイルに非ASCII文字(UTF-8でエンコードされた)がある場合、ファイルの先頭にUTF-8 BOM(3バイト、hex EF BB BF)が必要です。そうしないと、Excelはutf-8ではなく、ロケールのデフォルトエンコーディング(cp1252など)に従ってデータを解釈し、非ASCII文字は破棄されます。

次のコメントはExcel 2003、2007、2013に適用されます。 Excel 2000ではテストされていません

Windowsエクスプローラーでファイル名をダブルクリックしてファイルを開くと、すべて正常に機能します。

Excel内から開くと、結果は異なります。

  1. ファイルにはASCII文字しかありません(BOMはありません):動作します。
  2. ファイルに非ASCII文字(UTF-8でエンコードされている)があり、先頭にUTF-8 BOMがあります:データがUTF-8でエンコードされていることを認識しますが、csv拡張を無視し、テキストインポートnot-a-Wizard、残念ながら、改行の問題が発生します。

オプションが含まれます:

  1. Excel内からファイルを開かないようにユーザーをトレーニングします:-(
  2. XLSファイルを直接記述することを検討してください... Python/Perl/PHP/.NET/etcでそれを行うために利用可能なパッケージ/ライブラリがあります
65
John Machin

多くの調整を行った後、Linuxでファイルを生成し、Windows + Excelで読み取りを行う構成を以下に示します。

  • フィールド内の改行は\ nである必要があります(明らかに二重引用符で囲まれています)
  • レコードの終わり:\ r\n
  • 等しい値でフィールドを開始しないでください。そうしないと、フィールドは式として扱われ、切り捨てられます

Perlでは、次のようにText :: CSVを使用してこれを行いました。

use Text::CSV;

open my $FO, ">:encoding(utf8)", $filename or die "Cannot create $filename: $!";
my $csv = Text::CSV->new({ binary => 1, eol => "\r\n" });

#for each row...:
$csv -> print ($FO, \@row);
23
Ian

最近、同様の問題が発生しました。HTMLファイルをインポートすることで解決しました。ベースラインの例は次のようになります。

<html xmlns:v="urn:schemas-Microsoft-com:vml"
xmlns:o="urn:schemas-Microsoft-com:office:office"
xmlns:x="urn:schemas-Microsoft-com:office:Excel"
xmlns="http://www.w3.org/TR/REC-html40">
  <head>
    <style>
      <!--
      br {mso-data-placement:same-cell;}
      -->
    </style>
  </head>
  <body>
    <table>
      <tr>
        <td>first line<br/>second line</td>
        <td style="white-space:normal">first line<br/>second line</td>
      </tr>
    </table>
  </body>
</html>

CSVではなく、さまざまなバージョンのExcelで異なる動作をする可能性がありますが、試してみる価値があると思います。

これが役立つことを願っています;-)

18
dtldarek

.CSVファイルに改行を含む二重引用符で囲まれたフィールドがある場合、.CSVファイルがUTF-8形式で記述されていると、Excelは.CSVファイルを正しくインポートしないことに注意してください。 Excelは、改行をCR/LFとして扱い、改行を開始します。スプレッドシートが文字化けしています。 (コンマの代わりに)セミコロンがフィールド区切り文字として使用されている場合でも、それは真実のようです。

この問題は、Windowsのメモ帳を使用して.CSVファイルを編集し、ファイル>名前を付けて保存...を使用してファイルを保存し、ファイルを保存する前にファイルエンコーディングをUTF-8からANSIに変更することで解決できます。ファイルをANSI形式で保存すると、Windows 7 Professionalで実行されているMicrosoft Excel 2013がファイルを適切にインポートすることがわかります。

8
OneSkyWalker

値内の改行は、コンマやタブの代わりにセミコロンを区切り文字として使用し、引用符を使用すると機能するようです。

これは、Excel 2010とExcel 2000の両方で機能します。しかし、驚くべきことに、ファイルを新しいスプレッドシートとして開いたときにのみ機能し、データインポート機能を使用して既存のスプレッドシートにインポートするときは機能しません。

6
Esben

PCでは、ASCII文字#10は、値内に改行を入れたいものです。

ただし、Excelに入力したら、複数行のセルのワードラップがオンになっているか、改行が正方形のボックスとして表示されることを確認する必要があります。

4
devuxer

ファイルをExcelにインポートしようとすると、これは機能しません。

ファイル拡張子csvをExcel.EXEに関連付けて、csvファイルをダブルクリックしてExcelを起動できるようにします。

ここでは、テキストの後にNewLine Charが続き、さらにテキストが続き、文字列全体を二重引用符で囲みます。

Excelは文字列の一部を次のセルに配置するため、CRは使用しないでください。

""text" + NL + "text""

Excelを起動すると、これが表示されます。すべてを表示するには、高さの自動サイズ調整が必要になる場合があります。改行位置は、セルの幅によって異なります。

2

日付

これが基本のコードです

CHR$(34,"2", 10,"DATE", 34)
3
Peabody

私はこれを見つけて、それは私のために働いた

$delimiter = ',';
$enc1 = '"';
$enc2 = '""';

次に、あなたが物を同封する必要がある場所

$myfile = ('/path/to/myfile.csv');
//erase any previous contents
$fp = fopen($myfile, 'w+');
fwrite($fp, $enc1 .  'Column Heading 1' . $enc1 . $delimiter );
//append to new file
$fp2 = fopen($myfile, 'a');
fwrite($fp2, $enc1 .  'Column Heading 2' . $enc1 . $delimiter );

.....

fwrite($fp2, $enc1 .  'Last Column Heading' . $enc1 . $delimiter. PHP_EOL );

次に、何かを記述する必要がある場合-「これを行うことができる」を含むHTMLなど

fwrite($fp2, $enc2 .  $myhtmlstring . $enc2 . $delimiter);

改行は. PHP_EOLで終わります

ユーザーがファイルをダウンロードできるように、スクリプトの最後にリンクが出力されます。

echo 'Click <a href="myfile.csv">here</a> to download file';
2
Lisa Simpson

これをテストしてください:それは私のために完全に動作します:xxxx.csvファイルに次の行を入れます

hola_x,="este es mi text1"&CHAR(10)&"I sigo escribiendo",hola_a

hola_y,="este es mi text2"&CHAR(10)&"I sigo escribiendo",hola_b

hola_z,="este es mi text3"&CHAR(10)&"I sigo escribiendo",hola_c

Excelで開きます。

場合によっては直接開きます。そうでない場合は、列からデータへの変換を使用する必要があります。列幅を広げて、テキストの折り返しボタンを押します。または、セルをフォーマットして折り返しテキストをアクティブにします。

そして、他の提案に感謝しますが、彼らは私のために動作しませんでした。私は純粋なWindows環境にいるので、ユニコードや他の面白いことで遊びたくありませんでした。

この方法で、csvからExcelに式を入力します。この作業方法には多くの用途があります。 (引用符の前の=に注意してください)

pd:あなたの提案には、コードだけでなくデータのサンプルをいくつか入れてください。

1
Ivan Cev

BOMを含むUTFファイルは、そのフィールドが引用符で囲まれている場合でも、Excelが改行を文字通り処理するようにします。 (Excel 2008 Macのテスト済み)

解決策は、改行を改行ではなくキャリッジリターン(CHR 13)にすることです。

1
Stephen

各行の最後に「\ r」を置くと、実際にはExcelで改行の効果がありましたが、.csvでは消失し、各行がスペースや改行なしで次の行に押しつぶされたい混乱を残しました

1
Duncan Wallace

それを行う方法(VB.Netを使用)は、二重引用符を表すcharであるChr(34)でテキストを改行で囲み、LFのすべてのCR-LF文字を置き換えます。

0
Sebastian

通常、新しい行は「\ r\n」です。 CSVでは、「\ r」を空の値に置き換えました。 Javascriptのコードは次のとおりです。

cellValue = cellValue.replace(/\r/g, "")

CSVをMS Excelで開くと、うまくいきました。値に複数の行がある場合、Excelシートの1つの単一セル内に留まります。

0
Tam Tran

ファイルを開くの場合のみ、構文は

 ,"one\n
 two",...

重要なことは、最初の「、」の後にスペースなしがあることです。通常、スペースは問題なく、文字列が引用符で囲まれていない場合は削除されます。しかし、そうでなければ厄介です。それを理解するためにしばらくかかりました。

行が\ nまたは\ c\nで終了するかどうかは問題ではないようです。

数式バーを展開して、セル内のテキストを実際に表示できることを確認してください(長い一日を過ごした後...)

もちろん、File OpenはUTF-8を適切にサポートしません(トリックを使用しない限り)。

Excel>データ> 外部データの取得>テキストから

TF-8モードに設定できます(フォントのリストの下にあります)。ただし、その場合、新しい行は機能しないようで、それを修正する方法はわかりません。

(30年後にMSがこのようなことを正しくするようになるかもしれません。)

0
Tuntable