Bagaimana saya bisa menghasilkan UTF-8 CSV dalam PHP yang Excel akan baca dengan benar?

191

Saya punya hal yang sangat sederhana ini yang hanya mengeluarkan beberapa hal dalam format CSV, tetapi haruslah UTF-8. Saya membuka file ini di TextEdit atau TextMate atau Dreamweaver dan menampilkan karakter UTF-8 dengan benar, tetapi jika saya membukanya di Excel itu melakukan hal konyol ini. Inilah yang saya dapatkan di kepala dokumen saya:

header("content-type:application/csv;charset=UTF-8");
header("Content-Disposition:attachment;filename=\"CHS.csv\"");

Ini semua tampaknya memiliki efek yang diinginkan kecuali Excel (Mac, 2008) tidak ingin mengimpornya dengan benar. Tidak ada opsi di Excel bagi saya untuk "terbuka sebagai UTF-8" atau apa pun, jadi ... Saya agak kesal.

Sepertinya saya tidak dapat menemukan solusi yang jelas untuk ini di mana saja, meskipun banyak orang memiliki masalah yang sama. Hal yang paling saya lihat adalah memasukkan BOM, tapi saya tidak tahu bagaimana melakukannya. Seperti yang Anda lihat di atas, saya hanya echomemasukkan data ini, saya tidak menulis file apa pun. Saya bisa melakukan itu jika perlu, saya hanya tidak karena sepertinya tidak ada kebutuhan untuk saat ini. Ada bantuan?

Pembaruan: Saya mencoba menggemakan BOM echo pack("CCC", 0xef, 0xbb, 0xbf);yang baru saja saya tarik dari situs yang mencoba mendeteksi BOM. Tetapi Excel hanya menambahkan ketiga karakter tersebut ke sel pertama saat impor, dan masih mengacaukan karakter khusus.

Ben Saufley
sumber
2
Excel tidak menyediakan opsi untuk menyesuaikan rangkaian karakter file yang masuk? Apakah Anda 100% yakin tentang itu? Saya tidak memiliki salinan yang berguna jadi saya tidak dapat mencoba tetapi saya membayangkan harus ada kotak drop down di suatu tempat.
Pekka
Ini adalah Excel di Mac - sepertinya lebih terbatas daripada Excel di PC. Tidak ada dropdown sama sekali dalam dialog Buka, di luar jenis file yang dapat dibuka. Saya sudah mencari kemana-mana. Jika ada di sana, itu tidak jelas. Saya akan mengatakan 98% yakin.
Ben Saufley
Microsoft office atau openoffice?
ajreal
Microsoft lebih baik dalam hal ini, tidak ada cara (yang saya temukan) untuk membuat OpenOffice mendeteksi charset, bahkan BOM. Sial.
Ciantic
BOM juga tidak berpengaruh pada Microsoft Excel 2008 untuk Mac.
Ben Saufley

Jawaban:

134

Mengutip insinyur dukungan Microsoft ,

Excel untuk Mac saat ini tidak mendukung UTF-8

Pembaruan, 2017 : Ini berlaku untuk semua versi Microsoft Excel untuk Mac sebelum Office 2016 . Versi yang lebih baru (dari Office 365) sekarang mendukung UTF-8.

Untuk menghasilkan konten UTF-8 yang dapat dibaca dengan baik oleh Excel di Windows dan OS X, Anda perlu melakukan dua hal:

  1. Pastikan Anda mengonversi teks CSF UTF-8 Anda menjadi UTF-16LE

    mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
  2. Pastikan Anda menambahkan tanda urutan byte UTF-16LE ke awal file

    chr(255) . chr(254)

Masalah berikutnya yang hanya muncul dengan Excel pada OS X (tetapi bukan Windows) adalah ketika melihat file CSV dengan nilai yang dipisahkan koma, Excel akan membuat baris hanya dengan satu baris dan semua teks bersama dengan koma di baris pertama.

Cara untuk menghindari ini adalah dengan menggunakan tab sebagai nilai Anda yang terpisah.

Saya menggunakan fungsi ini dari komentar PHP (menggunakan tab "\ t" alih-alih koma) dan berfungsi dengan baik pada OS X dan Windows Excel.

