
🎯 1. Mục tiêu bài học
- Hiểu sâu cơ chế quản lý và truy xuất dữ liệu đa bảng tính (Multi-sheet Workbook) của thư viện
pandas. - Làm chủ tham số
sheet_name=None– “chìa khóa vàng” để ra lệnh cho Python đọc toàn bộ các Sheet cùng một lúc thay vì phải nhập tên từng Sheet thủ công. - Tự tay viết và chạy đoạn mã gộp tự động hàng chục Sheet có cấu trúc giống nhau thành một bảng tổng hợp duy nhất chỉ với 1 click chuột.
💼 2. Tình huống thực tế & Giải pháp
- 📌 Tình huống: Bạn nhận được một file báo cáo kế toán nội bộ mang tên
BaoCao_NoiBo.xlsx. Trong file này, dữ liệu bán hàng không tách thành các file riêng lẻ mà lại được chia nhỏ thành nhiều Sheet theo từng tháng:Thang_01,Thang_02,Thang_03,… Sếp muốn chú/các bạn gom tất cả dữ liệu từ các Sheet tháng này lại thành một bảng duy nhất để phân tích xu hướng cả quý. - ⚠️ Cách làm thủ công: Click vào Sheet
Thang_01$\rightarrow$ Copy $\rightarrow$ Qua Sheet tổng $\rightarrow$ Paste. Tiếp tục click sang SheetThang_02$\rightarrow$ Copy $\rightarrow$ Dán nối đuôi xuống dưới. Nếu một file có 12 Sheet (12 tháng) hoặc 52 Sheet (52 tuần), thao tác này cực kỳ tốn thời gian, nhàm chán và rất dễ nhầm lẫn khi chuyển tab liên tục. - 🚀 Giải pháp Python: Chúng ta sẽ kích hoạt chế độ đọc đa Sheet của thư viện
pandas. Python sẽ tự động duyệt qua danh sách tất cả các Sheet đang tồn tại, “bốc” dữ liệu của từng Sheet ra và xếp chồng lên nhau thành một bảng tổng hợp hoàn chỉnh trong tích tắc.
📊 3. File dữ liệu mẫu (Data Mockup)
Học viên tiến hành tạo một file Excel duy nhất mang tên là BaoCao_NoiBo.xlsx. Bên trong file này, hãy tạo ra 3 Sheet đặt tên lần lượt là: Thang_01, Thang_02, và Thang_03.
- Sheet
Thang_01: Nhập dữ liệu từ dòng 1 đến dòng 5. - Sheet
Thang_02: Nhập dữ liệu từ dòng 6 đến dòng 10. - Sheet
Thang_03: Nhập dữ liệu từ dòng 11 đến dòng 15.
(Cấu trúc các cột trong cả 3 Sheet phải đồng nhất như bảng bên dưới):
| STT | Ngay | Ma_Don_Hang | San_Pham | So_Luong | Don_Gia | Mien |
| 1 | 2026-01-05 | DH101 | Laptop Dell | 2 | 15000000 | Bac |
| 2 | 2026-01-12 | DH102 | Chuot Logitech | 10 | 250000 | Bac |
| 3 | 2026-01-15 | DH103 | Ban Phim Co | 5 | 1200000 | Bac |
| 4 | 2026-01-20 | DH104 | Man Hinh Asus | 3 | 3500000 | Bac |
| 5 | 2026-01-25 | DH105 | Tai Nghe Sony | 4 | 2000000 | Bac |
| 6 | 2026-02-02 | DH206 | iPhone 15 | 1 | 22000000 | Trung |
| 7 | 2026-02-10 | DH207 | Op Lung | 20 | 150000 | Trung |
| 8 | 2026-02-14 | DH208 | Sac Du Phong | 8 | 500000 | Trung |
| 9 | 2026-02-18 | DH209 | Cap Sac Type-C | 15 | 100000 | Trung |
| 10 | 2026-02-27 | DH210 | Loa Bluetooth | 2 | 1800000 | Trung |
| 11 | 2026-03-03 | DH311 | May In Canon | 1 | 4500000 | Nam |
| 12 | 2026-03-07 | DH312 | Giay In A4 | 50 | 65000 | Nam |
| 13 | 2026-03-19 | DH313 | Muc In | 5 | 300000 | Nam |
| 14 | 2026-03-22 | DH314 | O Cung SSD | 12 | 1200000 | Nam |
| 15 | 2026-03-29 | DH315 | USB 64GB | 25 | 180000 | Nam |
🛠️ 4. Hướng dẫn thực hành cầm tay chỉ việc
🔹 Bước 1: Chuẩn bị file
Hãy chắc chắn rằng file dữ liệu BaoCao_NoiBo.xlsx vừa tạo được lưu cùng một thư mục với file tập lệnh Python mà chú/các bạn định viết code.
🔹 Bước 2: Viết mã nguồn Python
Sao chép đoạn mã nguồn có chú thích chi tiết dưới đây và dán vào trình soạn thảo code (Jupyter Notebook hoặc VS Code):
Python
import pandas as pd
# 1. Khai báo tên file Excel nguồn cần xử lý
file_nguon = "BaoCao_NoiBo.xlsx"
print("🔄 Đang quét toàn bộ các Sheet có trong file...")
# 2. Đọc file Excel với tham số đặc biệt sheet_name=None
# Khi dùng tham số này, pandas sẽ đọc TẤT CẢ các Sheet và lưu dưới dạng một Dictionary
tat_ca_sheets_dict = pd.read_excel(file_nguon, sheet_name=None)
# 3. Tạo danh sách rỗng để chứa dữ liệu của từng Sheet đơn lẻ sau khi xử lý
danh_sach_bang_con = []
# 4. Duyệt qua Dictionary bằng vòng lặp (ten_sheet là Khóa, du_lieu_sheet là Giá trị)
# .items() giúp chúng ta lấy ra song song cả Tên Sheet và Bảng dữ liệu bên trong
for ten_sheet, du_lieu_sheet in tat_ca_sheets_dict.items():
print(f" 📋 Đang xử lý dữ liệu Sheet: {ten_sheet}")
# Tạo thêm một cột phụ để đánh dấu dòng dữ liệu này được lấy từ Sheet tháng nào
du_lieu_sheet["Nguon_Sheet"] = ten_sheet
# Thêm bảng dữ liệu của Sheet này vào danh sách tổng
danh_sach_bang_con.append(du_lieu_sheet)
# 5. Tiến hành gộp các bảng con lại thành một bảng lớn duy nhất theo trục dọc
if danh_sach_bang_con:
df_tong_hop = pd.concat(danh_sach_bang_con, ignore_index=True)
# 6. Ghi kết quả tổng hợp vào một file Excel mới mang tên 'Ket_Qua_Gop_Sheet.xlsx'
# Chúng ta đặt tên cho Sheet kết quả là 'Tong_Hop_Ca_Quy'
file_dau_ra = "Ket_Qua_Gop_Sheet.xlsx"
df_tong_hop.to_excel(file_dau_ra, sheet_name="Tong_Hop_Ca_Quy", index=False)
print("---")
print(f"🎉 THÀNH CÔNG! Dữ liệu đa Sheet đã được gộp vào file: {file_dau_ra}")
else:
print("❌ Thất bại: File Excel không có dữ liệu để xử lý.")
💡 Giải thích mã nguồn chi tiết cho dân văn phòng:
sheet_name=None: Bình thường, hàmread_excel()chỉ đọc Sheet đầu tiên hiển thị. Khi chú/các bạn thêm tham số=None, Python sẽ kích hoạt chế độ “quét toàn bộ”. Thay vì trả về một bảng dữ liệu đơn lẻ, nó trả về một “cuốn từ điển” (Dictionary) chứa tất cả các Sheet, trong đó tên Sheet là từ khóa để tra cứu dữ liệu bên trong.tat_ca_sheets_dict.items(): Lệnh này giúp vòng lặpforcó thể “cầm” được cùng lúc cả hai thông tin: tên của Sheet (ví dụ:'Thang_01') để gán vào biếnten_sheet, và toàn bộ bảng tính bên trong Sheet đó để gán vào biếndu_lieu_sheet.df_tong_hop.to_excel(..., sheet_name='Tong_Hop_Ca_Quy'): Giúp chúng ta chủ động đặt tên cho Sheet kết quả xuất ra theo đúng ý muốn báo cáo, tránh để mặc định làSheet1gây thiếu chuyên nghiệp.
📉 5. Đánh giá hiệu quả khi áp dụng bài giảng
| 📊 Tiêu chí | 📋 Click chọn, Copy và Paste thủ công trên Excel | 🤖 Tự động hóa bằng Python | 🏆 Hiệu quả thực tế |
| Thời gian thực hiện | Mất từ 5 – 10 phút tùy theo số lượng Sheet và độ lag của máy. | Luôn dưới 1 giây, tốc độ không đổi dù file có bao nhiêu Sheet. | Siêu tốc. Giải quyết triệt để tình trạng mỏi tay khi chuyển tab liên tục. |
| Độ chính xác | Rất dễ dán đè dữ liệu cũ, dán thiếu dòng hoặc bỏ sót một Sheet ở giữa. | Quét tuần tự theo danh sách hệ thống, không bỏ sót bất cứ một ô dữ liệu nào. | An toàn tuyệt đối. Giữ nguyên tính toàn vẹn và chính xác của dữ liệu gốc. |
| Tính linh hoạt | Nếu quý sau phát sinh thêm Sheet mới, chú/các bạn lại phải làm lại các thao tác từ đầu. | Tự động cập nhật. Chỉ cần file có thêm Sheet mới là Python tự nhận diện và gộp vào. | Thông minh. Hệ thống có khả năng tự co giãn theo độ lớn của dữ liệu nguồn. |
📝 6. Bài tập mở rộng tự thực hành cho học viên
- 💪 Đề bài tập: Trong thực tế, file
BaoCao_NoiBo.xlsxngoài các Sheet chứa dữ liệu tháng nhưThang_01,Thang_02… thì thường có thêm các Sheet thông tin phụ, ví dụ SheetHuongDan(chứa ghi chú sử dụng file) hoặc SheetDanhMuc(chứa mã nhân viên, mã sản phẩm quy đổi). Nếu đoạn code trên gộp cả dữ liệu từ các Sheet này vào bảng tổng hợp thì dữ liệu báo cáo sẽ bị sai lệch hoàn toàn.Yêu cầu: Hãy chỉnh sửa đoạn code ở Bước 2 để Python thông minh hơn: Chỉ tiến hành gộp những Sheet nào có tên chứa chữ"Thang_"và tự động bỏ qua (skip) tất cả các Sheet thông tin phụ khác. - 💡 Hướng dẫn gợi ý: Chú/các bạn sử dụng cấu trúc điều kiện
if "Thang_" in ten_sheet:lồng vào bên trong vòng lặpfor. Nếu điều kiện này đúng (tên Sheet chứa chữ “Thang_”) thì mới thực hiện lệnhdf_tong_hop.append(), ngược lại sẽ bỏ qua Sheet đó.