मैं PHP में UTF-8 CSV का उत्पादन कैसे कर सकता हूं जिसे एक्सेल ठीक से पढ़ेगा?


191

मुझे यह बहुत ही साधारण बात लगी है कि बस कुछ सामान CSV फॉर्मेट में आउटपुट करते हैं, लेकिन यह UTF-8 है। मैं इस फाइल को TextEdit या TextMate या Dreamweaver में खोलता हूं और यह UTF-8 वर्णों को ठीक से प्रदर्शित करता है, लेकिन अगर मैं इसे Excel में खोलता हूं तो यह इसके बजाय मूर्खतापूर्ण तरीके से कर रहा है। मैंने अपने दस्तावेज़ के मुख्य भाग में यह पाया है:

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

ऐसा लगता है कि एक्सेल (मैक, 2008) को छोड़कर यह सभी वांछित प्रभाव है, इसे ठीक से आयात नहीं करना चाहता। एक्सेल में मेरे लिए "UTF-8 के रूप में खोलने" या कुछ भी करने के लिए कोई विकल्प नहीं है, इसलिए ... मैं थोड़ा परेशान हो रहा हूं।

मैं बहुत से लोगों को एक ही समस्या होने के बावजूद, इसका कहीं भी कोई स्पष्ट समाधान नहीं ढूंढ सकता हूं। मुझे जो चीज सबसे ज्यादा दिखाई देती है वह है BOM को शामिल करना, लेकिन मैं यह नहीं समझ सकता कि ऐसा कैसे किया जाए। जैसा कि आप ऊपर देख सकते हैं कि मैं सिर्फ echoइस डेटा को ले रहा हूं, मैं कोई फाइल नहीं लिख रहा हूं। मैं यह कर सकता हूं कि अगर मुझे जरूरत है, तो मैं सिर्फ इसलिए नहीं हूं क्योंकि इस समय इसके लिए कोई आवश्यकता नहीं है। कोई मदद?

अद्यतन: मैंने BOM को प्रतिध्वनित करने की कोशिश की echo pack("CCC", 0xef, 0xbb, 0xbf);जिसके रूप में मैंने बस एक साइट से खींच लिया जो BOM का पता लगाने की कोशिश कर रहा था। लेकिन एक्सेल आयात करते समय उन तीन पात्रों को बहुत पहले सेल में जोड़ देता है, और फिर भी विशेष पात्रों को गड़बड़ कर देता है।


2
Excel आने वाले फ़ाइल के वर्ण सेट को समायोजित करने का विकल्प प्रदान नहीं करता है? क्या आप इसके बारे में 100% सुनिश्चित हैं? मेरे पास एक कॉपी काम नहीं है इसलिए मैं कोशिश नहीं कर सकता, लेकिन मुझे लगता है कि कहीं न कहीं एक ड्रॉप डाउन बॉक्स होना चाहिए।
पकाका

यह एक मैक पर एक्सेल है - यह पीसी पर एक्सेल की तुलना में अधिक सीमित लगता है। ओपन डायलॉग में कोई भी ड्रॉपडाउन नहीं है, जिसके आगे किसी भी प्रकार की फाइल खोलने में सक्षम है। मैंने हर जगह देखा है। अगर यह वहाँ है, यह अस्पष्ट है। मैं कहूंगा 98% यकीन है।
बेन सूफले 18

Microsoft कार्यालय या ओपनऑफ़िस?
अंजुल डेस

Microsoft इस संबंध में बेहतर है, ओपनऑफ़िस को चार्ट का पता लगाने के लिए कोई तरीका नहीं है (जो मैंने पाया है), यहां तक ​​कि बीओएम भी नहीं। इसे रफू करें।
Ciantic

मैक के लिए Microsoft Excel 2008 पर BOM का कोई प्रभाव नहीं है।
बेन सौफले

जवाबों:


134

Microsoft समर्थन इंजीनियर को उद्धृत करने के लिए ,

मैक के लिए एक्सेल वर्तमान में UTF-8 का समर्थन नहीं करता है

अद्यतन, 2017 : यह Office 2016 से पहले मैक के लिए Microsoft Excel के सभी संस्करणों के लिए सही है । नए संस्करण (Office 365 से) अब UTF-8 का समर्थन करते हैं।