Perhatikan bahwa untuk memperbaiki masalah dengan kolom kosong sebagai akhir baris, saya memang harus mengubah baris kode yang mengatakan:

    $field_cnt = count($fields);

untuk

    $field_cnt = count($fields)-1;

Seperti beberapa komentar lain di halaman ini katakan, aplikasi spreadsheet lain seperti OpenOffice Calc, Angka Apple sendiri dan Google Doc's Spreadsheet tidak memiliki masalah dengan file UTF-8 dengan koma.

Lihat tabel di pertanyaan ini untuk mengetahui apa yang berfungsi dan tidak berfungsi untuk file Unicode CSV di Excel


Sebagai catatan, saya dapat menambahkan bahwa jika Anda menggunakan Komposer , Anda harus melihat menambahkan League\Csvke kebutuhan Anda. League\Csvmemiliki API yang sangat bagus untuk membuat file CSV .

Untuk menggunakan League\Csvmetode membuat file CSV ini, lihat contoh ini

Tim Groeneveld
sumber
1
Panggil aku bodoh, tapi aku tidak bisa membuat ini berhasil. Saya mengonversi data saya menggunakan fungsi mb_convert_encoding dan mengeluarkan BOM sebelum konten file, tetapi saya hanya mendapatkan satu baris karakter Cina ketika saya membuka file di Excel. Saya masih menggunakan koma daripada tab untuk saat ini, tetapi mungkin itu seharusnya tidak menyebabkan apa yang saya lihat.
John Rix
@ JohnRix itu aneh. Kode ini benar-benar menyelesaikan setiap masalah yang pernah saya alami dengan file CSV yang diekspor - dengan pengecualian importir yang hanya akan menerima koma. Bisakah Anda mengirimkan saya pastebin dari kode yang Anda gunakan, bersama dengan array yang Anda ubah menjadi CSV dan salinan file yang diekspor?
Tim Groeneveld
2
Solusi ini juga memecahkan masalah UTF8 untuk saya di Mac dan Windows. Saya juga menemukan bahwa menambahkan baris dengan sep=;atau sep=,ke file CSV memberi tahu Excel bagaimana CSV dipisahkan dan kolom akan dibuat dengan benar lagi.
Luc Wollants
5
Saya menemukan bahwa hal-hal keluar kacau jika saya memulai string hanya sebagai BOM, kemudian pada baris lain menambahkan "sep=,\n", kemudian pada baris lain menambahkan data. Semuanya baik-baik saja jika saya melakukan semuanya dalam satu baris ( $csv = chr(255) . chr(254) /* BOM */ . "sep=,\n" . mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');). Semuanya tampak hebat sekarang di Mac. Saya tidak punya Windows untuk diuji.
gemetar
2
Satu-satunya hal yang sepenuhnya bekerja untuk saya. Inkonsistensi Microsoft tidak pernah berhenti membuat saya takjub. Menyimpan file csv yang normal menggunakan "," sebagai pembatas tetapi jika ada BOM ia menyimpan menggunakan "\ t" untuk beberapa alasan. C dalam .csv singkatan dari "COMMA" sial. Ini sebenarnya tidak sulit untuk dilakukan.
Phil
288

Saya memiliki masalah yang sama (atau serupa).

Dalam kasus saya, jika saya menambahkan BOM ke output, itu berfungsi:

header('Content-Encoding: UTF-8');
header('Content-type: text/csv; charset=UTF-8');
header('Content-Disposition: attachment; filename=Customers_Export.csv');
echo "\xEF\xBB\xBF"; // UTF-8 BOM

Saya percaya ini adalah peretasan yang sangat jelek, tetapi berhasil bagi saya, setidaknya untuk Excel 2007 Windows. Tidak yakin itu akan berfungsi pada Mac.

Daniel Magliola
sumber
10
Jelek, tapi sangat membantu. Terima kasih.
abelito
7
Sayangnya, saya cukup yakin ini tidak bekerja dengan baik pada OS X. Saya pikir itu mungkin benar-benar menampilkan BOM ketika Anda mengimpor (peringatan: kenangan kabur.)
davidtbernal
2
Ini benar. Setidaknya, saya sudah mencoba menambahkan dengan BOM, seperti dalam contoh di atas, tetapi memang hanya menunjukkan beberapa karakter yang funky di awal dan terus menampilkan karakter khusus yang salah (diuji di Excel 2011). Ini sepertinya bekerja paling baik untuk saya di semua pengaturan: stackoverflow.com/a/1648671/1005334 (menggunakan PHP).
kasimir
4
Saya terus mendapat peringatan tentang pertanyaan ini karena ternyata banyak orang tersandung. Saya berharap saya dapat menandai ini sebagai benar, karena sudah banyak dipilih. Sayangnya, saya akhirnya memberikan solusi ini (mengabaikan proyek itu sejak lama) dan itu tidak berfungsi untuk saya di Excel 2008 untuk Mac. Senang itu berhasil untuk Anda. Saya telah memutus solusinya. Tapi itu tidak menyelesaikan masalah Excel untuk Mac 2008. Jika ada yang beruntung di Mac, pasti beri tahu saya (dan tampaknya semua orang ) tahu.
Ben Saufley
Bekerja dengan indah menghasilkan file CSV ke MS Excel Starter 2010. Terima kasih banyak!
Jamie Dexter
32

Inilah cara saya melakukannya (itu untuk meminta browser mengunduh file csv):

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=file.csv');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
echo "\xEF\xBB\xBF"; // UTF-8 BOM
echo $csv_file_content;
exit();

Satu-satunya hal itu memperbaiki masalah pengkodean UTF8 dalam pratinjau CSV ketika Anda menekan spasi di Mac .. tetapi tidak di Excel Mac 2008 ... tidak tahu mengapa

Jazzer
sumber
1
UTF-8 BOM baris kode menghemat hari saya dengan mengekspor ke xls
Mladen Janjetovic
6
Saya sedang mencari cara untuk output langsung ke browser sebagai utf8, ketika saya menemukan posting ini, Inilah solusi saya dengan kredit untuk posting ini untuk BOM dan header transfer biner. $outstream = fopen( "php://output", 'w' ); fputs( $outstream, "\xEF\xBB\xBF" ); foreach ( $export as $fields ) { fputcsv( $outstream, $fields ); } fclose( $outstream );
fyrye
Typo - hapus dobel )).
sitilge
22

