Trong tut này mình sẽ chia sẽ như thế nào để import một file excel vào database dùng php excel cho thư viện php và vue js cho phần javascript
Thư viện này anh chị có thể tải từ https://github.com/nguyentantung/library-php-excel
Code mẫu dùng cho việc import file excel
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
function stocksCodeExcelToData($path_file){ //include PHPExcel include CHECKSTOCKSCODE_LIBS_DIR.'phpexcel/Classes/PHPExcel.php'; //path file $file = $path_file; //confirm file $objFile = \PHPExcel_IOFactory::identify($file); $objData = \PHPExcel_IOFactory::createReader($objFile); //only read $objData->setReadDataOnly(true); // Load data to object $objPHPExcel = $objData->load($file); //Get page number use getSheetCount(); //Get page name use getSheetNames(); //Select page need to read $sheet = $objPHPExcel->setActiveSheetIndex(0); //Get last row $Totalrow = $sheet->getHighestRow(); //Get colunm name the last $LastColumn = $sheet->getHighestColumn(); $TotalCol = \PHPExcel_Cell::columnIndexFromString($LastColumn); $data = array(); for ($i = 2; $i <= $Totalrow; $i++) { for ($j = 0; $j < $TotalCol; $j++) { $data[$i - 2][$j] = $sheet->getCellByColumnAndRow($j, $i)->getValue();; } } if($data): foreach($data as $key=>$data_item): $this->stocksCodeInsert($data_item[0], $note=''); endforeach; endif; //return $data; } |
Function này anh chị truyền vào path đến file anh chị thu được khi submit, anh chị chỉ cần lưu ý chỗ $data_item[0] là colunm 1 tương tự như vận dữ liệu ở colunm 2 sẽ là $data_item[1]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
function importStocksCodeFromExcel(){ $file = $_FILES['fileExcel']; $results=array(); //upload file $upload_dir = wp_upload_dir(); $results['wp_upload_dir'] = $upload_dir; if(!empty($file)){ $target_dir = $upload_dir['basedir']."/"; $target_file = $target_dir . basename($file["name"]); $uploadOk = 1; $imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION)); $message=''; // Check if file already exists if (file_exists($target_file)) { $message = "File đã có trong hệ thống."; $uploadOk = 0; } // Check file size if ($_FILES["fileToUpload"]["size"] > 50000) { $message = "Chỉ cho file 10 mg trở lại"; $uploadOk = 0; } // Allow certain file formats $allow_file_formats=array("pdf","xlsx","xls","doc","docx"); if(!in_array($imageFileType,$allow_file_formats)) { $message = "Chi cho phép file pdf, excel, word"; $uploadOk = 0; } // Check if $uploadOk is set to 0 by an error if ($uploadOk == 0) { $results['message']=$message; } else { if (move_uploaded_file($file["tmp_name"], $target_file)) { $results['stocksCodeExcelToData'] = $this->stocksCodeExcelToData($target_file); $results['target_file']=$target_file; @unlink($target_file); $results['message']="Đã import thành công!"; } else { $results['message']="Có lỗi trong quá trình upload"; } } } wp_send_json_success($results); } |
đây là function insert data sau khi lấy từ file excel
1 2 3 4 5 6 7 8 9 10 11 12 |
function stocksCodeInsert($code, $note=''){ global $wpdb; $table = $wpdb->prefix.'stocks_code'; $data = array( 'code' => $code, 'note' => $note ); $format = array('%s', '%s'); $wpdb->insert($table,$data,$format); $my_id = $wpdb->insert_id; return $my_id; } |
Trong ví dụ này mình sẽ tạo một modal như hình bên dưới
Code modal này mình sử dụng thu viện [email protected], sau đây là code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<q-dialog v-model="modalImportFromExcel"> <q-card style="width: 500px; max-width: 80vw;"> <q-card-section class="row items-center q-pb-none"> <div class="text-h6">Import từ file excel</div> <q-space></q-space> <q-btn icon="close" flat round dense v-close-popup ></q-btn> </q-card-section> <q-card-section > <template> <div class="q-pa-md"> <div class="q-gutter-md" style="max-width: 800px"> <div class="row q-col-gutter-md q-mb-md"> <div class="col-12"> <q-file color="purple-12" v-model="fileExcel" label="Chọn file excel"> <template v-slot:prepend> <q-icon name="attach_file" /> </template> </q-file> </div> </div> <div class="row q-col-gutter-md q-mb-md"> <div class="col-4"> <button class="custom-btn" @click="triggerImportFromExcel" v-html="triggerImportFromExcelText" ></button> </div> <div class="col-8"><a :href="excelUrlTemplate" download><i class="fa fa-cloud-download" aria-hidden="true"></i> Tải mẫu excel để import nếu chưa có</a></div> </div> </div> </div> </template> </q-card-section> </q-card> </q-dialog> |
Trong
1 2 3 4 |
data: () => ({ triggerImportFromExcelText: '<i class="fa fa-cloud-upload" aria-hidden="true"></i> Import', modalImportFromExcel: false }) |
Khi muốn mở modal anh chị chỉ cần viết một function đơn giản
1 2 3 4 5 |
methods: { openModalImportFromExcel(){ this.modalImportFromExcel = true } } |
Giờ chúng ta sẽ đi viết code cho nút submit, ah ngoài thu viện [email protected] mình còn dùng axios cho phần bất đồng bộ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
triggerImportFromExcel(){ const file = this.fileExcel if(file === null){ this.NOTIFY("Chưa chọn file excel!",0); return false; } if(file.type !== "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"){ this.NOTIFY("Vui lòng chọn file excel!",0); return false; } this.triggerImportFromExcelText = '<i class="fa fa-spinner fa-spin"></i> Import' axios.post( check_stocks_code_vars.ajax_url, this.jsonToFormData({ action: 'importStocksCodeFromExcel', fileExcel: this.fileExcel }) ).then(res => { const response = res.data.data this.triggerImportFromExcelText = '<i class="fa fa-cloud-upload" aria-hidden="true"></i> Import' this.NOTIFY(response.message,1) this.modalImportFromExcel = false }) } |
function jsonToFormData, nói chung các function nào dùng chung thì mình sẽ bỏ vào chỗ này
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
Vue.mixin({ methods:{ openURL(url){ Quasar.utils.openURL(url) }, addCommas(nStr) { nStr += ''; let x = nStr.split('.'); let x1 = x[0]; let x2 = x.length > 1 ? '.' + x[1] : ''; let rgx = /(\d+)(\d{3})/; while (rgx.test(x1)) { x1 = x1.replace(rgx, '$1' + ',' + '$2'); } return x1 + x2; }, buildFormData(formData, data, parentKey) { if (data && typeof data === 'object' && !(data instanceof Date) && !(data instanceof File)) { Object.keys(data).forEach(key => { this.buildFormData(formData, data[key], parentKey ? `${parentKey}[${key}]` : key); }); } else { const value = data == null ? '' : data; formData.append(parentKey, value); } }, jsonToFormData(data) { const formData = new FormData(); this.buildFormData(formData, data); return formData; }, NOTIFY(msg, type = 1){ this.$q.notify({ message: msg, color: type == 1 ? 'green' : 'red', position: 'top', timeout: 2000 }) }, deepMerge(target, source) { Object.entries(source).forEach(([key, value]) => { if (value && typeof value === 'object') { this.deepMerge(target[key] = target[key] || {}, value); return; } target[key] = value; }); return target; } } }) |
Mọi sự sao chép xin ghi rõ nguồn là fcwordpress.net
Chuyên trang về wordpress: hướng dẫn thiết kế theme, plugin, thủ thuật wordpress