UTF-8 कंटेंट को आउटपुट करने के लिए कि Windows और OS X दोनों पर एक्सेल सफलतापूर्वक पढ़ा जा सकेगा, इसके लिए आपको दो काम करने होंगे:

  1. सुनिश्चित करें कि आप अपने UTF-8 CSV पाठ को UTF-16LE में परिवर्तित कर दें

    mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
  2. सुनिश्चित करें कि आप फ़ाइल की शुरुआत में UTF-16LE बाइट ऑर्डर मार्क जोड़ते हैं

    chr(255) . chr(254)

अगली समस्या जो केवल ओएस एक्स (लेकिन विंडोज नहीं ) पर एक्सेल के साथ दिखाई देती है, जब कॉमा अलग मूल्यों के साथ एक सीएसवी फ़ाइल को देखते हुए, एक्सेल पहली पंक्ति में अल्पविराम के साथ केवल एक पंक्ति और सभी पाठ के साथ पंक्तियों को प्रस्तुत करेगा।

इससे बचने का तरीका है कि आप अपने अलग मूल्य के रूप में टैब का उपयोग करें।

मैंने इस फ़ंक्शन का उपयोग PHP टिप्पणियों (कॉमा के बजाय टैब "\ t" का उपयोग करके) किया और इसने ओएस एक्स और विंडोज एक्सेल पर पूरी तरह से काम किया।

ध्यान दें कि एक पंक्ति के अंत के रूप में एक खाली कॉलम के साथ एक समस्या को ठीक करने के लिए, जो मुझे कोड की लाइन को बदलना होगा जो कहता है:

    $field_cnt = count($fields);

सेवा

    $field_cnt = count($fields)-1;

जैसा कि इस पृष्ठ की कुछ अन्य टिप्पणियों में कहा गया है, अन्य स्प्रेडशीट ऐप जैसे ओपनऑफ़िस कैल्क, ऐप्पल के अपने नंबर और Google डॉक की स्प्रेडशीट में कॉमा के साथ UTF-8 फ़ाइलों के साथ कोई समस्या नहीं है।

एक्सेल में यूनिकोड सीएसवी फ़ाइलों के लिए क्या काम करता है और क्या नहीं करता है , इस प्रश्न में तालिका देखें


एक साइड नोट के रूप में, मैं यह जोड़ सकता हूं कि यदि आप संगीतकार का उपयोग कर रहे हैं , तो आपको League\Csvअपनी आवश्यकताओं को जोड़कर देखना चाहिए। League\Csvहै CSV फ़ाइलों के निर्माण के लिए वास्तव में एक अच्छा एपीआई

League\CsvCSV फ़ाइलों को बनाने की इस पद्धति का उपयोग करने के लिए , इस उदाहरण को देखें


1
मुझे बेवकूफ कहें, लेकिन मैं यह काम नहीं कर सकता। मैंने mb_convert_encoding फ़ंक्शन का उपयोग करके अपना डेटा परिवर्तित किया और फ़ाइल सामग्री से पहले BOM को आउटपुट किया, लेकिन मुझे एक्सेल में फ़ाइल खोलने पर मुझे केवल चीनी वर्णों की एक ही पंक्ति मिलती है। मैं अभी भी टैब के बजाय कॉमा का उपयोग कर रहा हूं, लेकिन संभवत: वह कारण नहीं होना चाहिए जो मुझे दिखाई दे रहा है।
जॉन रिक्स

@JohnRix अजीब बात है। इस कोड ने शाब्दिक रूप से CSV फ़ाइलों को निर्यात किए जाने वाले हर मुद्दे को हल किया है - आयातकों के अपवाद के साथ जो केवल कॉमा स्वीकार करेंगे। क्या आप कृपया मेरे द्वारा उपयोग किए जा रहे कोड का एक पेस्टबिन भेज सकते हैं, साथ ही एक सरणी के साथ जिसे आप CSV में बदल रहे हैं और निर्यात की गई फ़ाइल की एक प्रति?
टिम ग्रैनेवेल्ड

