PHP'de Excel'in düzgün okuyacağı bir UTF-8 CSV çıktısını nasıl alabilirim?


191

Ben sadece CSV formatında bazı şeyler çıktı bu çok basit bir şey var, ama UTF-8 olması gerekir. Bu dosyayı TextEdit veya TextMate veya Dreamweaver'da açıyorum ve UTF-8 karakterlerini düzgün bir şekilde gösteriyor, ancak Excel'de açarsam bunun yerine aptalca bir şey yapıyor. Dokümanımın başında ne var:

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

Excel'in (Mac, 2008) düzgün bir şekilde içe aktarmak istememesi dışında, bunların hepsi istenen etkiye sahip gibi görünüyor. Excel'de "UTF-8 olarak açmam" veya başka bir şey için hiçbir seçenek yok, bu yüzden ... Biraz rahatsız oluyorum.

Aynı sorunu yaşayan birçok insana rağmen, hiçbir yerde buna net bir çözüm bulamıyorum. En çok gördüğüm şey, Malzeme Listesini dahil etmektir, ancak bunun nasıl yapılacağını tam olarak anlayamıyorum. Yukarıda da görebileceğiniz gibi sadece echobu veriyi veriyorum, herhangi bir dosya yazmıyorum. İhtiyacım olursa bunu yapabilirim, çünkü bu noktada buna ihtiyaç yok gibi görünmüyor. Herhangi bir yardım?

Güncelleme: Malzeme Listesini echo pack("CCC", 0xef, 0xbb, 0xbf);tespit etmeye çalışan bir siteden yeni çektiğim Malzeme Listesini yankılamayı denedim . Ancak Excel, içe aktarıldığında bu üç karakteri ilk hücreye ekler ve yine de özel karakterleri karıştırır.


2
Excel, gelen dosyanın karakter kümesini ayarlama seçeneği sunmuyor mu? Bundan% 100 emin misin? Elimde bir kopya yok, bu yüzden deneyemiyorum ama bir yerde bir açılır kutu olması gerektiğini hayal ediyorum .
Pekka

Bu bir Mac'teki Excel - PC'deki Excel'den daha sınırlı görünüyor. Aç iletişim kutusunda, açılacak dosya türlerinin ötesinde hiçbir açılır liste yoktur. Her yere baktım. Eğer oradaysa, belirsizdir. % 98 eminim diyebilirim.
Ben Saufley

Microsoft ofisi mi yoksa openoffice mi?
ajreal

Microsoft bu konuda daha iyidir, (Buldum) OpenOffice bile BOM değil charset tespit etmek için hiçbir yolu yoktur. Kahretsin.
Ciantic

BOM'nin Mac için Microsoft Excel 2008 üzerinde de bir etkisi yoktur.
Ben Saufley

Yanıtlar:


134

Bir Microsoft destek mühendisine teklif vermek için ,

Mac için Excel şu anda UTF-8'i desteklemiyor