Saya hanya berurusan dengan masalah yang sama, dan muncul dengan dua solusi.

  1. Gunakan kelas PHPExcel seperti yang disarankan oleh bpeterson76 .

    • Menggunakan kelas ini menghasilkan file yang paling kompatibel secara luas, saya dapat menghasilkan file dari data berkode UTF-8 yang dibuka dengan baik di Excel 2008 Mac, Excel 2007 Windows, dan Google Docs.
    • Masalah terbesar dengan menggunakan PHPExcel adalah lambat dan menggunakan banyak memori, yang bukan masalah untuk file berukuran wajar, tetapi jika file Excel / CSV Anda memiliki ratusan atau ribuan baris, pustaka ini menjadi tidak dapat digunakan .
    • Berikut adalah metode PHP yang akan mengambil beberapa data TSV dan mengeluarkan file Excel ke browser, perhatikan bahwa ia menggunakan Excel5 Writer, yang berarti file tersebut harus kompatibel dengan versi Excel yang lebih lama, tetapi saya tidak lagi memiliki akses ke apa pun, jadi saya tidak bisa mengujinya.

      function excel_export($tsv_data, $filename) {
          $export_data = preg_split("/\n/", $tsv_data);
          foreach($export_data as &$row) {
              $row = preg_split("/\t/", $row);
          }
      
          include("includes/PHPExcel.php");
          include('includes/PHPExcel/Writer/Excel5.php');
      
          $objPHPExcel = new PHPExcel();          
      
          $objPHPExcel->setActiveSheetIndex(0);
          $sheet = $objPHPExcel->getActiveSheet();
          $row = '1';
          $col = "A";
          foreach($export_data as $row_cells) {
              if(!is_array($row_cells)) { continue; }
                  foreach($row_cells as $cell) {
                      $sheet->setCellValue($col.$row, $cell);
                      $col++;
                  }
              $row += 1;
              $col = "A";
          }
      
          $objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
          header('Content-Type: application/vnd.ms-excel');
          header('Content-Disposition: attachment;filename="'.$filename.'.xls"');
          header('Cache-Control: max-age=0');
          $objWriter->save('php://output');   
          exit;   
      }
  2. Karena masalah efisiensi dengan PHPExcel, saya juga harus mencari cara untuk menghasilkan file CSV atau TSV yang kompatibel dengan UTF-8 & Excel.

    • Yang terbaik yang bisa saya dapatkan adalah file yang kompatibel dengan Excel 2008 Mac, dan Excel 2007 PC, tetapi tidak Google Docs, yang cukup baik untuk aplikasi saya.
    • Saya menemukan solusinya di sini , khususnya, jawaban ini , tetapi Anda juga harus membaca jawaban yang diterima karena menjelaskan masalahnya.
    • Berikut adalah kode PHP yang saya gunakan, perhatikan bahwa saya menggunakan data tsv (tab sebagai pembatas bukan koma):

      header ( 'HTTP/1.1 200 OK' );
      header ( 'Date: ' . date ( 'D M j G:i:s T Y' ) );
      header ( 'Last-Modified: ' . date ( 'D M j G:i:s T Y' ) );
      header ( 'Content-Type: application/vnd.ms-excel') ;
      header ( 'Content-Disposition: attachment;filename=export.csv' );
      print chr(255) . chr(254) . mb_convert_encoding($tsv_data, 'UTF-16LE', 'UTF-8');
      exit;