2
इस समाधान ने मैक और विंडोज पर मेरे लिए UTF8 मुद्दे को भी हल किया। मैंने यह भी पाया कि CSV फ़ाइल के साथ sep=;या लाइन जोड़ने से sep=,एक्सेल बताता है कि CSV कैसे अलग है और कॉलम फिर से सही तरीके से बनाए जाएंगे।
ल्यूक वोलेन्ट्स

5
मैंने पाया कि चीजें गड़बड़ हो गई हैं यदि मैंने स्ट्रिंग को केवल बीओएम के रूप में शुरू किया, तो दूसरी पंक्ति में जोड़ा गया "sep=,\n", फिर दूसरी पंक्ति में डेटा जोड़ा गया। अगर मैं यह सब एक लाइन ( $csv = chr(255) . chr(254) /* BOM */ . "sep=,\n" . mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');) में करता तो चीजें ठीक थीं । मैक पर अब सब कुछ बहुत अच्छा लग रहा है। मेरे पास परीक्षण करने के लिए विंडोज नहीं है।
कांपना

2
केवल एक चीज जो मेरे लिए पूरी तरह से काम करती है। Microsoft की असंगतता मुझे विस्मित करने के लिए कभी नहीं रोकती है। एक सामान्य सीएसएसवी फ़ाइल का उपयोग करके "", सीमांकक के रूप में उपयोग किया जाता है, लेकिन अगर एक बीओएम होता है तो यह किसी कारण से "टी" का उपयोग करके बचाता है। C .csv का अर्थ "COMMA" से है। यह वास्तव में करना मुश्किल नहीं है।
फिल

288

मुझे एक ही (या समान) समस्या है।

मेरे मामले में, अगर मैं आउटपुट में BOM जोड़ता हूं, तो यह काम करता है:

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

मेरा मानना ​​है कि यह एक बहुत बदसूरत हैक है, लेकिन इसने मेरे लिए काम किया, कम से कम एक्सेल 2007 विंडोज के लिए। यकीन नहीं है कि यह मैक पर काम करेगा।


10
बदसूरत, लेकिन सुपर सहायक। धन्यवाद।
अबेलिटो

7
मुझे पूरा यकीन है कि यह OS X पर अच्छा काम नहीं करता है, दुर्भाग्य से। मुझे लगता है कि जब आप आयात करते हैं तो यह वास्तव में BOM प्रदर्शित कर सकता है (चेतावनी: धुंधली यादें।)
davidtbernal

2
यह सही है। कम से कम, मैंने ऊपर के उदाहरण की तरह, BOM के साथ प्रीपेडिंग करने की कोशिश की है, लेकिन यह वास्तव में शुरुआत में कुछ फंकी कैरेक्टर दिखाता है और विशेष वर्णों को गलत (एक्सेल 2011 में परीक्षण किया गया) प्रदर्शित करता रहा। यह मेरे लिए सभी सेटिंग्स में सबसे अच्छा काम कर रहा था: stackoverflow.com/a/1648671/1005334 (PHP का उपयोग करके)।
कासिमिर

4
मैं इस सवाल पर अलर्ट प्राप्त करता रहता हूं, क्योंकि जाहिर तौर पर बहुत सारे अन्य लोग इसके पार जाते हैं। काश, मैं इसे सही के रूप में चिह्नित कर सकता, क्योंकि यह बहुत अधिक उत्कीर्ण है। दुर्भाग्य से, मैंने आखिरकार इस समाधान को एक शॉट दिया (उस परियोजना को बहुत पहले छोड़ दिया) और यह मेरे लिए एक्सेल 2008 में मैक के लिए काम नहीं कर रहा है। खुशी है कि यह आपके लिए काम कर रहा है। मैंने हल निकाल लिया है। लेकिन यह मैक 2008 समस्या के लिए एक्सेल को हल नहीं करता है। अगर किसी को मैक पर भाग्य है, तो मुझे निश्चित रूप से (और स्पष्ट रूप से सभी को ) बताएं।
बेन सूफले

एमएस एक्सेल स्टार्टर 2010 के लिए सीएसवी फ़ाइल को खूबसूरती से तैयार करने का काम करता है। बहुत बहुत धन्यवाद!
जेमी डेक्सटर

32

यहां बताया गया है कि मैंने ऐसा कैसे किया (यह ब्राउज़र को सीएसवी फ़ाइल डाउनलोड करने के लिए संकेत देना है):

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

जब आप मैक पर स्पेस बार मारते हैं तो केवल यही बात CSF पूर्वावलोकन में UTF8 एन्कोडिंग समस्या को ठीक करती है .. लेकिन Excel Mac 2008 में नहीं ... पता नहीं क्या


1
UTF-8 कोड की बीओएम लाइन xls को निर्यात करने के साथ मेरा दिन
बचाती है

6
मैं utf8 के रूप में सीधे ब्राउज़र में आउटपुट के लिए एक रास्ता खोज रहा था, जब मैं इस पोस्ट पर आया था, यहाँ BOM और बाइनरी ट्रांसफर हेडर के लिए इस पोस्ट के क्रेडिट के साथ मेरा समाधान है। $outstream = fopen( "php://output", 'w' ); fputs( $outstream, "\xEF\xBB\xBF" ); foreach ( $export as $fields ) { fputcsv( $outstream, $fields ); } fclose( $outstream );
fyrye

टाइपो - डबल को हटा दें ))
8

