گیک فارسی

نوشته های یک گیک فارسی از فعالیت ها ،‌ علاقه مندی ها و نقد هایش

خروجی CSV فارسی برای Excel در PHP

نویسنده:
16 آوریل 14

از زمانی که ویندوز را رها کردم بعضی مشکلات که روی ویندوز بود داره از ذهنم میره و مبنا را بر روی لینوکس و نرم‌افزار های لینوکسی گذاشته‌ام که خوب بعضی جا ها باعث بروز مشکلاتی میشه ، بالاخره بیش از ۹۸ درصد کاربران روی کامپیوتر هاشون ویندوز دارن و از برنامه‌های ویندوزی استفاده میکنند. این مشکل مربوط به نمایش خروجی های CSV توی Excel هست که بسیار توی برنامه نویسی وب پر استفاده هستش و معمولاً خیلی از گزارش ها را به فرمت CSV و Xls میدیم.

من زیاد از فرمت های انحصاری خوشم نمیاد مخصوصاً Xls و ترجیح میدم وقتی CSV به این راحتی هست از Xls استفاده نکنم مگر اینکه واقعاً مجبور بشم.

اما مشکلی که تقریباً همه دارند اینه که وقتی خروجی utf-8 بگیری توسط php و حتی BOM مربوطه را هم بگذاری باز هم Excel نمیفهمه فایل را باید با Encoding درست یعنی utf-8 نمایش بده. خوب با کمی جستجو و استفاده از تجربه دیگران متوجه شدم که Excel تنها وقتی Encoding را روی UTF-16LE میگذاریم و BOM را هم اول فایل قرار میدیم به راحتی فارسی (کلاً یونیکد) را تشخیص و درست نمایش میده.

خوب با این فرض دیگه کد نویسیش سخت نیست و چون نمیخوام این تغییر را دونه به دونه روی هر فیلدی اعمال کنم همون فایل utf-8 را ایجاد میکنم و از روش یک فایل با utf-16le میسازم:

$fh = fopen($utf16le_file,"w");
fwrite($fh, chr(255).chr(254)); //BOM For UTF-16LE
fwrite($fh, mb_convert_encoding(file_get_contents($utf8_file) , 'UTF-16LE', 'UTF-8'));
fclose($fh);

به همین راحتی انجام شد و نیازی به سر و کله زدن با کامپوننت های Excel برای PHP نیست.

پی نوشت ۱: یک نمونه کد برای راهنمایی بیشتر دوستان برای دانلود قرار دادم.

پی نوشت ۲: دو تا نکته هست که اگه دوستان دقت نداشته باشند با مشکل روبرو میشوند. یکی اینکه برای Delimiter باید حتما از TAB یا همون t\ استفاده کنند و نکته دیگه اینکه اگه از تابع fputcsv استفاده میکنید. توجه داشته باشین که مقادیر را داخل تابع به utf16le تبدیل نکنید. کل فایل csv را روی دیسک ذخیره کنید و یکجا همه را به utf16le تبدیل کنید. علتش اینه که fputcsv مقادیر Delimiter و n\ را utf-8 ذخیره میکنه و به مشکل میخورید.

پی نوشت ۳: یکسری دوستان گلایه داشتند که چرا من از فایل متنی به عنوان Data ورودی استفاده کردم که نسخه MySQL به همراه Database و فایل هاش هم به عنوان نمونه قرار داده شد.

16 پیام برای خروجی CSV فارسی برای Excel در PHP

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.