Jasdeep Gosal
sumber
saya menghadapi masalah yang sama pada Windows-7 Excel 2007 & mencoba semua saran tetapi gagal :(
PHP Ferrari
Solusi UTF-16LE adalah yang bekerja. Perhatikan bahwa Anda harus memformat tsv dengan benar, dan itu harus tsc, jadi tab dibatasi, bukan dibatasi koma. Lihat juga posting Marc di sini: stackoverflow.com/a/1648671/1697370
Ellert van Koperen
17

Saya mengalami masalah yang sama dan diselesaikan seperti di bawah ini:

    header('Content-Encoding: UTF-8');
    header('Content-Type: text/csv; charset=utf-8' );
    header(sprintf( 'Content-Disposition: attachment; filename=my-csv-%s.csv', date( 'dmY-His' ) ) );
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');

    $df = fopen( 'php://output', 'w' );

    //This line is important:
    fputs( $df, "\xEF\xBB\xBF" ); // UTF-8 BOM !!!!!

    foreach ( $rows as $row ) {
        fputcsv( $df, $row );
    }
    fclose($df);
    exit();
Reza Mamun
sumber
13

Excel tidak mendukung UTF-8. Anda harus menyandikan teks UTF-8 ke dalam UCS-2LE.

mb_convert_encoding($output, 'UCS-2LE', 'UTF-8');
Leopold Gault
sumber
3
Lebih baik gunakan UTF-16LE seperti yang disarankan di atas, yang mencakup setiap karakter yang ada.
Ellert van Koperen
Saya perhatikan bahwa mb_convert_encoding ini berfungsi dengan baik dan menampilkan diakritik dengan benar di file XLS yang diekspor. Saya memiliki konfigurasi default mysql dan apache + php diatur untuk bekerja dengan utf-8
Junior Mayhé
10

Dalam kasus saya berikut ini berfungsi sangat baik untuk membuat file CSV dengan karakter UTF-8 ditampilkan dengan benar di Excel.

$out = fopen('php://output', 'w');
fprintf($out, chr(0xEF).chr(0xBB).chr(0xBF));
fputcsv($out, $some_csv_strings);

The 0xEF 0xBB 0xBFsundulan BOM akan membiarkan Excel tahu pengkodean yang benar.

Codemole
sumber
1
besar untuk Anda kawan <3
Adrien G
fprintf($out, chr(0xEF).chr(0xBB).chr(0xBF));<- inilah yang aku butuhkan. Itu bekerja seperti pesona.
Alex
8

Untuk menindaklanjuti ini:

Tampaknya masalahnya hanya dengan Excel di Mac. Bukan bagaimana saya menghasilkan file, karena bahkan menghasilkan CSV dari Excel adalah melanggarnya. Saya simpan sebagai CSV, dan impor kembali, dan semua karakter kacau.

Jadi ... sepertinya tidak ada jawaban yang benar untuk ini. Terima kasih atas semua sarannya.

Saya akan mengatakan bahwa dari semua yang saya baca, saran @Daniel Magliola tentang BOM mungkin akan menjadi jawaban terbaik untuk beberapa komputer lain. Tapi itu masih belum menyelesaikan masalah saya.

Ben Saufley
sumber
Karena dukungan UTF8 tidak konsisten di Mac dan Windows, taruhan terbaik adalah menggunakan pengkodean yang berbeda sama sekali. Saya telah menemukan cp1252 umumnya bermain baik dengan barang-barang Microsoft. en.wikipedia.org/wiki/Windows-1252
s29
1
Ben, ada jawaban yang benar untuk pertanyaan ini :) Lihat milikku!
Tim Groeneveld
7

