Hẳn là một nội dung mà bạn đã từng nghĩ đến khi làm việc với các bài toán và cần một số liệu thống kê cụ thể. Xét đừng trên khía cạnh một người dùng hệ thống thì việc export dữ liệu dưới dạng bảng exel là cần thiết. Bởi vì dưới dạng dữ liệu excel này nó sẽ tận dụng được tổ hợp các công cụ mà excel cung cấp và quan trọng hơn cả là các thiết kế bảng báo cáo excel dựa trên dữ liệu export là rất trực quan và cần thiết cho các kế toán, báo cáo. Ở bài viết này mình sẽ chia sẻ kinh nghiệm về cách mà mình đã export file excel như thế nào. Bài viết được đề cập qua ba phần chính
- Các cách để export ra dữ liệu excel
- Export excel trực tiếp từ xử lý logic
- Export excel bằng cách tạo file trên hệ thống và create link trỏ tới file.
1. Cách để export ra dữ liệu excel
Hiện tại theo như cách làm việc của mình thì có 2 cách chính để export ra dữ liệu dưới dạng excel
- Cách 1 Export từ phía client: Nghĩa là thao tác chính để tạo 1 file excel sẽ được xử lý hết ở client. Dữ liệu sau khi được call ajax và response về sẽ được các thư viện ở client xử lý và tạo file excel để người dùng download. Có thể kể đến thư viện datatable rất nổi bật xử lý việc này, xem thêm tại đây
- Ưu điểm: Do mọi việc tạo file được xử lý tại client => Server không phải tốn công xử lý tạo file excel => giảm bớt hao tổn tài nguyên server
- Nhược điểm:
- Với dữ liệu to, cồng kềnh, phức tạp: Khi dữ liệu to và cồng kềnh việc truy vấn data từ server trở nên phức tạp, hơn nữa máy client nếu mà yếu thì thôi khỏi cần phải nói, chắc chắc là sẽ đơ cả cái máy client mà người dùng sử dụng luôn. Điều này sẽ gây ác cảm với người dùng hệ thống
- Các xử lý bảo mật. Một số xử lý để loại bỏ bớt thông tin dư thừa từ phía client có thể vô tình giúp các dân chơi đọc được các cấu trúc cũng như một số thông tin cần private. Về khoản này thì nó là không hề tốt chút nào các bạn nhỉ
- => Kết luận: Chỉ nên áp dụng vơi hệ thống nhỏ, với các hệ thống cồng kềnh và lớn hơn ta nên sử dụng Cách 2 dưới đây
- Cách 2 Export từ phía server: Nghĩa là tất cả các xử lý từ truy vấn ra data, tạo file excel đều được xử lý trên máy chủ. Phía client chỉ cần nhận file và tải về.
- Ưu điểm:
- Mọi xử lý là trên server => vì vậy các thông tin và các xử lý bảo mật gần như là private hết => Dữ liệu hệ thống của bạn có thể coi là an toàn
- Giải quyết bài toán dữ liệu to, phức tạp: Vì mọi xử lý dữ liệu phức tạp được xử lý trên máy chủ rồi và client chỉ nhận file thôi nên bạn sẽ đảm bảo là hệ thống ở phía client của bạn sẽ không bị trễ. Giờ đây không phải lo lỗi responding từ xử lý client => Vậy là giải quyết được thêm bài toán về trải nghiệm người dùng :D.
- Nhược điểm:
- Tốn xử lý tài nguyên trên server => Yêu cầu bạn phải cung cấp 1 máy chủ cấu hình cao đáp ứng (Đương nhiên với một hệ thống với đầy dẫy dữ liệu to và phức tạp thì máy chủ của bạn cũng phải có cấu hình sao cho phù hợp rồi, vâng bạn không thể xử dụng 1 máy chủ Ram 1G để xử lý hệ thống có lượng request trên 1 triệu một ngày được. Cũng giống như không thể bắt cá nhiều tay khi mà túi tiền chỉ có đủ xài cho 1 tay được 🙃)
Về lời khuyên của mình thì tùy vào nhu cầu của hệ thống mà bạn áp dụng cho các trường hợp sao cho phù hợp. Ở bài viết này mình sẽ chỉ hướng dẫn cách tạo file excel trên server, và cách tạo cũng đi theo 2 hướng chính
- Export excel trực tiếp từ xử lý logic: nghĩa là ngay khi server xử lý xong nó sẽ export và send ra file xuống client ngay, không có hành vi ghi và lưu trữ lại file trên server
- Export excel bằng cách tạo file trên hệ thống và create link trỏ tới file: Xử lý này sẽ tạo 1 file excel dựa trên dữ liệu chỉ định. Sau đó nó sẽ trả ra 1 liên kết trỏ tới file excel này. Người dùng sẽ kích vào liên kết này và tiến hành tải về. Thứ tự của nó là: Client request export file => server xử lý tạo file excel => server create link trỏ tới file excel => server response liên kết xuống cho client => client hiển thị liên kết này => người dùng click download.
Dưới đây là 2 mục mô tả chi tiết cho 2 phần đó
2. Export excel trực tiếp từ xử lý logic
- Chuẩn bị: Tạo 1 project có cấu trúc trông giống như thế này
- Có rất nhiều thư viện export file excel tuy nhiên ở đây mình sẽ sử dụng thư viện chính để làm việc với export file excel là thư viện node-xlsx. Oke nhìn vào cấu trúc trên và phần giải thích tương ứng thì bạn có thể phần nào hình dung được hệ thống của mình. Để không mất thời gian mình muốn các bạn tập chung vào file chính là file router.js. Các cấu hình trên các tập tin còn lại các bạn có thể clone source code của mình để dưới cuối bài viết. Nào mình cùng vào xem file mã của router.js có gì nào 😃
- Với file đính kèm mình cũng giải thích khá ổn rồi... giờ bạn tiến hành run project và test thử xem sao nhé: chạy với lệnh node app.js
Truy cập http://localhost:82 và click button Export and download file để xem kết quả xem sao nhé
3. Export excel bằng cách tạo file trên hệ thống và create link trỏ tới file.
- Vẫn là file router.js trên bạn thêm vào một router như thế này nhé
- Về cơ bản router config '/create-link' này không khác với router 'export-download' là bao.. Có điều đoạn gần cuối của nó thay vì attach file với res.attachment. ... để gửi xuống file ngay thì trong router này lại tạo ra một file excel trên hệ thống và tạo liên kết trỏ tới file đó trên hệ thống => gửi liên kết đó xuống client.
- Giờ bạn truy cập vào http://localhost:82 và click vào button 'Export and create link download file', giờ thì click vào thử xem sao nhé. Nó sẽ tự động redirect sang liên kết http://localhost:82/create-link. Tại page này có một liên kết download file. bạn click vào và sẽ download được file excel xuống
Oke vậy là mình đã hướng dẫn các bạn export file excel trên server theo 2 cách rùi nhé.. Cách mà mình thấy các hệ thống lớn hay sử dụng bây giờ là export và tạo link. Tuy nhiên tùy vào các trường hợp các bạn có thể áp dụng dụng sao cho linh động vào phù hợp. Cách export với client cũng không phải là một giải pháp tồi. Vì vậy hãy kết hợp các cách sử dụng trên cho các tình huống sao cho phù hợp nhất bạn nhé. Mình cũng xin kết thúc bài viết tại đây, nếu thấy hữu ích thi bạn hãy chia sẻ và đừng quên bình luận quan điểm của mình về các cách mà các bạn đang sử dụng nhé!
https://github.com/NguyenManh94/node_excel_example.git