22

मैं बस एक ही समस्या से निपटता हूं, और दो समाधानों के साथ आया हूं।

  1. BPEerson76 द्वारा सुझाए अनुसार PHPExcel वर्ग का उपयोग करें ।

    • इस वर्ग का उपयोग सबसे व्यापक रूप से संगत फ़ाइल उत्पन्न करता है, मैं UTF-8 एन्कोडेड डेटा से एक फ़ाइल उत्पन्न करने में सक्षम था जो Excel 2008 मैक, एक्सेल 2007 विंडोज और Google डॉक्स में ठीक खोला गया था।
    • PHPExcel का उपयोग करने के साथ सबसे बड़ी समस्या यह है कि यह धीमा है और बहुत सारी मेमोरी का उपयोग करता है, जो उचित आकार की फ़ाइलों के लिए कोई समस्या नहीं है, लेकिन अगर आपकी Excel / CSV फ़ाइल में सैकड़ों या हजारों पंक्तियाँ हैं, तो यह लाइब्रेरी अनुपयोगी हो जाती है
    • यहाँ एक PHP विधि है जो कुछ TSV डेटा लेगी और ब्राउज़र के लिए एक्सेल फ़ाइल का उत्पादन करेगी, ध्यान दें कि यह Excel5 राइटर का उपयोग करता है, जिसका अर्थ है कि फ़ाइल एक्सेल के पुराने संस्करणों के साथ संगत होनी चाहिए, लेकिन मुझे अब किसी भी तक पहुंच नहीं है, इसलिए मैं उनका परीक्षण नहीं कर सकता।

      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 के साथ दक्षता के मुद्दों के कारण, मुझे यह भी पता लगाना था कि UTF-8 और Excel संगत CSV या TSV फ़ाइल कैसे जनरेट करें।

    • सबसे अच्छा मैं साथ आ सकता था एक फ़ाइल थी जो एक्सेल 2008 मैक, और एक्सेल 2007 पीसी के साथ संगत थी, लेकिन Google डॉक्स नहीं, जो मेरे आवेदन के लिए पर्याप्त है।
    • मैं समाधान नहीं मिला यहाँ , विशेष रूप से, इस सवाल का जवाब है, लेकिन आप भी पढ़ना चाहिए स्वीकार किए जाते हैं जवाब के रूप में यह समस्या बताते हैं।
    • यहाँ पर मेरे द्वारा उपयोग किया गया PHP कोड है, ध्यान दें कि मैं tsv डेटा का उपयोग कर रहा हूं (अल्पविराम के बजाय परिसीमन के रूप में टैब):

      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;