Ini berfungsi dengan baik di excel untuk Windows dan juga Mac OS.

Perbaiki masalah di excel yang tidak menampilkan karakter yang mengandung diakritik, huruf cyrillic, huruf yunani dan simbol mata uang.

function writeCSV($filename, $headings, $data) {   

    //Use tab as field separator
    $newTab  = "\t";
    $newLine  = "\n";

    $fputcsv  =  count($headings) ? '"'. implode('"'.$newTab.'"', $headings).'"'.$newLine : '';

    // Loop over the * to export
    if (! empty($data)) {
      foreach($data as $item) {
        $fputcsv .= '"'. implode('"'.$newTab.'"', $item).'"'.$newLine;
      }
    }

    //Convert CSV to UTF-16
    $encoded_csv = mb_convert_encoding($fputcsv, 'UTF-16LE', 'UTF-8');

    // Output CSV-specific headers
    header('Set-Cookie: fileDownload=true; path=/'); //This cookie is needed in order to trigger the success window.
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: private",false);
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"$filename.csv\";" );
    header("Content-Transfer-Encoding: binary");
    header('Content-Length: '. strlen($encoded_csv));
    echo chr(255) . chr(254) . $encoded_csv; //php array convert to csv/excel

    exit;
}
Murali Krishna
sumber
solusi ini memungkinkan saya untuk membuat ekspor berfungsi untuk Google Sheets juga (beberapa yang lain gagal)
Cafn
6

File CSV harus termasuk Tanda Pemesanan Byte.

Atau seperti yang disarankan dan solusi hanya gema dengan badan HTTP

Cybot
sumber
5

Menambahkan:

fprintf($file, chr(0xEF).chr(0xBB).chr(0xBF));

Atau:

fprintf($file, "\xEF\xBB\xBF");

Sebelum menulis konten apa pun ke file CSV.

Contoh:

<?php
$file = fopen( "file.csv", "w");
fprintf( $file, "\xEF\xBB\xBF");
fputcsv( $file, ["english", 122, "বাংলা"]);
fclose($file);
Rejaul
sumber
4

Karena pengkodean UTF8 tidak berfungsi dengan baik dengan Excel. Anda dapat mengonversi data ke jenis penyandian lain menggunakan iconv().

misalnya

iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $value),
Abrar A. Shareef
sumber
Ini adalah satu-satunya solusi yang bekerja untuk saya dengan Excel Mac 2011
Christer Fernstrom
3

Mengonversi teks yang sudah dikodekan utf-8 dengan menggunakan mb_convert_encodingtidak diperlukan. Cukup tambahkan tiga karakter di depan konten asli:

$newContent = chr(239) . chr(187) . chr(191) . $originalContent

Bagi saya ini menyelesaikan masalah karakter khusus dalam file csv.

Rvanlaak
sumber
Luar biasa; Saya mencoba minimal 10 solusi lain dan satu-satunya solusi bagi saya tampaknya adalah yang ini, ketika dikombinasikan dengan UTF-8 BOM via fputs.
kaarto
2

Ketika saya menyelidiki dan menemukan bahwa UTF-8 tidak berfungsi dengan baik pada MAC dan Windows, jadi saya mencoba dengan Windows-1252, ia mendukung dengan baik pada keduanya tetapi Anda harus memilih jenis pengkodean di ubuntu. Ini kode saya$valueToWrite = mb_convert_encoding($value, 'Windows-1252');

$response->headers->set('Content-Type', $mime . '; charset=Windows-1252');
    $response->headers->set('Pragma', 'public');
    $response->headers->set('Content-Endcoding','Windows-1252');
    $response->headers->set('Cache-Control', 'maxage=1');
    $response->headers->set('Content-Disposition', $dispositionHeader);
    echo "\xEF\xBB\xBF"; // UTF-8 BOM
