سؤال

أنا برمجيا تصدير البيانات (باستخدام PHP 5.2) في .csv ملف اختبار.
البيانات المثال: Numéro 1 (ملاحظة معلمة e).البيانات utf-8 (لا إرفاق مسبقا BOM).

عندما فتح هذا الملف في MS Excel يعرض كما Numéro 1.

وأنا قادرة على فتح هذا في محرر نص (برنامج ultraedit) الذي يعرض بشكل صحيح.رق تقارير الحرف decimal 233.

كيف يمكنني تصدير النص البيانات في .ملف csv حتى التي MS Excel بشكل صحيح سوف تجعل ، ويفضل أن يكون من دون إجبار استخدام "معالج الاستيراد" ، أو غير افتراضي معالج الإعدادات ؟

هل كانت مفيدة؟

المحلول

وهو منسق بشكل صحيح UTF8 الملف يمكن أن يكون علامة ترتيب البايت كما الثلاث الأولى من الثمانية.هذه هي القيم عرافة 0xEF, 0xBB, 0xBF.هذه الثمانية احتفالا الملف كما UTF8 (لأنها ليست ذات صلة باسم "ترتيب البايت" المعلومات).1 إذا كان هذا التنظيم غير موجود ، الاستهلاكية/القارئ هو من اليسار إلى استنتاج نوع ترميز النص.القراء التي لا UTF8 قادرة على قراءة بايت وبعض الترميز الأخرى مثل Windows-1252 و عرض الشخصيات  في بداية الملف.

هناك علة معروفة حيث Excel عند فتح UTF8 ملفات CSV عن طريق ملفات يفترض أنها في بايت واحد الترميز ، تجاهل وجود UTF8 بوم.هذا يمكن أن لا تكون ثابتة من قبل أي نظام الافتراضي الشفرة أو إعداد اللغة.BOM لا فكرة في Excel فقط لن يعمل.(أقلية تقرير يدعي أن بوم في بعض الأحيان يطلق على "استيراد النص" المعالج.) هذا الخطأ يظهر إلى الوجود في Excel 2003 والإصدارات السابقة.معظم التقارير (وسط الإجابات هنا) أقول أن هذا يتم إصلاحها في Excel 2007 وأحدث.

ملاحظة يمكن دائما* صحيح فتح UTF8 ملفات CSV في Excel باستخدام "استيراد النص" المعالج الذي يسمح لك لتحديد ترميز الملف أنت الافتتاح.بالطبع هذا هو أقل من ذلك بكثير مريحة.

قراء هذا الجواب الأكثر احتمالا في حالة حيث أنهم لا سيما دعم Excel < 2007 ، ولكن يتم إرسال الخام UTF8 النص إلى Excel ، وهو فهم ذلك و رش النص الخاص بك مع Ã وأخرى مماثلة Windows-1252 الشخصيات. إضافة UTF8 بوم هو على الارجح أفضل وأسرع الإصلاح.

إذا كنت عالقة مع المستخدمين على كبار السن تتفوق و Excel هو الوحيد المستهلك من ملفات csv الخاص بك ، يمكنك العمل حول هذا عن طريق تصدير UTF16 بدلا من UTF8.Excel 2000 و 2003 انقر نقرا مزدوجا فوق فتح هذه بشكل صحيح.(بعض برامج تحرير النصوص الأخرى يمكن أن يكون لها مشاكل مع UTF16, لذلك قد تضطر إلى الموازنة بين الخيارات الخاصة بك بعناية.)


* باستثناء عندما لا تستطيع (على الأقل) Excel 2011 for Mac هو معالج الاستيراد في الواقع لا تعمل دائما مع جميع ترميزات ، بغض النظر عن ما كنت أقول ذلك.</anecdotal-evidence> :)

نصائح أخرى

يتبع BOM (\uFEFF) عملت بالنسبة لي (Excel 2007) التي تتفوق معترف بها الملف UTF-8.وإلا حفظه و باستخدام معالج استيراد يعمل ، ولكن أقل مثالية.

