📗 BÀI 3: QUÉT VÀ GỘP DỮ LIỆU TỪ NHIỀU SHEET TRONG CÙNG MỘT FILE EXCEL

🎯 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 Sheet Thang_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):

STTNgayMa_Don_HangSan_PhamSo_LuongDon_GiaMien
12026-01-05DH101Laptop Dell215000000Bac
22026-01-12DH102Chuot Logitech10250000Bac
32026-01-15DH103Ban Phim Co51200000Bac
42026-01-20DH104Man Hinh Asus33500000Bac
52026-01-25DH105Tai Nghe Sony42000000Bac
62026-02-02DH206iPhone 15122000000Trung
72026-02-10DH207Op Lung20150000Trung
82026-02-14DH208Sac Du Phong8500000Trung
92026-02-18DH209Cap Sac Type-C15100000Trung
102026-02-27DH210Loa Bluetooth21800000Trung
112026-03-03DH311May In Canon14500000Nam
122026-03-07DH312Giay In A45065000Nam
132026-03-19DH313Muc In5300000Nam
142026-03-22DH314O Cung SSD121200000Nam
152026-03-29DH315USB 64GB25180000Nam

🛠️ 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àm read_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ặp for có 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ến ten_sheet, và toàn bộ bảng tính bên trong Sheet đó để gán vào biến du_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à Sheet1 gâ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ệnMấ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ácRấ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ạtNế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.xlsx ngoà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ụ Sheet HuongDan (chứa ghi chú sử dụng file) hoặc Sheet DanhMuc (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ặp for. Nếu điều kiện này đúng (tên Sheet chứa chữ “Thang_”) thì mới thực hiện lệnh df_tong_hop.append(), ngược lại sẽ bỏ qua Sheet đó.
Scroll to Top