Güncelleştirme, 2017 : Bu, Office 2016'dan önceki Mac için Microsoft Excel'in tüm sürümleri için geçerlidir . Daha yeni sürümler (Office 365'ten) artık UTF-8'i destekliyor.

Excel'in hem Windows hem de OS X'te başarıyla okuyabileceği UTF-8 içeriği çıktısı almak için iki şey yapmanız gerekir:

  1. UTF-8 CSV metninizi UTF-16LE'ye dönüştürdüğünüzden emin olun

    mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
  2. UTF-16LE bayt sırası işaretini dosyanın başına eklediğinizden emin olun

    chr(255) . chr(254)

Yalnızca OS X'te Excel'de (ancak Windows'da değil ) görünen bir sonraki sorun virgülle ayrılmış değerlere sahip bir CSV dosyasını görüntülerken, Excel ilk satırdaki virgüllerle birlikte yalnızca bir satır ve tüm metin ile satır oluşturur.

Bundan kaçınmanın yolu sekmeleri ayrılmış değeriniz olarak kullanmaktır.

Kullandığım PHP yorumlardan Bu fonksiyonu (yerine virgül "\ t" sekmeleri kullanarak) ve OS X ve Windows Excel üzerinde mükemmel çalıştı.

Bir satır sonu olarak boş bir sütunla ilgili bir sorunu düzeltmek için şunu söyleyen kod satırını değiştirmek zorunda kaldım:

    $field_cnt = count($fields);

için

    $field_cnt = count($fields)-1;

Bu sayfadaki diğer yorumların dediği gibi, OpenOffice Calc, Apple'ın kendi Numaraları ve Google Dokümanın Elektronik Tablosu gibi diğer e-tablo uygulamalarında virgül içeren UTF-8 dosyalarıyla sorun yoktur.

Excel'deki Unicode CSV dosyaları için neyin işe yarayıp neyin işe yaramadığını öğrenmek için bu sorudaki tabloya bakın .


Bir yan not olarak, Composer kullanıyorsanız League\Csv, gereksinimlerinize eklemeye bir göz atmanız gerektiğini ekleyebilirim . CSV dosyaları oluşturmak için gerçekten güzel bir API'yeLeague\Csv sahip .

League\CsvBu CSV dosyaları oluşturma yöntemiyle kullanmak için bu örneğe göz atın


1
Bana aptal de, ama bu işi yapamam. Verilerimi mb_convert_encoding işlevini kullanarak dönüştürdüm ve dosya içeriğinden önceki BOM çıktısını aldım, ancak dosyayı Excel'de açtığımda yalnızca Çince karakterlerin tek bir satırını alıyorum. Şimdilik sekmeler yerine virgül kullanıyorum, ancak muhtemelen bu gördüğüme neden olmamalı.
John Rix

@JohnRix bu çok garip. Bu kod, CSA dosyaları dışa aktarılırken yalnızca virgül kabul eden ithalatçılar dışında yaşadığım her sorunu tam anlamıyla çözdü. Lütfen kullandığınız kodun bir macununu, bir CSV'ye dönüştürdüğünüz bir dizi ve dışa aktarılan dosyanın bir kopyasını gönderebilir misiniz?
Tim Groeneveld

2
Bu çözüm, Mac ve Windows'ta benim için UTF8 sorununu da çözdü. Ayrıca , CSV dosyasıyla sep=;veya sep=,CSV dosyasına bir satır eklemenin Excel'e CSV'nin nasıl ayrıldığını ve sütunların yeniden doğru şekilde oluşturulacağını söylediğini buldum .
Luc Wollants

5
Ben sadece BOM olarak dize başladı, sonra başka bir satırda "sep=,\n", daha sonra başka bir satırda veri ekledi eğer şeyler bozuk çıktı bulundu . Hepsini bir satırda ( $csv = chr(255) . chr(254) /* BOM */ . "sep=,\n" . mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');) yaptım işler iyi . Mac'te artık her şey harika görünüyor. Test edecek Windows'um yok.
tremby

2
Benim için tamamen işe yarayan tek şey. Microsoft'un tutarsızlığı beni şaşırtmaktan asla vazgeçmez. Normal bir csv dosyasını kaydetmek sınırlayıcı olarak "," kullanır, ancak bir Malzeme Listesi varsa "\ t" kullanarak herhangi bir nedenle kaydeder. .Csv dosyasındaki C "COMMA" dammit anlamına gelir. Bunu yapmak gerçekten zor değil.
Phil

288

Aynı (veya benzeri) sorunum var.

Benim durumumda, çıktıya bir Malzeme Listesi eklersem, çalışır:

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

Bunun oldukça çirkin bir hack olduğuna inanıyorum, ama en azından Excel 2007 Windows için benim için çalıştı. Mac üzerinde çalışacağından emin değilim.


10
Çirkin, ama süper yararlı. Teşekkür ederim.
abelito

7
Maalesef OS X'te bu işe yaramayacağından eminim. Sanırım içe
aktardığınızda

2
Doğru. En azından, yukarıdaki örnekte olduğu gibi bir Malzeme Listesini hazırlamayı denedim, ancak aslında başlangıçta bazı korkak karakterler gösterdi ve özel karakterleri yanlış göstermeye devam etti (Excel 2011'de test edildi). Bu, tüm ayarlarda benim için en iyi sonuç verdi: stackoverflow.com/a/1648671/1005334 (PHP kullanarak).
kasimir

4
Bu soru hakkında uyarılar almaya devam ediyorum, çünkü görünüşe göre pek çok insan karşısına çıkıyor. Keşke bunu doğru olarak işaretleyebilseydim, çünkü çok oy verildi. Ne yazık ki, sonunda bu çözümü denedim (bu projeyi uzun zaman önce terk ettim) ve Mac için Excel 2008'de işe yaramıyor. Senin için çalýţtýđýma sevindim. Çözümü iptal ettim. Ancak Excel for Mac 2008 sorununu çözmez. Mac'te kimse şans varsa, kesinlikle bana (ve görünüşe göre herkese ) bildirin.
Ben Saufley

Güzel bir MSV Starter 2010 CSV dosyası çıktı çalışır. Çok teşekkürler!
Jamie Dexter

32

İşte nasıl yaptım (csv dosyasını indirmek için tarayıcı isteminde bulunur):

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();

Mac'te boşluk çubuğuna bastığınızda CSV önizlemesinde UTF8 kodlama sorununu düzelten tek şey ... ancak Excel Mac 2008'de değil ... neden bilmiyorum


1
Kodun UTF-8 BOM satırı xls ihracat ile günümü kurtarmak
Mladen Janjetovic

6
Bu yazıyla karşılaştığımda doğrudan tarayıcıya utf8 olarak çıkış yapmanın bir yolunu arıyordum, İşte BOM ve ikili aktarım başlığı için bu gönderiye kredi veren çözümüm. $outstream = fopen( "php://output", 'w' ); fputs( $outstream, "\xEF\xBB\xBF" ); foreach ( $export as $fields ) { fputcsv( $outstream, $fields ); } fclose( $outstream );
fyrye

Yazım hatası - ikiliyi kaldırın )).
sitilge

22

Ben sadece aynı sorunu ele aldım ve iki çözüm buldum.

  1. Bpeterson76 tarafından önerildiği gibi PHPExcel sınıfını kullanın .

    • Bu sınıfı kullanarak en yaygın uyumlu dosyayı oluşturur, Excel 2008 Mac, Excel 2007 Windows ve Google Dokümanlar'da iyi açılan UTF-8 kodlu verilerden bir dosya oluşturabildim.
    • PHPExcel kullanmanın en büyük sorunu, yavaş olması ve çok fazla bellek kullanmasıdır, bu da makul büyüklükteki dosyalar için bir sorun değildir, ancak Excel / CSV dosyanızda yüzlerce veya binlerce satır varsa, bu kütüphane kullanılamaz hale gelir .
    • İşte bazı TSV verilerini alıp bir Excel dosyasını tarayıcıya gönderen bir PHP yöntemi, Excel5 Writer kullandığını, yani dosyanın Excel'in eski sürümleriyle uyumlu olması gerektiğini unutmayın, ancak artık herhangi bir erişimim yok, bu yüzden onları test edemiyorum.

      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. PHPExcel ile ilgili verimlilik sorunları nedeniyle, UTF-8 ve Excel uyumlu bir CSV veya TSV dosyasının nasıl oluşturulacağını da bulmak zorundaydım.

    • Gelebileceğim en iyi şey, Excel 2008 Mac ve Excel 2007 PC ile uyumlu bir dosyaydı, ancak uygulamam için yeterince iyi olan Google Dokümanlar değil.
    • Burada çözümü buldum , özellikle bu yanıtı , ancak kabul edilen yanıtı , sorunu açıkladığı için de okumalısınız .
    • İşte kullandığım PHP kodu, tsv verileri (virgül yerine ayırıcı olarak sekmeler) kullanıyorum unutmayın:

      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;

Windows-7 Excel 2007'de aynı sorunla karşı karşıyayım ve tüm önerileri denedim ama başarısız oldu :(
PHP Ferrari

UTF-16LE çözümü işe yarayan çözümdür. Tsv'yi doğru biçimlendirmeniz gerektiğini ve bunun tsc olması gerektiğini unutmayın, bu nedenle sekmeyle ayrılmış, virgülle ayrılmış değil. Ayrıca bkz. Marc'ın gönderisi: stackoverflow.com/a/1648671/1697370
Ellert van Koperen

17

Aynı sorunu yaşıyordum ve aşağıdaki gibi çözüldü:

    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();

13

Excel, UTF-8'i desteklemez. UTF-8 metninizi UCS-2LE'ye kodlamanız gerekir.

mb_convert_encoding($output, 'UCS-2LE', 'UTF-8');

3
Var olan her karakteri kapsayan, yukarıda önerildiği gibi UTF-16LE'yi daha iyi kullanın.
Ellert van Koperen

Bu mb_convert_encoding iyi çalışıyor ve ihraç XLS dosyamdaki aksanları doğru gösteren fark ettim. UTF-8 ile çalışmak için ayarlanmış mysql varsayılan yapılandırma ve apache + php var
Junior Mayhé

10

Benim durumumda aşağıdaki Excel'de doğru görüntülenen UTF-8 karakterleri ile CSV dosyası yapmak çok güzel çalışıyor.

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

0xEF 0xBB 0xBFBOM başlığı Excel doğru kodlamayı bildireceğiz.


1
Senin için büyük kardeşim <3
Adrien G

fprintf($out, chr(0xEF).chr(0xBB).chr(0xBF));<- tam da ihtiyacım olan buydu. Mucizevi şekilde çalışır.
Alex

8

Bunu takip etmek için:

Sorunun Mac'teki Excel ile ilgili olduğu anlaşılıyor. Dosyaları bu şekilde oluşturmuyorum, çünkü Excel'den CSV'ler oluşturmak bile onları bozuyor . CSV olarak kaydediyorum ve yeniden içe aktarıyorum ve tüm karakterler berbat durumda.

Yani… bunun doğru bir cevabı yok gibi görünüyor. Tüm önerileriniz için teşekkürler.

Okuduğum her şeyden, @Daniel Magliola'nın BOM hakkındaki önerisinin muhtemelen başka bir bilgisayar için en iyi cevap olacağını söyleyebilirim. Ama yine de sorunumu çözmüyor.


UTF8 desteği Mac ve Windows arasında tutarsız olduğundan, en iyi seçenek farklı bir kodlama kullanmaktır. Ben cp1252 genellikle Microsoft şeyler ile iyi oynuyor buldum. en.wikipedia.org/wiki/Windows-1252
s29

1
Ben, bu sorunun doğru cevabı var :) Bak benim!
Tim Groeneveld

7

Bu hem Windows hem de Mac OS için Excel'de iyi çalışıyor.

Excel'de aksan, kiril harfleri, yunan harfi ve para birimi simgeleri içeren karakterleri göstermeyen sorunları düzeltin.

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;
}