मैं विंडोज -7 एक्सेल 2007 पर एक ही मुद्दे का सामना कर रहा हूं और सभी सुझावों की कोशिश की, लेकिन असफल रहा :(
PHP फेरारी

UTF-16LE समाधान वह है जिसने काम किया है। ध्यान दें कि आपको tsv को सही ढंग से प्रारूपित करना है, और इसे tsc करना है, इसलिए टैब सीमांकित है, अल्पविराम सीमांकित नहीं है। मार्क की पोस्ट यहाँ भी देखें: stackoverflow.com/a/1648671/1697370
Ellert van Koperen

16

मैं एक ही मुद्दा रहा था और यह नीचे की तरह हल किया गया था:

    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 का समर्थन नहीं करता है। आपको अपने UTF-8 टेक्स्ट को UCS-2LE में एनकोड करना होगा।

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

3
उपर्युक्त सुझाव के अनुसार बेहतर उपयोग करें यूटीएफ -16 ईएल, जो अस्तित्व में हर चरित्र को कवर करता है।
एलर्ट वैन कोपरन

मैंने देखा है कि यह mb_convert_encoding ठीक काम कर रहा है और अपने निर्यातित XLS फ़ाइल में सही ढंग से डायक्ट्रीक्स दिखा रहा है। मेरे पास mysql डिफ़ॉल्ट कॉन्फ़िगरेशन और एपाचे + php है, जो utf-8 के साथ काम करने के लिए तैयार है
मई को जूनियर मेहे

10

मेरे मामले में निम्नलिखित एक्सेल में सही ढंग से प्रदर्शित किए गए UTF-8 वर्णों के साथ CSV फ़ाइल बनाने के लिए बहुत अच्छा काम करता है।

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

0xEF 0xBB 0xBFबीओएम हैडर एक्सेल सही एन्कोडिंग अवगत कराएंगे।


1
तुम्हारे लिए बड़ा भाई <3
जी

fprintf($out, chr(0xEF).chr(0xBB).chr(0xBF));<- यह वही है जो मुझे चाहिए था। यह एक सम्मोहन की तरह काम करता है।
एलेक्स

8

इस पर अनुसरण करने के लिए:

ऐसा प्रतीत होता है कि समस्या मैक पर एक्सेल के साथ है। यह नहीं है कि मैं फ़ाइलों को कैसे बना रहा हूं, क्योंकि एक्सेल से सीएसवी उत्पन्न करना भी उन्हें तोड़ रहा है। मैं CSV, और reimport के रूप में सहेजता हूं, और सभी वर्ण गड़बड़ हो जाते हैं।

तो ... वहाँ इस के लिए एक सही जवाब प्रतीत नहीं होता है। सभी सुझावों के लिए शुक्रिया।

मैं कहूँगा कि मैंने जो कुछ भी पढ़ा है, @ डॉनी मैगलियोला का सुझाव बीओएम के बारे में है, वह शायद किसी अन्य कंप्यूटर के लिए सबसे अच्छा जवाब होगा। लेकिन यह अभी भी मेरी समस्या का समाधान नहीं करता है।


चूंकि मैक बनाम विंडोज में UTF8 समर्थन असंगत है, इसलिए सबसे अच्छा शर्त यह है कि पूरी तरह से अलग एन्कोडिंग का उपयोग किया जाए। मैंने पाया है कि cp1252 आम तौर पर Microsoft सामान के साथ अच्छा खेलता है। en.wikipedia.org/wiki/Windows-1252
s29

1
बेन, इस सवाल का एक सही जवाब है :) मेरा देखें!
टिम ग्रोएनवेल्ड

7

यह विंडोज और मैक ओएस दोनों के लिए एक्सेल में ठीक काम करता है।

एक्सेल में मुद्दों को ठीक करें जो कि डिक्टिटिक्स, सिरिलिक पत्र, ग्रीक अक्षर और मुद्रा प्रतीकों वाले पात्रों को प्रदर्शित नहीं कर रहे हैं।

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

इस समाधान ने मुझे Google शीट्स के लिए निर्यात कार्य करने की अनुमति दी (कुछ अन्य असफल)
कैफे

6

CSV फ़ाइल कस्तूरी में एक बाइट ऑर्डर मार्क शामिल है।

या जैसा कि सुझाव दिया गया है और वर्कअराउंड इसे HTTP बॉडी के साथ प्रतिध्वनित करता है


4