أدناه هو رمز PHP يمكنني استخدامها في بلدي المشروع عند إرسال Microsoft Excel المستخدم:

  /**
   * Export an array as downladable Excel CSV
   * @param array   $header
   * @param array   $data
   * @param string  $filename
   */
  function toCSV($header, $data, $filename) {
    $sep  = "\t";
    $eol  = "\n";
    $csv  =  count($header) ? '"'. implode('"'.$sep.'"', $header).'"'.$eol : '';
    foreach($data as $line) {
      $csv .= '"'. implode('"'.$sep.'"', $line).'"'.$eol;
    }
    $encoded_csv = mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
    header('Content-Description: File Transfer');
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment; filename="'.$filename.'.csv"');
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: '. strlen($encoded_csv));
    echo chr(255) . chr(254) . $encoded_csv;
    exit;
  }

تحديث:اسم الملف تحسين و إصلاح الخلل الصحيح حساب طول.شكرا علم حساب المثلثات و @ivanhoe011

الإجابة عن كافة تركيبات من إصدارات Excel (2003 + 2007) و أنواع الملفات

معظم إجابات أخرى هنا القلق على Excel الإصدار فقط و ليس بالضرورة تساعدك ، لأن الإجابة قد لا يكون صحيحا الإصدار من Excel.

على سبيل المثال ، إضافة بوم حرف يدخل في مشاكل مع ناقل عمود فاصل الاعتراف ، ولكن ليس مع كل Excel الإصدار.

هناك 3 المتغيرات التي تحدد ما إذا كان يعمل في معظم إصدارات Excel:

  • ترميز
  • بوم حرف وجود
  • فاصل الخلايا

شخص المتحمل في SAP حاولت كل مجموعة و ذكرت نتائج.النهاية النتيجة ؟ استخدام UTF16le مع بوم و التبويب حرف فاصل أن يكون عليه العمل في معظم إصدارات Excel.

أنت لا تصدقني ؟ لا سواء ، ولكن قرأت هنا ويبكي: http://wiki.sdn.sap.com/wiki/display/ABAP/CSV+tests+of+encoding+and+column+separator

اختر UTF-8 enconding عند استيراد.إذا كنت تستخدم Office 2007 هذا هو المكان الذي اخترته :بعد فتح الملف.

صدى UTF-8 بوم قبل outputing البيانات CSV.هذا حل كل قضايا شخصية في ويندوز ولكن لا يعمل على ماك.

echo "\xEF\xBB\xBF";

يعمل بالنسبة لي لأنني بحاجة إلى إنشاء الملفات التي سيتم استخدامها على أجهزة الكمبيوتر ويندوز فقط.

UTF-8 لا يعمل بالنسبة لي في office 2007 بدون أي حزمة خدمة ، مع أو بدون BOM (U+ffef أو 0xEF,0xBB,0xBF لا يعمل) تثبيت sp3 يجعل UTF-8 العمل عندما 0xEF,0xBB,0xBF بوم هو إرفاق مسبقا.

UTF-16 يعمل عند ترميز في بيثون باستخدام "utf-16-فندق" مع 0xff 0xef بوم إرفاق مسبقا باستخدام علامة التبويب كما المفرق.كان يدويا اكتب BOM ، ومن ثم استخدام "utf-16-فندق" بدلا من "utf-16", وإلا كل ترميز() إرفاق مسبقا BOM إلى كل صف مكتوبة الذي ظهرت القمامة في العمود الأول من السطر الثاني و بعد.

لا أستطيع أن أقول ما إذا كان UTF-16 سيعمل دون أي sp مثبتة منذ أنا لا أستطيع العودة الآن. تنفس الصعداء

هذا هو على ويندوز ، دونو حول office لنظام التشغيل MAC.

