Lời nói đầu
- Bài viết này xuất phát từ một bài toán cũng khá hay gặp trong thực tế, đó là khi quản lí của bạn hoặc các bộ phận
non-tech
trong công ty muốn xem danh sách thống kê của hệ thống (danh sách người dùng/sản phẩm/…). Có 2 phương án có thể được sử dụng:- Cách 1: Bạn tạo tài khoản có quyền admin trên server product cho họ tự vào trang admin xem.
- Cách 2: Bạn sẽ lấy từ CSDL, xuất ra file Excel để tiện cho việc tính toán, thống kê sau này.
- Nếu bạn chọn cách 1, bài toán được giải quyết trong 1 nốt nhạc và bạn cũng sẽ không cần phải đọc tiếp nữa đâu, còn nếu bạn chọn cách 2, bài viết này chính là thứ bạn cần. Và công cụ chúng ta sẽ sử dụng là package
maatwebsite/excel
. - Và đây là một số ưu điểm mà Laravel Excel đưa ra:
- Dễ dàng export/import collections ra file Excel.
- Tự động chunking (chia nhỏ) collections để tổi ưu performance.
- Đọc file Excel theo từng nhóm/khối (chunks).
- Xử lí import theo từng batch.
Nội dung
Cài đặt
Trước khi tiến hành cài đặt thì chúng ta cùng xem qua một số requirement để lựa chọn phiên bản phù hợp nhé. Còn nếu bạn làm với mục đích tìm tòi học hỏi thì mình nghĩ cứ phiên bản mới nhất (tại thời điểm viết bài là phiên bản 3.1) mà chiến thôi
Version Require Laravel Require PHP Support Time 2.1 <= 5.6 <= 7.0 Unsupported since 15-5-2018 3.0 ^5.5 ^7.0 Unsupported since 31-12-2018 3.1 ^5.5/^6.0 ^7.1 New features Ngoài yêu cầu về phiên bản của PHP và Laravel thì còn một số yêu cầu khác như:
PhpSpreadsheet
: ^1.6 (đối với version 3.1)- PHP extension
php_zip
is enabled. - PHP extension
php_xml
is enabled. - PHP extension
php_gd2
is enabled.
Khi đã đảm bảo rằng môi trường bạn cài đặt đã đáp ứng đủ các yêu cầu thì bạn có thể cài đặt thông qua composer với câu lệnh:
12composer require maatwebsite/excelSau đó bạn kiểm tra trong file
config/app.php
phần providers và alias xem đã có Maatwebsite chưa, bình thường thì nó sẽ được tự động add vào sau khi chạy câu lệnh cài đặt:123456789101112<span class="token single-quoted-string string">'providers'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token comment">/** Package Service Providers...*/</span>Maatwebsite<span class="token package">Excel<span class="token punctuation"></span>ExcelServiceProvider</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token keyword">class</span><span class="token punctuation">,</span><span class="token punctuation">]</span><span class="token single-quoted-string string">'aliases'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token single-quoted-string string">'Excel'</span> <span class="token operator">=</span><span class="token operator">></span> Maatwebsite<span class="token package">Excel<span class="token punctuation"></span>Facades<span class="token punctuation"></span>Excel</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token keyword">class</span><span class="token punctuation">,</span><span class="token punctuation">]</span>Cuối cùng để publish config, chúng ta chạy câu lệnh bên dưới thì sẽ tạo ra một file config
config/excel.php
chứa các thiết lập cần thiết.12php artisan vendor:publish --provider<span class="token operator">=</span><span class="token string">"MaatwebsiteExcelExcelServiceProvider"</span>
Export
Để có thể thực hiện chức năng export ra file Excel, việc đầu tiên ta cần làm là tạo 1 class export trong thư mục
appExports
.- Cách 1: sử dụng câu lệnh12php artisan make:export XxxExport --model<span class="token operator">=</span>Xxx
- Cách 2: tạo thủ công bằng tay theo đường dẫn
appExports
:123456789101112131415<span class="token php language-php"><span class="token delimiter important"><?php</span><span class="token keyword">namespace</span> <span class="token package">App<span class="token punctuation"></span>Exports</span><span class="token punctuation">;</span><span class="token keyword">use</span> <span class="token package">App<span class="token punctuation"></span>Models<span class="token punctuation"></span>Xxx</span><span class="token punctuation">;</span><span class="token keyword">use</span> <span class="token package">Maatwebsite<span class="token punctuation"></span>Excel<span class="token punctuation"></span>Concerns<span class="token punctuation"></span>FromCollection</span><span class="token punctuation">;</span><span class="token keyword">class</span> <span class="token class-name">XxxExport</span> <span class="token keyword">implements</span> <span class="token class-name">FromCollection</span><span class="token punctuation">{</span><span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">collection</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token keyword">return</span> Xxx<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">all</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">}</span></span>
- Cách 1: sử dụng câu lệnh
Tiếp theo là thêm function export vào trong controller để thực hiện export file:
12345678910111213141516<span class="token php language-php"><span class="token delimiter important"><?php</span><span class="token keyword">namespace</span> <span class="token package">App<span class="token punctuation"></span>Http<span class="token punctuation"></span>Controllers</span><span class="token punctuation">;</span><span class="token keyword">use</span> <span class="token package">App<span class="token punctuation"></span>Exports<span class="token punctuation"></span>XxxExport</span><span class="token punctuation">;</span><span class="token keyword">use</span> <span class="token package">Maatwebsite<span class="token punctuation"></span>Excel<span class="token punctuation"></span>Facades<span class="token punctuation"></span>Excel</span><span class="token punctuation">;</span><span class="token keyword">class</span> <span class="token class-name">XxxController</span> <span class="token keyword">extends</span> <span class="token class-name">Controller</span><span class="token punctuation">{</span><span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">export</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token keyword">return</span> Excel<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">download</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">XxxExport</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'xxxx.xlsx'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//download file export</span><span class="token keyword">return</span> Excel<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">store</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">XxxExport</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'xxxx.xlsx'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'disk-name'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//lưu file export trên ổ cứng</span><span class="token punctuation">}</span><span class="token punctuation">}</span></span>Và 1 route để gọi controller đó
12Route<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'xxxs/export/'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'<a href="/cdn-cgi/l/email-protection" class="__cf_email__">[email protected]</a>'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>Bên trên là các bước đơn giản để có thể export file, ngoài ra, có thể bạn sẽ cần custom 1 số thứ ví dụ như:
Định dạng file export: mặc định thì phần đuôi file
.xlsx
sẽ xác định định dạng của file. Tuy nhiên bạn cũng có thể truyền thêm tham số để có thể khai báo 1 cách rõ ràng hơn ntn123456<span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">XxxExport</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">download</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'xxx.xlsx'</span><span class="token punctuation">,</span> <span class="token package">Maatwebsite<span class="token punctuation"></span>Excel<span class="token punctuation"></span>Excel</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">XLSX</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//ngoài ra còn có các định dạng khác thường dùng như </span><span class="token comment">// - MaatwebsiteExcelExcel::CSV</span><span class="token comment">// - MaatwebsiteExcelExcel::XLS</span><span class="token comment">// - MaatwebsiteExcelExcel::HTML</span>Định dạng cột dữ liệu:
- Nếu bạn muốn tự động điều chỉnh độ rộng cột, bạn chỉ cần implement thêm
ShouldAutoSize
.123456789<span class="token keyword">namespace</span> <span class="token package">App<span class="token punctuation"></span>Exports</span><span class="token punctuation">;</span><span class="token keyword">use</span> <span class="token package">Maatwebsite<span class="token punctuation"></span>Excel<span class="token punctuation"></span>Concerns<span class="token punctuation"></span>ShouldAutoSize</span><span class="token punctuation">;</span><span class="token keyword">class</span> <span class="token class-name">InvoicesExport</span> <span class="token keyword">implements</span> <span class="token class-name">ShouldAutoSize</span><span class="token punctuation">{</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">}</span> - Để định dạng dữ liệu đặc biệt (ngày tháng/tiền) thì bạn sẽ cần implement
WithColumnFormatting
.1234567891011<span class="token keyword">class</span> <span class="token class-name">InvoicesExport</span> <span class="token keyword">implements</span> <span class="token class-name">WithColumnFormatting</span><span class="token punctuation">{</span><span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">columnFormats</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">array</span><span class="token punctuation">{</span><span class="token keyword">return</span> <span class="token punctuation">[</span><span class="token single-quoted-string string">'B'</span> <span class="token operator">=</span><span class="token operator">></span> NumberFormat<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">FORMAT_DATE_DDMMYYYY</span><span class="token punctuation">,</span><span class="token single-quoted-string string">'C'</span> <span class="token operator">=</span><span class="token operator">></span> NumberFormat<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">FORMAT_CURRENCY_EUR_SIMPLE</span><span class="token punctuation">,</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">}</span>
- Nếu bạn muốn tự động điều chỉnh độ rộng cột, bạn chỉ cần implement thêm
Viết test cho chức năng export: nếu các bạn đã từng chật vật với automation test (unit/feature) thì anh em chắc chắn sẽ thích điều này vì trong document của Laravel Excel đã hướng dẫn viết test cho bạn rồi. Tất nhiên là bạn phải tự custom cho phù hợp với project của bạn nhé
12345678910111213141516<span class="token comment">/*** @test*/</span><span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">user_can_download_invoices_export</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>Excel<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">fake</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">actingAs</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">givenUser</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">get</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'/invoices/download/xlsx'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>Excel<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">assertDownloaded</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'filename.xlsx'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span>InvoicesExport <span class="token variable">$export</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment">// Assert that the correct export is downloaded.</span><span class="token keyword">return</span> <span class="token variable">$export</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">collection</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">contains</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'#2018-01'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span>
Import
Import về cơ bản cũng tương tự với export, bao gồm tạo một import class trong thư mục
appImportsXxxxImport.php
và thêm functionimport
vào trong controller như sau:1234567891011121314151617181920212223<span class="token php language-php"><span class="token delimiter important"><?php</span><span class="token keyword">namespace</span> <span class="token package">App<span class="token punctuation"></span>Imports</span><span class="token punctuation">;</span><span class="token keyword">use</span> <span class="token package">App<span class="token punctuation"></span>Xxx</span><span class="token punctuation">;</span><span class="token keyword">use</span> <span class="token package">Maatwebsite<span class="token punctuation"></span>Excel<span class="token punctuation"></span>Concerns<span class="token punctuation"></span>ToModel</span><span class="token punctuation">;</span><span class="token keyword">class</span> <span class="token class-name">XxxImport</span> <span class="token keyword">implements</span> <span class="token class-name">ToModel</span><span class="token punctuation">{</span><span class="token comment">/*** @param array $row** @return Xxx|null*/</span><span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">model</span><span class="token punctuation">(</span><span class="token keyword">array</span> <span class="token variable">$row</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">User</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'name'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token variable">$row</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token single-quoted-string string">'email'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token variable">$row</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">}</span></span>1234567891011121314<span class="token keyword">use</span> <span class="token package">App<span class="token punctuation"></span>Imports<span class="token punctuation"></span>XxxImport</span><span class="token punctuation">;</span><span class="token keyword">use</span> <span class="token package">Maatwebsite<span class="token punctuation"></span>Excel<span class="token punctuation"></span>Facades<span class="token punctuation"></span>Excel</span><span class="token punctuation">;</span><span class="token keyword">use</span> <span class="token package">App<span class="token punctuation"></span>Http<span class="token punctuation"></span>Controllers<span class="token punctuation"></span>Controller</span><span class="token punctuation">;</span><span class="token keyword">class</span> <span class="token class-name">XxxController</span> <span class="token keyword">extends</span> <span class="token class-name">Controller</span><span class="token punctuation">{</span><span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">import</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>Excel<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">import</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">XxxImport</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'xxxx.xlsx'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">return</span> <span class="token function">redirect</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'/'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">with</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'success'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'All good!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">}</span>Tất nhiên thực tế sẽ không đơn giản như vậy mà bạn sẽ cần phải tuỳ chỉnh thêm một số chứ năng nữa:
Validate dữ liệu: có người từng nói với mình rằng, đừng baoh tin vào “người dùng”. Đó là lí do vì sao bạn phải validate tất cả những gì mà người dùng nhập/submit vào hệ thống của bạn. Và khi import dữ liệu, thì bạn cũng sẽ phải validate dữ liệu trong sheet có hợp lệ hay không.
Và để có thể validate dữ liệu các cột import dữ liệu, bạn sẽ cần thêm method
rule()
vào trong import class. Để tham khảo thêm nhiều rule khác, bạn có thể xem ở đây.123456789<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">rules</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">array</span><span class="token punctuation">{</span><span class="token keyword">return</span> <span class="token punctuation">[</span><span class="token single-quoted-string string">'1'</span> <span class="token operator">=</span><span class="token operator">></span> Rule<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">in</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'<a href="/cdn-cgi/l/email-protection" class="__cf_email__">[email protected]</a>'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token comment">// ngoài việc sử dụng số thứ tự các cột, bạn cũng có thể sử dụng tên cột để validate như sau: </span><span class="token single-quoted-string string">'email'</span> <span class="token operator">=</span><span class="token operator">></span> Rule<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">in</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'<a href="/cdn-cgi/l/email-protection" class="__cf_email__">[email protected]</a>'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token comment">//để sử dụng được tên cột, bạn cần implement thêm `WithHeadingRow` vào trong import class.</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token punctuation">}</span>Ngoài ra, bạn cũng sẽ cần hiển thị thông báo validate message cho người dùng biết để thay đổi dữ liệu cho phù hợp với
customValidationMessages()
1234567<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">customValidationMessages</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token keyword">return</span> <span class="token punctuation">[</span><span class="token single-quoted-string string">'1.in'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'Custom message for :attribute.'</span><span class="token punctuation">,</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token punctuation">}</span>Progress Bar (trong command console): đây cũng là 1 chức năng khá hay, đối với việc import lượng dữ liệu lớn, bạn sẽ cần phải theo dõi xem quá trình import đã thực hiện được đến đâu thay vì phải ngồi chờ trong vô vọng mà ko biết phải chờ đến bao giờ
. Đầu tiên, bạn cần phải implement
WithProgressBar
vào trong import class ở đường dẫnappImportsXxxImport
, sau đó tạo một command để chạy chức năng import, ví dụ như sau:123456789101112131415161718192021<span class="token php language-php"><span class="token delimiter important"><?php</span><span class="token keyword">namespace</span> <span class="token package">App<span class="token punctuation"></span>Console<span class="token punctuation"></span>Commands</span><span class="token punctuation">;</span><span class="token keyword">use</span> <span class="token package">App<span class="token punctuation"></span>Imports<span class="token punctuation"></span>UsersImport</span><span class="token punctuation">;</span><span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation"></span>Console<span class="token punctuation"></span>Command</span><span class="token punctuation">;</span><span class="token keyword">class</span> <span class="token class-name">ImportExcel</span> <span class="token keyword">extends</span> <span class="token class-name">Command</span><span class="token punctuation">{</span><span class="token keyword">protected</span> <span class="token variable">$signature</span> <span class="token operator">=</span> <span class="token single-quoted-string string">'import:excel'</span><span class="token punctuation">;</span><span class="token keyword">protected</span> <span class="token variable">$description</span> <span class="token operator">=</span> <span class="token single-quoted-string string">'Laravel Excel importer'</span><span class="token punctuation">;</span><span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">handle</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">output</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">title</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'Starting import'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">UsersImport</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">withOutput</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">output</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">import</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'users.xlsx'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">output</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">success</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'Import successful'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">}</span></span>Và khi bạn gõ lệnh
php artisan import:excel
để thực hiện quá trình import, bạn sẽ thấy tiêu đềStarting import
, thanhprogress bar
và thông báo thành công sau khi import (nếu ko có lỗi)Import successful
.Viết test: tương tự như phần export thì Laravel Excel cũng đã cung cấp test mẫu cho phần Import, bạn có thể tham khảo ở trong link document nhé, mình sẽ không liệt kê lại trong đây nữa.
Lời kết
Bản thân mình thấy đây là một chức năng khá cần thiết khi bạn cần import/export dữ liệu, data một cách nhanh chóng. Nếu bài viết có ích, hãy upvote ủng hộ mình nhé. Còn nếu bạn thấy còn điều gì “lấn cấn”, hãy comment xuống phía dưới để chúng ta cùng thảo luận nhé!
Cảm ơn các bạn đã dành thời gian ủng hộ bài viết của mình!