bu çözüm, Google E-Tablolar için de ihracat yapmamı sağladı (bazıları başarısız oldu)
Cafn

6

CSV Dosyası menüsü bir Bayt Sıralaması İşareti içerir.

Veya önerildiği gibi ve geçici çözüm HTTP gövdesiyle yankılanıyor


5

Ekle:

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

Veya:

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

Herhangi bir içeriği CSV dosyasına yazmadan önce.

Misal:

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

4

UTF8 kodlaması Excel ile iyi oynamadığı için. Düğmesini kullanarak verileri başka bir kodlama türüne dönüştürebilirsiniz iconv().

Örneğin

iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $value),

Excel Mac 2011
Christer Fernstrom

3

Utf-8 kodlu metni kullanarak dönüştürmek mb_convert_encodinggerekli değildir. Orijinal içeriğin önüne üç karakter eklemeniz yeterlidir:

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

Benim için bu, csv dosyalarındaki özel karakterler sorununu çözdü.


Inanılmaz; En az 10 başka çözüm denedim ve UTF-8 BOM ile birleştirildiğinde benim için tek çözüm bu gibi görünüyor fputs.
kaarto

2

Araştırdığım ve UTF-8'in MAC ve Windows üzerinde iyi çalışmadığını bulduğumdan, Windows-1252 ile denedim, her ikisini de iyi destekliyor, ancak ubuntu'da kodlama türünü seçmelisiniz. İşte kodum$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

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;
}