لكل من العامل الحالات ، استيراد يعمل عند بدء التحميل مباشرة من متصفح "معالج استيراد النص" لا intervence, يعمل كما كنت تتوقع.

كما Fregal قال \uFEFF هو الطريق للذهاب.

<%@LANGUAGE="JAVASCRIPT" CODEPAGE="65001"%>
<%
Response.Clear();
Response.ContentType = "text/csv";
Response.Charset = "utf-8";
Response.AddHeader("Content-Disposition", "attachment; filename=excelTest.csv");
Response.Write("\uFEFF");
// csv text here
%>

لقد لاحظت أيضا أن السؤال "أجاب" منذ بعض الوقت ولكن أنا لا أفهم القصص التي تقول لا يمكن فتح utf8-ترميز ملف csv بنجاح في Excel دون استخدام النص المعالج.

لي تجربة قابلة للتكرار:نوع Old MacDonald had a farm,ÈÌÉÍØ في المفكرة هاهنا ، ثم حفظ باسم (باستخدام UTF-8 الخيار).

باستخدام بيثون أن تظهر ما في الواقع هناك:

>>> open('oldmac.csv', 'rb').read()
'\xef\xbb\xbfOld MacDonald had a farm,\xc3\x88\xc3\x8c\xc3\x89\xc3\x8d\xc3\x98\r\n'
>>> ^Z

جيد.المفكرة قد وضع بوم في الجبهة.

الآن اذهب إلى مستكشف Windows, انقر نقرا مزدوجا فوق اسم الملف أو انقر بزر الماوس الأيمن ثم استخدام "فتح في ..." ، ينبثق Excel (2003) مع عرض كما هو متوقع.

يمكنك حفظ ملف html مع امتداد xls' و لهجات العمل (قبل 2007 على الأقل).

على سبيل المثال:حفظ هذا (باستخدام حفظ باسم utf8 في المفكرة) كما test.xls:

<html>
<meta http-equiv="Content-Type" content="text/html" charset="utf-8" />
<table>
<tr>
  <th>id</th>
  <th>name</th>
</tr>
<tr>
 <td>4</td>
 <td>Hélène</td>
</tr>
</table>
</html>

هذا هو مجرد مسألة شخصية ترميزات.يبدو أنك تصدير البيانات UTF-8:é في UTF-8 هو تسلسل بايت 0xC3 0xA9 ، عند تفسير Windows-1252 هو é.عند استيراد البيانات إلى Excel ، تأكد من أن أقول أن ترميز الأحرف كنت تستخدم UTF-8.

تنسيق CSV ويتم تنفيذ ASCII ، ليس unicode في Excel ، وبالتالي الضغط على التشكيل.عانينا من نفس المشكلة وهي كيف تتبعت الرسمية CSV القياسية بوصفه ASCII-مقرها في Excel.

كتابة بوم إلى إخراج ملف CSV في الواقع لم تعمل معي في جانغو:

def handlePersoonListExport(request):
    # Retrieve a query_set
    ...

    template = loader.get_template("export.csv")
    context = Context({
        'data': query_set,
    })

    response = HttpResponse()
    response['Content-Disposition'] = 'attachment; filename=export.csv'
    response['Content-Type'] = 'text/csv; charset=utf-8'
    response.write("\xEF\xBB\xBF")
    response.write(template.render(context))

    return response

للحصول على مزيد من المعلومات http://crashcoursing.blogspot.com/2011/05/exporting-csv-with-special-characters.html شكرا لكم أيها الرجال!

حل آخر وجدت فقط في ترميز نتيجة ويندوز صفحة الرموز 1252 (Windows-1252 أو CP1252).القيام بذلك ، على سبيل المثال من خلال وضع Content-Type مناسب إلى شيء من هذا القبيل text/csv; charset=Windows-1252 ووضع حرف ترميز دفق استجابة بالمثل.

