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

نویسنده

  • 1400/9/6
  • 0
  • 64
2 سال پیش| برنامه‌نویسی وب

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

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

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

یکی از ساده‌ترین کارها این است که پس از گرفتن خروجی اکسل، آن را با فایل مانند 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

 

به‌روز رسانی: 1403/8/2
توی وبسایتم سعی می‌کنم محتوایی که تصور کنم ارزشمنده و به بقیه کمکی می‌کنه رو منتشر کنم. امیدوارم از مطالب وبسایت بتونید استفاده کنید و به کارتون بیاد. در ضمن اگه پروژه‌ی تحت وبی دارید که نیاز به برنامه‌نویسی و اجرا داره، می‌تونید با شماره انتهای صفحه با من تماس بگیرید تا در موردش با هم صحبت کنیم.


دیدگاه کاربران

ثبت دیدگاه

آدرس ایمیل شما منتشر نخواهد شد. فیلدهای الزامی مشخص شده اند*