चूंकि UTF8 एन्कोडिंग एक्सेल के साथ अच्छा नहीं खेलती है। आप डेटा को दूसरे एन्कोडिंग प्रकार का उपयोग करके परिवर्तित कर सकते हैं iconv()

जैसे

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

यह एकमात्र समाधान था जिसने मेरे लिए एक्सेल मैक 2011 के साथ काम किया था
क्रिस्टर फ़र्नस्ट्रॉम

4

जोड़ें:

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

या:

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

CSV फ़ाइल में कोई भी सामग्री लिखने से पहले।

उदाहरण:

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

3

पहले से ही utf-8 एन्कोडेड पाठ का उपयोग करके परिवर्तित mb_convert_encodingकरने की आवश्यकता नहीं है। मूल सामग्री के सामने केवल तीन वर्ण जोड़ें:

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

मेरे लिए यह csv फ़ाइलों में विशेष वर्णों की समस्या को हल करता है।


अविश्वसनीय; मैंने कम से कम 10 अन्य समाधानों की कोशिश की और मेरे लिए एकमात्र समाधान यह एक प्रतीत होता है, जब यूटीएफ -8 बीओएम के माध्यम से संयुक्त होता है fputs
kaarto

2

जैसा कि मैंने जांच की और मैंने पाया कि UTF-8 मैक और विंडोज पर अच्छी तरह से काम नहीं कर रहा है, इसलिए मैंने विंडोज -1252 के साथ कोशिश की, यह उन दोनों पर अच्छी तरह से समर्थन करता है, लेकिन आपको उबंटू पर प्रकार के एन्कोडिंग का चयन करना होगा। यहाँ मेरा कोड है$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
आम तौर पर, उत्तर बहुत अधिक सहायक होते हैं यदि वे इस बात का स्पष्टीकरण शामिल करते हैं कि कोड क्या करने का इरादा है, और क्यों यह दूसरों को पेश किए बिना समस्या को हल करता है।
टिम डाइकमैन

1

एक्सेल के लिए सिर्फ आउटपुट के बारे में कैसे? यह एक उत्कृष्ट वर्ग है जो आपको XLS फाइल सर्वर-साइड जनरेट करने की अनुमति देता है। मैं इसे अक्सर उन ग्राहकों के लिए उपयोग करता हूं जो सीएसवी के "फिगर आउट" नहीं कर सकते हैं और अब तक कभी कोई शिकायत नहीं हुई है। यह कुछ अतिरिक्त स्वरूपण (छायांकन, पंक्तिबद्ध, गणना, आदि) की भी अनुमति देता है जो csv कभी नहीं करेगा।


विदित हो कि phpexcel में डेटा की मात्रा के साथ समस्याएँ हैं।
एलर्ट वैन कोपरन

1

आप अपने CSV स्ट्रिंग को आइकॉन से बदल सकते हैं । उदाहरण के लिए:

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

महान नमूना ग्रंथ;)
ngeek

1

आपको "Windows-1252" एन्कोडिंग का उपयोग करना होगा।

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

शायद आपको अपने तार बदलने होंगे:

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

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

1

आप निर्यात करने से पहले फ़ाइल को 3 बाइट्स संलग्न कर सकते हैं, यह मेरे लिए काम करता है। उस सिस्टम को करने से पहले केवल विंडोज और एचपी-एक्स में काम करते हैं लेकिन लिनक्स में असफल रहे।

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

फ़ाइल के प्रारंभ में UTF-8 BOM (3 बाइट्स, हेक्स EF BB BF) रखें। अन्यथा Excel utf-8 के बजाय आपके स्थान के डिफ़ॉल्ट एन्कोडिंग (जैसे cp1252) के अनुसार डेटा की व्याख्या करेगा

एक्सेल के लिए CSV फ़ाइल बनाना, एक वैल्यू के अंदर एक नई लाइन कैसे करें


1

मैं मैक पर हूँ, मेरे मामले में मुझे बस विभाजक को निर्दिष्ट करना था "sep=;\n"और इस तरह से फ़ाइल को UTF-16LE में एनकोड करना था:

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

1