Ho Ha
sumber
2
**This is 100% works fine in excel for both Windows7,8,10 and also All Mac OS.**
//Fix issues in excel that are not displaying characters containing diacritics, cyrillic letters, Greek letter and currency symbols.

function generateCSVFile($filename, $headings, $data) {

    //Use tab as field separator
    $newTab  = "\t";
    $newLine  = "\n";

    $fputcsv  =  count($headings) ? '"'. implode('"'.$newTab.'"', $headings).'"'.$newLine : '';

    // Loop over the * to export
    if (! empty($data)) {
      foreach($data as $item) {
        $fputcsv .= '"'. implode('"'.$newTab.'"', $item).'"'.$newLine;
      }
    }

    //Convert CSV to UTF-16
    $encoded_csv = mb_convert_encoding($fputcsv, 'UTF-16LE', 'UTF-8');

    // Output CSV-specific headers
    header('Set-Cookie: fileDownload=true; path=/'); //This cookie is needed in order to trigger the success window.
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: private",false);
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"$filename.csv\";" );
    header("Content-Transfer-Encoding: binary");
    header('Content-Length: '. strlen($encoded_csv));
    echo chr(255) . chr(254) . $encoded_csv; //php array convert to csv/excel
    exit;
}
Sagar72427
sumber
2
Secara umum, jawaban akan jauh lebih membantu jika mereka menyertakan penjelasan tentang apa yang dimaksudkan untuk dilakukan oleh kode, dan mengapa itu memecahkan masalah tanpa memperkenalkan orang lain.
Tim Diekmann
1

Bagaimana kalau hanya menghasilkan untuk Excel sendiri? Ini adalah kelas yang sangat baik yang memungkinkan Anda untuk menghasilkan file sisi server file XLS. Saya sering menggunakannya untuk klien yang tidak dapat "mencari tahu" csv dan sejauh ini tidak pernah memiliki keluhan. Ini juga memungkinkan beberapa pemformatan tambahan (bayangan, ketinggian baris, perhitungan, dll) yang tidak akan pernah dilakukan csv.

bpeterson76
sumber
Perlu diketahui bahwa phpexcel memiliki masalah dengan jumlah data yang besar.
Ellert van Koperen
1

Anda dapat mengonversi CSV String Anda dengan iconv . sebagai contoh:

$csvString = "Möckmühl;in Möckmühl ist die Hölle los\n";
file_put_contents('path/newTest.csv',iconv("UTF-8", "ISO-8859-1//TRANSLIT",$csvString) );
foued611
sumber
Contoh teks yang bagus;)
ngeek
1

Anda harus menggunakan penyandian "Windows-1252".

header('Content-Encoding: Windows-1252');
header('Content-type: text/csv; charset=Windows-1252');
header("Content-Disposition: attachment; filename={$filename}");

Mungkin Anda harus mengonversi string Anda:

private function convertToWindowsCharset($string) {
  $encoding = mb_detect_encoding($string);

  return iconv($encoding, "Windows-1252", $string);
}
roNn23
sumber
1

Anda dapat menambahkan 3 byte ke file sebelum mengekspor, itu berfungsi untuk saya. Sebelum melakukan sistem itu hanya berfungsi di Windows dan HP -UX tetapi gagal di Linux.

FileOutputStream fStream = new FileOutputStream( f );
final byte[] bom = new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF };
OutputStreamWriter writer = new OutputStreamWriter( fStream, "UTF8" );
fStream.write( bom );

Memiliki UTF-8 BOM (3 byte, hex EF BB BF) di awal file. Kalau tidak, Excel akan menginterpretasikan data sesuai dengan pengkodean default lokal Anda (mis. Cp1252) alih-alih utf-8

Membuat file CSV untuk Excel, cara memiliki baris baru di dalam suatu nilai

Cherry Yap
sumber
1

Saya menggunakan Mac, dalam kasus saya, saya hanya harus menentukan pemisah dengan "sep=;\n"dan menyandikan file dalam UTF-16LE seperti ini:

$data = "sep=;\n" .mb_convert_encoding($data, 'UTF-16LE', 'UTF-8');
Sebastien Horin
sumber
1