علما بأن ذلك UTF-8 بوم ليس بالضرورة فكرة جيدة - Mac إصدارات Excel تجاهل ذلك و فعلا عرض بوم ASCII... ثلاث سيئة الشخصيات في بداية الحقل الأول في جدول البيانات الخاص بك...

التحقق من ترميز الذي يتم توليد ملف لجعل excel عرض الملف بشكل صحيح يجب استخدام النظام الافتراضي الشفرة.

اللي تبونه اللغة تستخدمه ؟ إذا كان .صافي تحتاج فقط إلى استخدام الترميز.افتراضي أثناء إنشاء الملف.

Excel 2007 بشكل صحيح يقرأ UTF-8 مع بوم (EF BB BF) المشفرة csv.

Excel 2003 (وربما قبل ذلك) يقرأ UTF-16LE مع بوم (FF FE) ، ولكن مع علامات التبويب بدلا من الفاصلة أو الفاصلة المنقوطة.

أنا يمكن فقط الحصول على CSV إلى تحليل بشكل صحيح في Excel 2007 tab-فصل endian طفيف UTF-16 بدءا السليم علامة ترتيب البايت.

إذا كان لديك التعليمات البرمجية القديمة في vb.net مثل لدي التعليمات البرمجية التالية عملت بالنسبة لي:

    Response.Clear()
    Response.ClearHeaders()
    Response.ContentType = "text/csv"
    Response.Expires = 0
    Response.AddHeader("Content-Disposition", "attachment; filename=export.csv;")
    Using sw As StreamWriter = New StreamWriter(Context.Response.OutputStream, System.Text.Encoding.Unicode)
        sw.Write(csv)
        sw.Close()
    End Using
    Response.End()

لقد وجدت طريقة لحل المشكلة.هذا هو سيئة الإختراق ولكن يعمل:فتح الطبيب فتح مكتب, ثم حفظه في أي تنسيق excel;مما أدى .xls أو .xlsx سيتم عرض حدته الشخصيات.

مع روبي 1.8.7 أنا ترميز كل مجال إلى UTF-16 و تجاهل بوم (ربما).

التعليمة البرمجية التالية المستخرجة من active_scaffold_export:

<%                                                                                                                                                                                                                                                                                                                           
      require 'fastercsv'                                                                                                                                                                                                                                                                                                        
      fcsv_options = {                                                                                                                                                                                                                                                                                                           
        :row_sep => "\n",                                                                                                                                                                                                                                                                                                        
        :col_sep => params[:delimiter],                                                                                                                                                                                                                                                                                          
        :force_quotes => @export_config.force_quotes,                                                                                                                                                                                                                                                                            
        :headers => @export_columns.collect { |column| format_export_column_header_name(column) }                                                                                                                                                                                                                                
      }                                                                                                                                                                                                                                                                                                                          

      data = FasterCSV.generate(fcsv_options) do |csv|                                                                                                                                                                                                                                                                           
        csv << fcsv_options[:headers] unless params[:skip_header] == 'true'                                                                                                                                                                                                                                                      
        @records.each do |record|                                                                                                                                                                                                                                                                                                
          csv << @export_columns.collect { |column|                                                                                                                                                                                                                                                                              
            # Convert to UTF-16 discarding the BOM, required for Excel (> 2003 ?)                                                                                                                                                                                                                                     
            Iconv.conv('UTF-16', 'UTF-8', get_export_column_value(record, column))[2..-1]                                                                                                                                                                                                                                        
          }                                                                                                                                                                                                                                                                                                                      
        end                                                                                                                                                                                                                                                                                                                      
      end                                                                                                                                                                                                                                                                                                                        
    -%><%= data -%>

السطر المهم هو:

Iconv.conv('UTF-16', 'UTF-8', get_export_column_value(record, column))[2..-1]

فتح ملف csv مع notepad++ أنقر على ترميز اختر convert to UTF-8 (لا convert to UTF-8(دون BOM)) حفظ فتح طريق double clic مع excel نأمل أن تساعد كريستوف GRISON

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top