چطور در لاراول بدون پکیج از دیتابیس خروجی اکسل بگیریم و کاراکترهای فارسی را نیز صحیح نمایش دهیم؟

به طور معمول اگر بخواهیم از دیتابیس خود خروجی در قالب فایل اکسل تهیه کنیم، ممکن است با مشکل عدم خوانایی کاراکترهای فارسی مواجه شویم.

یکی از ساده‌ترین کارها این است که پس از گرفتن خروجی اکسل، آن را با فایل مانند Notepad++ باز کرده و از قسمت Encoding آن را برابر با UTF-8-BOM قرار داده و ذخیره کنیم تا مشکل نمایش کاراکترهای فارسی حل شود.

در این حالت در پشت پرده به ابتدای فایل عبارت مخفی که در اصطلاح BOM شناخته می‌شود اضافه خواهد شد.

اما راه حل دیگر این است که کاربر را درگیر نکرده و به صورت اتوماتیک هنگام خروجی برنامه را طوری بنویسیم که این کاراکتر را به فایل اضافه کند.

در لاراول من کار را به صورت زیر انجام می‌دهم که بسته به نیازتان می‌توانید موارد دلخواه را طبق نمونه کد زیر توسعه دهید:

public function export()
{
	$data = DB::table('users')
		->select('name', 'lastname')->where('role', '!=', 'admin')->get();

	$data = json_decode(json_encode($data), True);

	function cleanData(&$str)
	{
		if ($str == 't') $str = 'TRUE';
		if ($str == 'f') $str = 'FALSE';
		if (preg_match("/^0/", $str) || preg_match("/^\+?\d{8,}$/", $str) || preg_match("/^\d{4}.\d{1,2}.\d{1,2}/", $str) || preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/", $str)) {
			$str = " $str";
		}
		if (strstr($str, '"')) $str = '"' . str_replace('"', '""', $str) . '"';
	}

	// filename for download
	$filename = "export_" . date('Ymd') . ".csv";


	header("Content-Disposition: attachment; filename=\"$filename\"");
	header("Content-Type: text/csv");


	$out = fopen("php://output", 'w');
	fprintf($out, chr(0xEF) . chr(0xBB) . chr(0xBF)); //جهت نمایش صحیح کاراکترهای فارسی

	$flag = false;
	foreach ($data as $row) {
		if (!$flag) {
			// display field/column names as first row
			fputcsv($out, array_keys($row), ',', '"');
			$flag = true;
		}
		array_walk($row, __NAMESPACE__ . '\cleanData');
		fputcsv($out, array_values($row), ',', '"');
	}

	fclose($out);
}

کدها به قدر کفایت شفاف و گویا می‌باشند. با این حال من یک کنترلر با نام export ایجاد و یک کوئری دلخواه از دیتابیس گرفته‌ام و از جدول مورد نظر فیلدهای نام و نام خانوادگی را انتخاب کرده و در نهایت از آن‌ها خروجی اکسل گرفته‌ام. بدون اینکه خدشه‌ای در نمایش کاراکترهای فارسی ایجاد شود.

نکته: کاراکتر زیر نماد BOM است که در کدهای بالا مشاهده می‌کنید که آن را نیز اضافه کرده‌ایم:

\xEF\xBB\xBF

درباره نویسنده: احسان

مطالب زیر را حتما بخوانید