Bagi saya tidak ada solusi di atas yang berhasil. Di bawah ini adalah apa yang saya lakukan untuk menyelesaikan masalah: ubah nilainya menggunakan fungsi ini dalam kode PHP:

$value = utf8_encode($value);

Nilai output ini benar dalam lembar excel.

Barani r
sumber
0

Saya memiliki masalah yang sama ketika saya memiliki rutin Excel VBA yang mengimpor data. Karena CSV adalah format teks biasa, saya menangani ini dengan secara terprogram membuka data dalam editor file sederhana seperti wordpad, dan menyimpannya kembali sebagai teks unicode, atau menyalinnya ke clipboard dari sana dan menempelkannya ke Excel. Jika excel tidak secara otomatis mem-parsing CSV ke dalam sel, ini mudah diperbaiki menggunakan fitur "Teks ke Kolom" bawaan.

Alain
sumber
Saya sudah mencobanya! Tapi itu sudah dikodekan sebagai teks unicode ... menyimpannya sebagai teks unicode tidak mengubah apa pun. Bagaimana saya menyimpannya sebagai teks biasa tanpa itu menafsirkan semua karakter khusus secara tidak benar?
Ben Saufley
Saya pikir dengan "menyimpannya sebagai teks Unicode", Alain mungkin berarti "UTF-16LE". Windows sering (sayangnya) menggunakan "Unicode" untuk merujuk secara tidak benar ke UTF-16LE atau UTF-16LE dengan BOM terkemuka. File Notepad -> Simpan dialog menggunakan "Unicode" dengan cara ini.
Thanatos
0

Apakah masalah masih terjadi ketika Anda menyimpannya sebagai file .txt dan membukanya dengan exca sebagai pembatas?

Masalahnya mungkin bukan encoding sama sekali, mungkin saja file tersebut bukan CSV yang sempurna menurut standar excel.

Alain
sumber
Sejauh yang saya tahu, format CSV baik-baik saja. Saya dapat membuat CSV "sempurna" di TextEdit, tidak ada masalah, atau bahkan mengganti nama txt sebagai csv, jadi tidak ada yang hilang rahasia - CSV hanyalah file teks. Plus, pemformatan semuanya sempurna di Excel, itu hanya karakter khusus yang dipecah. Tapi untuk jaga-jaga, saya mencoba saran Anda, dan sayangnya menghasilkan masalah yang sama.
Ben Saufley
Dari "WTF yang mereka pikirkan" dept .: menyadari bahwa menurut Microsoft pemisah bidang yang benar bergantung pada lokal. File 'dipisahkan koma' mungkin memerlukan bidang yang benar-benar dipisahkan dengan tanda koma di beberapa lokal - dan tidak ada yang dapat Anda lakukan kecuali menyarankan OpenOffice
djn
itu cukup gila - sayangnya saya tidak mengalami kesulitan membatasi bidang dengan benar. Saya hanya mengalami masalah dengan karakter khusus ini.
Ben Saufley
0

Posting ini cukup lama, tetapi setelah berjam-jam mencoba saya ingin berbagi solusi saya ... mungkin itu membantu seseorang yang berurusan dengan Excel dan Mac dan CSV dan tersandung oleh ancaman ini. Saya menghasilkan csv secara dinamis sebagai output dari Database dengan Pengguna Excel dalam pikiran. (UTF-8 dengan BOM)

Saya mencoba banyak ikon tetapi tidak bisa membuat umlaut Jerman berfungsi di Mac Excel 2004. Satu solusi: PHPExcel. Ini bagus tetapi untuk proyek saya agak terlalu banyak. Yang berhasil bagi saya adalah membuat file csv dan mengonversi file csv ini menjadi xls dengan PHPsnippet ini: csv2xls . xls hasil bekerja dengan excel umlaut Jerman (ä, ö, Ü, ...).

buku t
sumber
0

Saya baru saja mencoba tajuk ini dan mendapatkan Excel 2013 pada PC Windows 7 untuk mengimpor file CSV dengan karakter khusus dengan benar. Byte Order Mark (BOM) adalah kunci terakhir yang membuatnya berfungsi.

    header ('Content-Encoding: UTF-8');
    header ('Jenis konten: teks / csv; charset = UTF-8');
    header ("Content-disposition: attachment; filename = filename.csv");
    tajuk ("Pragma: publik");
    header ("Kedaluwarsa: 0");
    gema "\ xEF \ xBB \ xBF"; // BOM UTF-8