2
Genellikle, kodun ne yapmak istediği ve başkalarını tanıtmadan sorunu neden çözdüğüne dair bir açıklama içeriyorsa, cevaplar çok daha yararlıdır.
Tim Diekmann

1

Excel'in kendisi için çıktı almaya ne dersiniz? Bu, sunucu tarafında XLS dosyaları oluşturmanıza izin veren mükemmel bir sınıftır . Ben sık sık csv "anlayamaz" müşteriler için kullanın ve şimdiye kadar hiç şikayet yoktu. Ayrıca csv'nin yapmayacağı bazı ekstra biçimlendirmelere (gölgeleme, satır yükseklikleri, hesaplamalar, vb.) İzin verir.


Phpexcel'in fazla miktarda veriyle ilgili sorunları olduğunu unutmayın.
Ellert van Koperen

1

CSV String'inizi iconv ile dönüştürebilirsiniz . Örneğin:

$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) );

Büyük örnek metinler;)
ngeek

1

"Windows-1252" kodlamasını kullanmalısınız.

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

Belki dizelerinizi dönüştürmelisiniz:

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

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

1

Dışa aktarmadan önce dosyaya 3 bayt ekleyebilirsiniz, bu benim için çalışır. Bu sistemi yapmadan önce yalnızca Windows ve HP-UX'te çalışır, ancak Linux'ta başarısız olur.

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 );

