Tìm kiếm nhanh

[Module Contact] Xuất danh sách liên hệ ra Excel

Thảo luận trong 'Hỗ trợ modules' đăng bởi anhyeuviolet, 03/10/2016 05:42.

  • anhyeuviolet

    anhyeuviolet Kenny Nguyen

    01/ Thư viện Excel:

    + Tải về từ link sau:

    https://github.com/PHPOffice/PHPExcel

     

    + Giải nén. Lấy thư mục Classes copy vào vị trí cần thiết. Ở đây mình chép vào /modules/contact/

    Rename nó lại thành PHPExcel. Nếu dùng trên Linux thì nhớ vụ phân biệt hoa thường.

     

    Khi đó cấu trúc sẽ kiểu như sau:

     

    \modules\contact\PHPExcel

    \modules\contact\PHPExcel\PHPExcel.php

    \modules\contact\PHPExcel\PHPExcel\Autoloader.php

    \modules\contact\PHPExcel\PHPExcel\Cell.php

    .....

     

    02/ Xử lý với module Contact:

    Ta mở file admin.menu.php ra, điều chỉnh lại. Mục đích việc này là để tạo 1 function mới có tên excel, mà khi click vào sẽ xuất các liên hệ thuộc module ra file Excel.

     

    Ta sửa như sau:

     

    <?php
    
    /**
     * @Project NUKEVIET 4.x
     * @Author VINADES.,JSC (contact@vinades.vn)
     * @Copyright (C) 2014 VINADES.,JSC. All rights reserved
     * @License GNU/GPL version 2 or any later version
     * @Createdate 07/30/2013 10:27
     */
    if (! defined('NV_ADMIN')) {
        die('Stop!!!');
    }
    
    if (defined('NV_IS_SPADMIN')) {
        $submenu['department'] = $lang_module['department_title'];
        $submenu['content'] = $lang_module['content'];
    	// Them submenu Xuat Excel
        $submenu['excel'] = 'Xuất ra Excel';
        $allow_func = array(
            'main',
            'excel', // ten cua file php chua chuc nang
            'reply',
            'del',
            'department',
            'row',
            'del_department',
            'content',
            'view',
            'change_status',
            'change_weight',
            'alias',
            'change_default'
        );
    } else {
        $allow_func = array(
            'main',
            'excel',// ten cua file php chua chuc nang
            'reply',
            'del',
            'view'
        );
    }
    

    Xem kỹ phần ghi chú, các bạn sẽ thấy mình thêm vào 03 dòng.

     

    + Tiếp theo, hãy tạo 1 file mới trong /modules/contact/admin/

    Đặt tên nó là excel.php (tương ứng với func excel chúng ta đã thêm bên trên).

     

    Nội dung file này như sau:

    <?php
    
    /**
     * @Project NUKEVIET 4.x
     * @Author VINADES (contact@vinades.vn)
     * @Copyright (C) 2014 VINADES. All rights reserved
     * @License GNU/GPL version 2 or any later version
     * @Createdate 2-9-2010 14:43
     */
    if (! defined('NV_IS_FILE_ADMIN')) {
        die('Stop!!!');
    }
    
    $page_title = $module_info['custom_title'];
    $db->sqlreset()
    	->select('COUNT(*)')
    	->from(NV_PREFIXLANG . '_' . $module_data . '_send');
    
    $num_items = $db->query($db->sql())
    	->fetchColumn();
    
    if ($num_items) {
    	$db->select('*')
    		->order('id DESC');
    	$result = $db->query($db->sql())->fetchAll();
    
    	$i = 2;
    	//Goi thu vien PHPExcel
    	require_once NV_ROOTDIR . '/modules/' . $module_file . '/PHPExcel/PHPExcel.php';
    	$objPHPExcel = new PHPExcel();
    	// Khoi tao header cua cac cot chua du lien
    	$objPHPExcel->setActiveSheetIndex(0)
    		->setCellValue('A1', 'Tên')
    		->setCellValue('B1', 'Tiêu đề')
    		->setCellValue('C1', 'Email');
    	foreach($result as $row){
    		//set gia tri cho cac cot du lieu
    		$objPHPExcel->setActiveSheetIndex(0)
    		->setCellValue('A'.$i, $row['sender_name'])
    		->setCellValue('B'.$i, $row['title'])
    		->setCellValue('C'.$i, $row['sender_email']);
    		$i++;
    	}
    	$_name = $module_name . '_' . date('H_i_d_m_Y') . '.xls'; // ten va dinh dang file
    	$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); // ghi du lieu vao file,dinh dang file Excel 2007 (Excel2007), CSV hoac Excel 2003(Excel5)
    	$full_path = NV_ROOTDIR .'/'. NV_UPLOADS_DIR .'/'. $module_upload . '/' . $_name;//duong dan tuyet doi cua file
    	$objWriter->save($full_path);
    	// Dieu huong den duong link ben ngoai site de co the download
    	Header('Location: ' . nv_url_rewrite( NV_MY_DOMAIN . NV_BASE_SITEURL . NV_UPLOADS_DIR .'/' . $module_upload . '/' . $_name ));
    }
    

    Giải thích code một chút:

    + Code sẽ gọi vào Database, nếu có dữ liệu sẽ bắt đầu xuất ra file.

     

    Đoạn code này sẽ ghi đầu đề của các cột dữ liệu, tương ứng vị trí các Cell trong Excel, ví dụ: A1, B1, C1 ...

    	$objPHPExcel->setActiveSheetIndex(0)
    		->setCellValue('A1', 'Tên')
    		->setCellValue('B1', 'Tiêu đề')
    		->setCellValue('C1', 'Email');
    

    + Dữ liệu được gán vào biến $result là một mảng (array). Ta dùng foreach để xuất thành các mảng con và gán dữ liệu cho các cell tương ứng.

     

    	foreach($result as $row){
    		//set gia tri cho cac cot du lieu
    		$objPHPExcel->setActiveSheetIndex(0)
    		->setCellValue('A'.$i, $row['sender_name'])
    		->setCellValue('B'.$i, $row['title'])
    		->setCellValue('C'.$i, $row['sender_email']);
    		$i++;
    	}
    

    Ta phải đặt biến $i là 2, vì Cell 1 đã nhường chỗ cho các ô tiêu đề. Do đó dữ liệu sẽ đi từ dòng 2.

     

    + Dòng $_name: Là phần sau của đường dẫn cùng với tên file, định dạng sẽ xuất ra.

    Như trong ví dụ sẽ là tenmodule_gio_phut_ngay_thang_nam.xls

    + Dòng $objWriter chính là Engineer sẽ xuất dữ liệu.

    Tuỳ theo mục đích sử dụng mà định dạng file xuất ra khác nhau. Có thể tham khảo thêm các engineer mà PHPExcel hỗ trợ.

    https://github.com/PHPOffice/PHPExcel#reading

    Như trong ví dụ này, mình xuất ra XLS, engineer là Excel5, là định dạng Excel 97-2003.

    Nếu các bạn thích XLSX ( Excel 2007) thì ta sửa Excel5 thành Excel2007 và chỗ $_name chỉ cần thêm x đàng sau xls.

    + Dòng $full_path là nơi lưu file. Hiện tại nó nằm trong /uploads/contact/.

     

    Ở ví dụ này, mình chỉ xuất 03 cột: Người gửi, Tiêu đề và Email.

    Nếu làm đúng, trong Admin Panel của module contact sẽ xuất hiện như sau:

    Khi click vào, các bạn sẽ nhận được thông báo tải file.

    Kết quả sẽ như thế này:

     

    Chúc các bạn vui !

     
    Lần sửa cuối bởi bạn: 06/10/2016 09:39
    huongpro_love thích điều này.
  • huongpro_love

    huongpro_love Nguyễn Văn Hưởng

    Khi phố lên đèn là lúc cuộc sống ae ta bắt đầu.. Thanks ô anh nhiều nhé, em biết cái này là dành cho em :))))

     
    anhyeuviolet thích điều này.
  • hoanglongvnpt

    hoanglongvnpt Nguyễn Tất Thắng

     
  • anhyeuviolet

    anhyeuviolet Kenny Nguyen

     

    Hôm qua lướt Voz thấy có bạn hỏi cách xuất data ra Excel nên mò lại, tiện thể nhớ ra còn nợ bài nên làm luôn.

    Có thời gian mình sẽ làm tiếp phần TPL có thể cấu hình tuỳ chỉnh các cột và điều kiện để xuất data.

     
  • huongpro_love

    huongpro_love Nguyễn Văn Hưởng

    Em ốm rồi này.. khổ quá, ng lại cúm r, chả làm ăn được gì :(

     
  • anhyeuviolet

    anhyeuviolet Kenny Nguyen

     

    Khổ thân !

    Bị trĩ nó khổ thế đấy.

    Đừng như Hưởng blush

     
  • huongpro_love

    huongpro_love Nguyễn Văn Hưởng

    Ai xui e bị kiểu gì cũng bị crying

     
  • huongpro_love

    huongpro_love Nguyễn Văn Hưởng

    Cốc cốc... Sếp ơi.. sao em ko xuất được cái time ra anh nhỷ :3 

     

     

    Tệp đính kèm:

  • huongpro_love

    huongpro_love Nguyễn Văn Hưởng

    Cốc cốc... Sếp ơi.. sao em ko xuất được cái time ra anh nhỷ :3 

     
  • huongpro_love

    huongpro_love Nguyễn Văn Hưởng

    Em bị lỗi khi đưa lên host thay vì nhận link dowloads là  topfitness.com.vn/uploads/dangkyhocthu/dangkyhocthu_19_07_06_10_2016.xls

    Nó lại nhận mỗi link http://uploads/dangkyhocthu/dangkyhocthu_19_07_06_10_2016.xls

     
  • anhyeuviolet

    anhyeuviolet Kenny Nguyen

     

    Vụ này thì thử sửa:

    	// Dieu huong den duong link ben ngoai site de co the download
    	Header('Location: ' . nv_url_rewrite( NV_BASE_SITEURL .'/'. NV_UPLOADS_DIR .'/' . $module_upload . '/' . $_name ));

    Thành code:

    	// Dieu huong den duong link ben ngoai site de co the download
    	Header('Location: ' . nv_url_rewrite( NV_MY_DOMAIN . NV_BASE_SITEURL . NV_UPLOADS_DIR .'/' . $module_upload . '/' . $_name ));
    

     

     
    Lần sửa cuối bởi bạn: 06/10/2016 09:39
  • anhyeuviolet

    anhyeuviolet Kenny Nguyen

     

    Còn vụ này đưa code lên mình xem thử. Có thể nó bị vấn đề về định dạng ngày giờ.

     
  • anhyeuviolet

    anhyeuviolet Kenny Nguyen

    ^

    Có thể thử:

    	foreach($result as $row){
    		//set gia tri cho cac cot du lieu
    		$row['send_time'] = nv_date("H:i d/m/Y", $row['send_time']);
    		$date = PHPExcel_Style_NumberFormat::toFormattedString($row['send_time'], "D/M/YYYY");
    		$objPHPExcel->setActiveSheetIndex(0)
    		->setCellValue('A'.$i, $row['sender_name'])
    		->setCellValue('B'.$i, $row['title'])
    		->setCellValue('C'.$i, $row['sender_email'])
    		->setCellValue('D'.$i, $date);
    		$i++;
    	}
    

    Còn nếu muốn Excel nhận là Date ( loại Cell ) thì tham khảo:

    http://stackoverflow.com/questions/27937003/formatting-a-date-in-phpexcel-that-can-be-updated-after-xls-is-generated

     
    Lần sửa cuối bởi bạn: 06/10/2016 09:52
  • huongpro_love

    huongpro_love Nguyễn Văn Hưởng

    Vụ trên thì em sửa lúc chiều được rồi, vụ date để em tham khảo thử xem sao :D 

     
  • huongpro_love

    huongpro_love Nguyễn Văn Hưởng

    Ok được rồi anh nhé, ah phải sửa ntn mới chuẩn :D
     

    		$row['time'] = nv_date("H:i d/m/Y", $row['time']);
    		$date = PHPExcel_Style_NumberFormat::toFormattedString($row['time'], "D/M/YYYY");

     

     
  • anhyeuviolet

    anhyeuviolet Kenny Nguyen

     

    =_= Sao lại chuẩn là sao ........................

     
  • huongpro_love

    huongpro_love Nguyễn Văn Hưởng

    Cái bảng thời gian là time chứ ko phải sender_time a :D

     
  • anhyeuviolet

    anhyeuviolet Kenny Nguyen

     

    Ah ah, nhầm tí.

    angel

     
  • huongpro_love

    huongpro_love Nguyễn Văn Hưởng

    laugh

     

Chia sẻ trang này

Bạn đã không sử dụng Site, Bấm vào đây để duy trì trạng thái đăng nhập. Thời gian chờ: 60 giây