I am generating a CSV string with PHP and send it via AJAX to my Javascript function.
A simple button
CSV
Call that function and should download a CSV file from the string. How can I handle that?
My PHP Function
function exportCSV[]{
$profs = $this->getAllDozent[];
$profs = json_decode[$profs, true];
$currentID = 0;
$csv = "IDDOZENT,IDVERANSTALTUNG,BEZEICHNUNG,SWS,CREDITS,HAEUFIGKEIT_PA,FAKTOR_DOPPELUNG,SOMMER,WPF,KOSTEN_PA,\n";
// Iteriere durch Professor Array
foreach[$profs as $key => $value]{
$currentID = $value['IDDOZENT'];
//Hole für ID die Veranstaltungen
$veranstaltungen = $this->getVeranstaltungenByID[$currentID];
$veranstaltungen = json_decode[$veranstaltungen, true];
//Nur wenn Veranstaltungen da sind, abrufen.
if[$veranstaltungen != "NULL"]{
foreach [$veranstaltungen as $key => $value] {
$csv = $csv.$currentID.","
.$value['IDVERANSTALTUNG'].","
.$value['BEZEICHNUNG'].","
.$value['SWS'].","
.$value['CREDITS'].","
.$value['HAEUFIGKEIT_PA'].","
.$value['FAKTOR_DOPPELUNG'].","
.$value['SOMMER'].","
.$value['WPF'].","
.$value['KOSTEN_PA']."\n";
}
}
}
return $csv;
}
returns a valid csv string like that "a,b,c,d"
.
My Javascript looks like:
function csvExport[]{
var xmlhttp = new XMLHttpRequest[];
xmlhttp.onreadystatechange = function[] {
if [this.readyState == 4 && this.status == 200]{
console.log[this.responseText];
}
};
xmlhttp.open["GET", "csvExport.php", true];
xmlhttp.send[];
}
In the callback, I want to download the this.responseText
as a CSV file. Is that possible?
CHỈNH SỬA Tôi vừa thử điều này với tệp 10MB và có vẻ như val [] quá chậm để chèn dữ liệu. Nhanh lên.
Được rồi, vì vậy tôi đã thử cái này cái khác. Điều này có thể có hoặc không hoàn toàn mất trí! Ý tưởng là thực hiện một yêu cầu AJAX để tạo dữ liệu, sau đó sử dụng lệnh gọi lại để chèn dữ liệu vào một biểu mẫu ẩn trên trang hiện tại có hành động của trang "tải xuống" thứ ba; sau khi chèn, biểu mẫu sẽ tự động được gửi, trang tải xuống sẽ gửi tiêu đề và gửi lại BÀI ĐĂNG, và sau đó, hãy tải xuống.
Trong khi đó, trên trang gốc, bạn có một dấu hiệu rằng tệp đang được chuẩn bị và khi nó hoàn thành, chỉ báo sẽ được cập nhật.
LƯU Ý: mã kiểm tra này không được kiểm tra rộng rãi và không có kiểm tra bảo mật thực sự [hoặc bất kỳ kiểm tra nào] được thực hiện. Tôi đã thử nghiệm nó với tệp CSV 1,5MB mà tôi đã đặt và nó khá linh hoạt.
Index.html
Click Me
test.js
$[document].ready[function[]{
$["#downloadlink"].click[function[]{ // click the link to download
lock[]; // start indicator
$.get["create.php",function[filedata]{ // AJAX call returns with CSV file data
$["#filedata"].val[filedata]; // insert into the hidden form
unlock[]; // update indicator
$["#hiddenform"].submit[]; // submit the form data to the download page
}];
}];
function lock[]{
$["#wait"].text["Creating File..."];
}
function unlock[]{
$["#wait"].text["Done"];
}
}];
create.php
download.php
5 hữu ích 0 bình luận chia sẻ
Cài đặt
Việc đầu tiên là bạn phải đi cài đặt cho mình một project laravel. Các bước cơ bản này mình sẽ không nhắc lại nữa nhé. Nếu bạn vẫn thấy bỡ ngỡ thì có thể lên trang chủ của laravel để tìm cách cài đặt nhé, mới nhất đang là bản 7
. rồi: //laravel.com/docs/7.x/installation
Để xuất file csv hoặc excel trong laravel sẽ dùng đến một thư viện đó là maatwebsite/excel
Sử dụng câu lệnh sau để cài
đặt:
composer require maatwebsite/excel
Mặc định Maatwebsite\Excel\ExcelServiceProvider
sẽ được tự động đăng ký theo mặc định. Tương tự với Excel facade Maatwebsite\Excel\Facades\Excel
.
Publish config
php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider
Và bây giờ nếu bạn muốn thay đổi config của thư viện này thì nó nằm trong file config/excel.php
.
Xây dựng xuất file với laravel
Mình sẽ đặt ra một bài toán cơ bản là xuất thông tin của các sản phẩm [product] ra thành file csv/ excel. Sản phẩm sẽ gồm tên sản phẩm, số lượng sản phẩm, như vậy thôi cho nhanh nhé. Giờ cùng bắt tay đi thực hiện nào.
Tạo migration và model
Mình cần tạo migration và model product để xuất dữ liệu.
php artisan make:model Product -m
câu lệnh này sẽ đồng thời tạo một model class là Product
và một file migration [timestamp].create_products_table.php
trong thư mục database/migrations
.
Thêm một vài thông tin cho migration của chúng ta
public function up[]
{
Schema::create['products', function [Blueprint $table] {
$table->bigIncrements['id'];
$table->string['name'];
$table->integer['quantity'];
$table->timestamps[];
}];
}
Chạy migrate với câu lệnh
php artisan migrate
Bây giờ mình sẽ giả sử là trong bảng products đã có dữ liệu rồi, chúng ra sẽ đi xuất dữ liệu từ bảng products này
Controller và route
Tạo file ProductController.php trong thư mục Controller, đây sẽ là nơi thực hiện các bước export file trả về cho người dùng.
php artisan make:controller ProductController
Nhớ rằng tạo route đễ điều hướng dẫn đến controller vừa tạo nhé
Route::get['products', 'ProductController@index']->name['product.index'];
Route::post['products/exportFile', 'ProductController@exportFile']->name['product.export-file'];
Quay trở lại với controller. Tạo hai method index
và exportFile
trong ProductController