Brian
sumber
Ya, itu benar, ini akan berfungsi dengan benar di Excel untuk Windows, tetapi seperti yang dijelaskan dalam jawaban saya, itu tidak akan berfungsi di Excel untuk OS X.
Tim Groeneveld
0

Jika tidak, Anda dapat:

header("Content-type: application/x-download");
header("Content-Transfer-Encoding: binary");
header("Content-disposition: attachment; filename=".$fileName."");
header("Cache-control: private");

echo utf8_decode($output);
pengguna3519396
sumber
0

Solusi MUDAH untuk Mac Excel 2008: Saya berkali-kali bergumul dengan masalah ini, tetapi inilah cara mudah saya: Buka file .csv di Textwrangler yang seharusnya membuka karakter UTF-8 Anda dengan benar. Sekarang di bilah status bawah, ubah format file dari "Unicode (UTF-8)" ke "Western (ISO Latin 1)" dan simpan file tersebut. Sekarang pergi ke Mac Excel 2008 Anda dan pilih File> Impor> Pilih csv> Temukan file Anda> di File asal pilih "Windows (ANSI)" dan voila karakter UTF-8 ditampilkan dengan benar. Setidaknya itu untukku ...

Poul
sumber
0

Saya menggunakan ini dan berfungsi

header('Content-Description: File Transfer');
header('Content-Type: text/csv; charset=UTF-16LE');
header('Content-Disposition: attachment; filename=file.csv');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
// output headers so that the file is downloaded rather than displayed
// create a file pointer connected to the output stream
$output = fopen('php://output', 'w');
fputs( $output, "\xEF\xBB\xBF" );
// output the column headings
fputcsv($output, array('Thông tin khách hàng đăng ký'));
// fetch the data
$setutf8 = "SET NAMES utf8";
$q = $conn->query($setutf8);
$setutf8c = "SET character_set_results = 'utf8', character_set_client =
'utf8', character_set_connection = 'utf8', character_set_database = 'utf8',
character_set_server = 'utf8'";
$qc = $conn->query($setutf8c);
$setutf9 = "SET CHARACTER SET utf8";
$q1 = $conn->query($setutf9);
$setutf7 = "SET COLLATION_CONNECTION = 'utf8_general_ci'";
$q2 = $conn->query($setutf7);
$sql = "SELECT id, name, email FROM myguests";
$rows = $conn->query($sql);
$arr1= array();
if ($rows->num_rows > 0) {
// output data of each row
while($row = $rows->fetch_assoc()) {
    $rcontent = " Name: " . $row["name"]. " - Email: " . $row["email"];  
    $arr1[]["title"] =  $rcontent;
}
} else {
     echo "0 results";
}
$conn->close();
// loop over the rows, outputting them
foreach($arr1 as $result1):
   fputcsv($output, $result1);
endforeach;
BoRnbeBaD
sumber
0

# Keluarkan UTF-8 CSV dalam PHP yang akan dibaca Excel dengan benar.

//Use tab as field separator   
$sep  = "\t";  
$eol  = "\n";    
$fputcsv  =  count($headings) ? '"'. implode('"'.$sep.'"', $headings).'"'.$eol : '';
Murali Krishna
sumber
Satu jawaban per orang sudah cukup. Di masa depan ingat Anda dapat menambahkan informasi ke jawaban Anda kapan saja, Anda tidak perlu membuat 2
RiggsFolly
-1
//convert UTF-8 file without BOM to UTF-16LE for excel on mac
$fileUtf8String = file_get_contents("file.ext");
file_put_contents("file.ext", "\xFF\xFE" . mb_convert_encoding($fileUtf8String, "UTF-16LE", "UTF-8"));
b3wii
sumber
Pertanyaan ini tidak menanyakan cara mengonversi, tetapi bagaimana cara menghasilkan. Bagian yang relevan dari kontribusi ini, menghasilkan dalam UTF-16, sudah berkontribusi dalam Jawaban yang Dipilih .
Ben Saufley
@ BenSaufley Yah tapi itu memecahkan masalah pertanyaan dengan 2 baris kode sederhana
b3wii
Pertanyaannya sudah dipecahkan, dan dijelaskan dengan lebih seksama.
Ben Saufley