Dosyanın başlangıcında bir UTF-8 BOM (3 byte, hex EF BB BF) var. Aksi takdirde Excel, verileri utf-8 yerine yerel ayarınızın varsayılan kodlamasına (örn. Cp1252) göre yorumlar.

Excel için CSV dosyası oluşturma, bir değerin içinde yeni satırın olması


1

Mac'liyim, benim durumumda sadece ayırıcıyı belirtmek "sep=;\n"ve dosyayı UTF-16LE'de şöyle kodlamak zorunda kaldım :

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

1

Benim için yukarıdaki çözümlerin hiçbiri işe yaramadı. Aşağıda sorunu çözmek için yaptım: PHP kodunda bu işlevi kullanarak değeri değiştirin:

$value = utf8_encode($value);

Bu çıktı bir excel sayfasında düzgün değer verir.


0

Verileri içe aktaran bir Excel VBA yordamı olduğunda da aynı sorunu yaşadım. CSV düz metin biçimi olduğundan, verileri wordpad gibi basit bir dosya düzenleyicide programlı olarak açarak ve unicode metin olarak yeniden kaydederek veya oradan panoya kopyalayıp Excel'e yapıştırarak bunun etrafında çalışıyordum. Excel otomatik olarak CSV'yi hücrelere ayrıştırmazsa, bu yerleşik "Sütunlara Metin" özelliği kullanılarak kolayca giderilebilir.


Bunu denedim! Ancak zaten unicode metin olarak kodlanmıştır… unicode metin olarak kaydetmek hiçbir şeyi değiştirmez. Tüm özel karakterleri yanlış yorumlamadan düz metin olarak nasıl kaydederim?
Ben Saufley

Bence "Unicode metni olarak kaydedelim", Alain "UTF-16LE" anlamına gelebilir. Windows sık sık (ne yazık ki) önde gelen BOM ile yanlış UTF-16LE veya UTF-16LE başvurmak için "Unicode" kullanır. Not Defteri'nin Dosya -> Kaydet iletişim kutusu bu şekilde "Unicode" kullanır.
Thanatos

0

Bir .txt dosyası olarak kaydettiğinizde ve excel'de virgülle ayırıcı olarak açtığınızda sorun devam ediyor mu?

Sorun hiç kodlama olmayabilir, sadece excel standartlarına göre dosyanın mükemmel bir CSV olmaması olabilir.


Bildiğim kadarıyla CSV formatı gayet iyi. TextEdit'te "mükemmel" bir CSV yapabilirim, sorun değil, hatta bir txt'yi csv olarak yeniden adlandırabilirim, bu yüzden gizli bir şey eksik değil - CSV'ler sadece metin dosyalarıdır. Ayrıca, biçimlendirme Excel'de mükemmel, sadece kırılan özel karakterler. Ama her ihtimale karşı, önerinizi denedim ve ne yazık ki aynı sorunları üretiyor.
Ben Saufley