मेरे लिए ऊपर दिए गए समाधान में से कोई भी काम नहीं किया। नीचे इस समस्या को हल करने के लिए मैंने क्या किया है: PHP कोड में इस फ़ंक्शन का उपयोग करके मूल्य को संशोधित करें:

$value = utf8_encode($value);

एक्सेल शीट में यह आउटपुट ठीक से वैल्यू करता है।


0

जब मैं एक्सेल VBA रूटीन था जो डेटा आयात करता था तो मुझे यही समस्या थी। चूँकि CSV एक सादा पाठ प्रारूप है, मैं वर्डपैड की तरह एक साधारण फ़ाइल संपादक में डेटा को खोलकर, और इसे यूनिकोड पाठ के रूप में पुन: सहेज कर, या इसे क्लिपबोर्ड पर कॉपी करके और इसे Excel में पेस्ट करके इसके चारों ओर काम कर रहा था। यदि एक्सेल स्वचालित रूप से CSV को कक्षों में पार्स नहीं करता है, तो इसे "टेक्स्ट टू कॉलम" फीचर में बनाया गया है।


मैंने कोशिश की है कि! लेकिन यह पहले से ही यूनिकोड टेक्स्ट के रूप में एन्कोडेड है ... इसे यूनिकोड टेक्स्ट के रूप में सहेजने से कुछ भी नहीं बदलता है। मैं इसे बिना किसी विशेष वर्ण की व्याख्या किए बिना इसे सादे पाठ के रूप में कैसे सहेजूंगा?
बेन सूफले

मुझे लगता है कि "इसे यूनिकोड पाठ के रूप में सहेजकर", एलेन का मतलब "यूटीएफ -16 ईएल" हो सकता है। विंडोज़ अक्सर (दुख की बात है) "यूनिकोड" का उपयोग गलत तरीके से यूटीएफ -16 ईएल या यूटीएफ -16 ईएल को एक प्रमुख एमओएम के साथ करने के लिए करता है। नोटपैड की फाइल -> इस तरह से डायलॉग "यूनिकोड" का उपयोग करता है।
थानाटोस

0

क्या समस्या तब भी होती है जब आप इसे एक .txt फ़ाइल के रूप में सहेजते हैं और वे इसे एक सीमांकक के रूप में अल्पविराम के साथ एक्सेल में खोलते हैं?

यह समस्या बिल्कुल भी एन्कोडिंग नहीं हो सकती है, यह सिर्फ यह हो सकता है कि एक्सेल मानकों के अनुसार फाइल सही CSV न हो।


जहां तक ​​मुझे पता है, सीएसवी फॉर्मेटिंग ठीक है। मैं TextEdit में एक "परिपूर्ण" CSV बना सकता हूं, कोई समस्या नहीं है, या यहां तक ​​कि एक tsv का नाम csv के रूप में भी बदल सकता है, इसलिए यह कुछ भी गुप्त नहीं गायब है - CSV केवल पाठ फ़ाइलें हैं। साथ ही, Excel में स्वरूपण बिल्कुल सही है, यह केवल विशेष वर्ण हैं जो तोड़ते हैं। लेकिन सिर्फ मामले में, मैंने आपके सुझाव की कोशिश की, और यह दुख की बात है कि वही समस्याएं पैदा कर रही हैं।
बेन सूफले

"डब्ल्यूटीएफ वे सोच रहे थे" विभाग से: जानते हैं कि माइक्रोसॉफ्ट के अनुसार सही क्षेत्र विभाजक स्थानीय-निर्भर है। एक 'अल्पविराम से अलग' फ़ाइल के लिए कुछ क्षेत्रों में अर्धविराम से अलग किए जाने वाले फ़ील्ड की आवश्यकता हो सकती है - और कुछ भी नहीं है जो आप कर सकते हैं सिवाय OpenOffice के सुझाव के
djn

वह बहुत पागल है - दुर्भाग्य से मुझे खेतों को ठीक से समझने में परेशानी नहीं हो रही है। मुझे बस इन विशेष पात्रों से परेशानी हो रही है।
बेन सौफले

0

यह पोस्ट काफी पुरानी है, लेकिन घंटों की कोशिश के बाद मैं अपना समाधान साझा करना चाहता हूं ... शायद यह एक्सेल और मैक और सीएसवी से निपटने में किसी की मदद करता है और इस खतरे से लड़ता है। मैं एक्सेल यूजर्स को ध्यान में रखते हुए डेटाबेस से आउटपुट के रूप में एक सीएसवी गतिशील रूप से उत्पन्न कर रहा हूं। (BOM के साथ UTF-8)

मैंने बहुत से आइकॉन की कोशिश की, लेकिन मैक एक्सेल 2004 में जर्मन umlauts काम नहीं कर सका। एक समाधान: PHPELcel। यह बहुत अच्छा है लेकिन मेरे प्रोजेक्ट के लिए थोड़ा बहुत। मेरे लिए क्या काम करता है सीएसवी फ़ाइल बना रहा है और इस सीएसवी फ़ाइल को इस PHPsnippet के साथ xls में परिवर्तित करें: csv2xls । परिणाम xls एक्सेल जर्मन umlauts (ä, ö, ..., ...) के साथ काम करता है।


0

मैंने सिर्फ इन हेडर को आज़माया और विशेष पात्रों के साथ CSV फ़ाइल को सही ढंग से आयात करने के लिए विंडोज 7 पीसी पर एक्सेल 2013 प्राप्त किया। बाइट ऑर्डर मार्क (BOM) अंतिम कुंजी थी जिसने इसे काम किया।

    हेडर ('सामग्री-एनकोडिंग: UTF-8');
    हेडर ('सामग्री-प्रकार: पाठ / सीएसवी; चारसेट = यूटीएफ -8');
    शीर्ष लेख ("सामग्री-स्वभाव: अनुलग्नक; फ़ाइल नाम = फ़ाइल नाम .csv");
    हेडर ("प्राग्मा: पब्लिक");
    शीर्ष लेख ("समाप्ति: 0");
    इको "\ xEF \ xBB \ xBF"; // UTF-8 BOM


हां, यह सही है, यह विंडोज के लिए एक्सेल में सही ढंग से काम करेगा, लेकिन जैसा कि मेरे उत्तर में बताया गया है, यह ओएस एक्स के लिए एक्सेल पर काम नहीं करेगा।
टिम ग्रोएनेल्ड

0

अन्यथा आप हो सकते हैं:

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

मैक एक्सेल 2008 के लिए आसान समाधान: मैंने इस सू के साथ कई बार संघर्ष किया, लेकिन यहां मेरा आसान समाधान था: टेक्स्टव्रांग्लर में .csv फ़ाइल खोलें जो आपके UTF-8 चार्ट को सही ढंग से खोलें। अब नीचे की स्थिति पट्टी में फ़ाइल प्रारूप को "यूनिकोड (UTF-8)" से "पश्चिमी (आईएसओ लैटिन 1)" में बदल दें और फ़ाइल को सहेजें। अब अपने मैक एक्सेल 2008 में जाएं और फ़ाइल> इम्पोर्ट> सिलेव का चयन करें> अपनी फाइल को ढूंढें> फाइल ओरिजिन में "विंडोज़ (एएनएसआई)" चुनें और यूटीएफ -8 चार्ट को सही तरीके से दिखा रहे हैं। कम से कम ये मेरे लिए करता है...


0

मैं इसका उपयोग करता हूं और यह काम करता है

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

PHP में #output UTF-8 CSV है जिसे एक्सेल ठीक से पढ़ेगा।

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

प्रति व्यक्ति एक उत्तर पर्याप्त है। भविष्य में याद रखें कि आप किसी भी समय अपने उत्तर में जानकारी जोड़ सकते हैं, आपको 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"));

यह सवाल कैसे कन्वर्ट करने के लिए नहीं पूछता है, यह पूछता है कि आउटपुट कैसे करें। UTF-16 में आउटपुट करने वाले इस योगदान का प्रासंगिक हिस्सा पहले से ही चयनित उत्तर में योगदान देता है ।
बेन सूफले '

@BenSaufley ठीक है, लेकिन यह प्रश्न की समस्या को कोड की 2 सरल लाइनों
b3wii

प्रश्न पहले से ही हल है, और अधिक अच्छी तरह से समझाया गया है, भी।
बेन सूफले
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.