"WTF düşünüyorlardı" bölümünden: Microsoft'a göre doğru alan ayırıcısının yerel ayara bağlı olduğunu unutmayın. 'Virgülle ayrılmış' bir dosya bu nedenle alanların bazı yerlerde noktalı virgülle ayrılmış olmasını gerektirebilir - ve OpenOffice'i önermek dışında yapabileceğiniz hiçbir şey yoktur
djn

bu oldukça çılgın - maalesef alanları sınırlamakta zorlanmıyorum. Sadece bu özel karakterlerle sorun yaşıyorum.
Ben Saufley

0

Bu yazı oldukça eski, ama saatlerce denedikten sonra çözümümü paylaşmak istiyorum ... belki birisinin Excel ve Mac ve CSV ile uğraşmasına yardımcı olur ve bu tehdit üzerinde tökezler. Dinamik olarak Excel Kullanıcıları göz önünde bulundurularak bir Veritabanı çıktı olarak bir csv üretiyorum. (Malzeme Listesi ile UTF-8)

Iconv´s çok denedim ama Alman Excel'leri Mac Excel 2004'te çalıştıramadım. Bir çözüm: PHPExcel. Harika ama projem için biraz fazla. Benim için işe yarayan csv dosyası oluşturmak ve bu csv dosyasını bu PHPsnippet: csv2xls ile xls'ye dönüştürmektir . sonuç xls excel german umlauts (ä, ö, Ü, ...) ile çalışır.


0

Bu başlıkları denedim ve özel karakterli CSV dosyasını doğru bir şekilde içe aktarmak için Windows 2013'te Excel 2013'ü aldım. Bayt Düzeni İşareti (BOM), çalışmasını sağlayan son anahtardı.

    başlık ('İçerik Kodlama: UTF-8');
    başlık ('İçerik türü: metin / csv; charset = UTF-8');
    header ("İçerik-eğilim: ek; dosyaadı = dosyaadı.csv");
    başlık ("Pragma: genel");
    başlık ("Sona erme tarihi: 0");
    echo "\ xEF \ xBB \ xBF"; // UTF-8 Malzeme Listesi


Evet, bu doğru, Windows için Excel'de düzgün çalışacak, ancak cevabımda açıklandığı gibi, OS X için Excel'de çalışmaz.
Tim Groeneveld

0

Aksi takdirde şunları yapabilirsiniz:

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);

0

Mac Excel 2008 için KOLAY çözüm: Bu soo ile birçok kez mücadele ettim, ama işte benim kolay çözümüm: UTF-8 karakterlerinizi doğru bir şekilde açması gereken Textwrangler'daki .csv dosyasını açın. Şimdi alt durum çubuğunda "Unicode (UTF-8)" yerine "Western (ISO Latin 1)" olarak dosya biçimini değiştirin ve dosyayı kaydedin. Şimdi Mac Excel 2008'inize gidin ve Dosya> İçe Aktar> csv'yi seçin> Dosyanızı bulun> Dosya menşeinde "Windows (ANSI)" seçin ve UTF-8 karakterlerinin doğru şekilde gösterildiğini seçin. En azından benim için yapar ...


0

Bunu kullanıyorum ve işe yarıyor

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;

0

#out PHP'de Excel'in düzgün okuyacağı bir UTF-8 CSV girin.

//Use tab as field separator   
$sep  = "\t";  
$eol  = "\n";    
$fputcsv  =  count($headings) ? '"'. implode('"'.$sep.'"', $headings).'"'.$eol : '';

Kişi başına bir cevap yeterlidir. İleride cevabınıza istediğiniz zaman bilgi ekleyebileceğinizi unutmayın, 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"));

Bu soru nasıl dönüştürüleceğini sormaz, nasıl çıktı alınacağını sorar. UTF-16'da ortaya çıkan bu katkının ilgili kısmı, Seçilen Cevapta zaten katkıda bulunmaktadır .
Ben Saufley

@BenSaufley Peki ama sorunun problemini 2 basit kod satırı ile
çözüyor

Soru zaten çözüldü ve daha ayrıntılı olarak açıklandı.
Ben Saufley
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.