Chuyển đến nội dung chính

Hướng dẫn Python Excel: Cẩm nang đầy đủ với openpyxl

Học cách đọc và ghi tệp Excel trong Python bằng openpyxl. Hướng dẫn này bao gồm công thức, biểu đồ, định dạng ô và thao tác worksheet với ví dụ thực hành
Đã cập nhật 5 thg 6, 2026  · 15 phút đọc

Một hạn chế của Excel là không thể xử lý được lượng dữ liệu quá lớn. Bạn có thể gặp vấn đề hiệu năng nghiêm trọng khi cố gắng thực hiện các phép tính phức tạp trên nhiều bản ghi trong Excel, đặc biệt nếu công thức và macro của bạn không được tối ưu cho hiệu suất.

Excel cũng có thể rất tốn thời gian nếu bạn cần thực hiện các tác vụ lặp đi lặp lại. Ví dụ, nếu hằng tuần bạn phải lặp lại một phân tích trên nhiều tệp Excel, bạn sẽ phải mở thủ công và sao chép dán cùng một công thức hết lần này đến lần khác.

Các khảo sát cho thấy 93% người dùng Excel nhận thấy việc hợp nhất bảng tính tốn thời gian, và nhân viên dành khoảng 12 giờ mỗi tháng chỉ để ghép các tệp Excel khác nhau.

Những hạn chế này có thể được giải quyết bằng cách tự động hóa quy trình Excel với Python. Các tác vụ như hợp nhất bảng tính, làm sạch dữ liệu và mô hình dự đoán có thể hoàn thành trong vài phút bằng một script Python đơn giản ghi ra tệp Excel.

Người dùng Excel cũng có thể thiết lập một script tự động bằng Python chạy theo lịch, loại bỏ công việc thủ công lặp lại.

Trong bài viết này, tôi sẽ hướng dẫn bạn từng bước cách:

  • Dùng openpyxl để đọc và ghi tệp Excel bằng Python
  • Tạo phép toán số học và công thức Excel trong Python
  • Thao tác các trang tính Excel bằng Python
  • Xây dựng trực quan hóa trong Python và lưu vào tệp Excel
  • Định dạng màu sắc và kiểu ô trong Excel bằng Python

Tóm tắt nhanh (TL;DR)

  • Cài đặt openpyxl với pip install openpyxl

  • Nạp bất kỳ tệp .xlsx bằng openpyxl.load_workbook('file.xlsx'); truy cập sheet qua wb.active hoặc wb['SheetName']

  • Đọc giá trị ô với ws['A1'].value; lặp qua các hàng với ws.iter_rows(values_only=True)

  • Ghi vào ô với ws['A1'] = 'value' và lưu thay đổi bằng wb.save('file.xlsx')

  • Tạo công thức Excel, biểu đồ cột, biểu đồ đường và định dạng có điều kiện hoàn toàn từ Python—không cần mở Excel

Yêu cầu tiên quyết

Để theo dõi, bạn cần:

  • Python 3.8 hoặc mới hơn được cài trên máy

  • Kiến thức cơ bản về Python (biến, vòng lặp, hàm)

  • Đã cài openpyxl (pip install openpyxl)

  • Một trình xem bảng tính (Excel, Google Sheets, hoặc LibreOffice Calc) để kiểm tra tệp đầu ra

Tải bộ dữ liệu doanh số trò chơi điện tử dùng trong hướng dẫn này từ kho GitHub này.

Giới thiệu về Openpyxl

Openpyxl là một thư viện Python cho phép người dùng đọc tệp Excel và ghi vào chúng.

Khung này giúp bạn viết hàm, định dạng bảng tính, tạo báo cáo và xây dựng biểu đồ trực tiếp trong Python mà không cần mở ứng dụng Excel.

Openpyxl cũng cho phép bạn lặp qua các worksheet và chạy cùng một phân tích trên nhiều tập dữ liệu trong một lượt.

Điều này giúp tự động hóa công việc Excel lặp đi lặp lại trên bất kỳ số lượng worksheet nào trở nên đơn giản.

Openpyxl vs. Pandas: Chọn công cụ phù hợp

Một câu hỏi thường gặp là nên dùng openpyxl hay pandas cho công việc với Excel. Câu trả lời phụ thuộc vào việc bạn cần làm gì.

Tác vụ openpyxl pandas
Đọc dữ liệu từ Excel
Ghi dữ liệu ra Excel Có (qua to_excel())
Định dạng ô (phông chữ, màu sắc, đường viền) Không
Tạo biểu đồ bên trong tệp Excel Không
Dùng công thức Excel Không
Phân tích và biến đổi dữ liệu Giới hạn
Tệp rất lớn (>100k hàng) Dùng read_only=True Mặc định dùng bộ nhớ hiệu quả hơn

Dùng openpyxl khi bạn cần kiểm soát giao diện và cấu trúc của tệp Excel—định dạng, biểu đồ, công thức. Dùng pandas khi bạn cần lọc, tổng hợp hoặc chuyển dạng dữ liệu. Hướng dẫn pandas trong Python của chúng tôi trình bày sâu phần phân tích dữ liệu.

Cách cài đặt Openpyxl

Để cài đặt openpyxl, mở terminal hoặc PowerShell và chạy:

pip install openpyxl

Bạn sẽ thấy thông báo sau cho biết gói đã được cài đặt thành công:

Openpyxl cài đặt thành công

Đọc tệp Excel trong Python với Openpyxl

Chúng ta sẽ dùng bộ dữ liệu Doanh số Trò chơi Điện tử của Kaggle trong hướng dẫn này. Bộ dữ liệu đã được tiền xử lý cho mục đích hướng dẫn và bạn có thể tải phiên bản đã chỉnh sửa từ liên kết này. Bạn có thể nhập Excel vào Python theo quy trình dưới đây:

Nạp workbook

Sau khi tải bộ dữ liệu, nhập thư viện Openpyxl và nạp workbook vào Python:

import openpyxl 

wb = openpyxl.load_workbook('videogamesales.xlsx')

Giờ tệp Excel đã được nạp thành đối tượng Python, bạn cần cho thư viện biết sẽ truy cập worksheet nào. Có hai cách:

Cách thứ nhất là gọi worksheet đang hoạt động, tức sheet đầu tiên trong workbook, bằng dòng lệnh sau:

ws = wb.active

Ngoài ra, nếu bạn biết tên worksheet, bạn cũng có thể truy cập bằng tên. Chúng ta sẽ dùng sheet “vgsales” trong phần này của hướng dẫn:

ws = wb['vgsales']

Bây giờ hãy đếm số hàng và cột trong worksheet này:

print('Total number of rows: '+str(ws.max_row)+'. And total number of columns: '+str(ws.max_column))

Đoạn mã trên sẽ cho kết quả sau:

Total number of rows: 16328. And total number of columns: 10

Nay chúng ta đã biết kích thước của sheet, hãy tiếp tục học cách đọc dữ liệu từ workbook.

Đọc tệp lớn hiệu quả

Với các workbook có nhiều hàng, hãy mở ở chế độ chỉ đọc để tránh nạp toàn bộ tệp vào bộ nhớ:

import openpyxl

wb = openpyxl.load_workbook('videogamesales.xlsx', read_only=True)
ws = wb.active

for row in ws.iter_rows(values_only=True):
    print(row)

Chế độ chỉ đọc truyền từng hàng một thay vì giữ toàn bộ workbook trong RAM. Bạn không thể ghi lại vào một workbook mở theo cách này, nên hãy dành nó cho các pipeline chủ yếu đọc trên tập dữ liệu lớn.

Đọc dữ liệu từ một ô

Đây là ảnh chụp sheet đang hoạt động mà chúng ta sẽ làm việc trong phần này:

Dữ liệu doanh số trò chơi điện tử

Để lấy dữ liệu từ một ô cụ thể với Openpyxl, bạn có thể gọi giá trị của ô như sau:

print(f"The value in cell A1 is: {ws['A1'].value}")

Bạn sẽ nhận được kết quả sau:

The value in cell A1 is: Rank

Đọc dữ liệu từ nhiều ô

Giờ khi đã biết cách đọc dữ liệu từ một ô cụ thể, nếu chúng ta muốn in tất cả giá trị ô trong một hàng nhất định của bảng tính thì sao?

Để làm điều này, bạn có thể viết một vòng lặp for đơn giản để lặp qua tất cả giá trị trong một hàng cụ thể:

values = [ws.cell(row=1,column=i).value for i in range(1,ws.max_column+1)]
print(values)

Đoạn mã trên sẽ in toàn bộ giá trị trong hàng đầu tiên:

['Rank', 'Name', 'Platform', 'Year', 'Genre', 'Publisher', 'NA_Sales', 'EU_Sales', 'JP_Sales', 'Other_Sales']

Tiếp theo, hãy thử in nhiều hàng trong một cột cụ thể.

Chúng ta sẽ tạo một vòng lặp for để hiển thị mười hàng đầu tiên trong cột “Name” dưới dạng danh sách. Chúng ta sẽ nhận được các tên được đánh dấu trong khung đỏ dưới đây:

Cột tên trò chơi điện tử

data=[ws.cell(row=i,column=2).value for i in range(2,12)]
print(data)

Đoạn mã trên sẽ tạo ra kết quả sau:

['Wii Sports', 'Super Mario Bros.', 'Mario Kart Wii', 'Wii Sports Resort', 'Pokemon Red/Pokemon Blue', 'Tetris', 'New Super Mario Bros.', 'Wii Play', 'New Super Mario Bros. Wii', 'Duck Hunt']

Cuối cùng, hãy in mười hàng đầu tiên trong một dải cột của bảng tính:

# reading data from a range of cells (from column 1 to 6)

my_list = list()

for value in ws.iter_rows(
    min_row=1, max_row=11, min_col=1, max_col=6, 
    values_only=True):
    my_list.append(value)
    
for ele1,ele2,ele3,ele4,ele5,ele6 in my_list:
    (print ("{:<8}{:<35}{:<10}
             {:<10}{:<15}{:<15}".format(ele1,ele2,ele3,ele4,ele5,ele6)))

Mười hàng đầu tiên trong sáu cột đầu sẽ được hiển thị sau khi bạn chạy đoạn mã trên:

xếp hạng trò chơi điện tử

Ghi vào tệp Excel với Openpyxl

Giờ khi đã biết cách truy cập và đọc dữ liệu từ tệp Excel, hãy học cách ghi vào chúng bằng Openpyxl.

Ghi vào một ô

Có hai cách bạn có thể ghi vào tệp với Openpyxl.

Đầu tiên, bạn có thể truy cập trực tiếp ô bằng khóa của nó:

ws['K1'] = 'Sum of Sales'

Một cách khác là chỉ định vị trí hàng và cột của ô bạn muốn ghi:

ws.cell(row=1, column=11, value = 'Sum of Sales')

Mỗi khi bạn ghi vào tệp Excel với Openpyxl, bạn cần lưu thay đổi bằng dòng lệnh sau, nếu không chúng sẽ không được phản ánh trong worksheet:

wb.save('videogamesales.xlsx')

Nếu workbook đang mở khi bạn cố lưu, bạn sẽ gặp lỗi quyền như sau:

Lỗi quyền

Hãy đảm bảo đóng tệp Excel trước khi lưu thay đổi. Sau đó bạn có thể mở lại để kiểm tra thay đổi đã xuất hiện trong worksheet:

Dữ liệu trò chơi điện tử với cột mới

Lưu ý rằng một cột mới tên “Sum of Sales” đã được tạo ở ô K1.

Tạo một cột mới

Giờ hãy cộng tổng doanh số ở mọi khu vực và ghi vào cột K.

Chúng ta sẽ làm điều này cho dữ liệu doanh số ở hàng đầu tiên:

row_position = 2
col_position = 7

total_sales = ((ws.cell(row=row_position, column=col_position).value)+
               (ws.cell(row=row_position, column=col_position+1).value)+
               (ws.cell(row=row_position, column=col_position+2).value)+
               (ws.cell(row=row_position, column=col_position+3).value))

ws.cell(row=2,column=11).value=total_sales
wb.save('videogamesales.xlsx')

Lưu ý rằng tổng doanh số đã được tính ở ô K2 cho trò chơi đầu tiên trong worksheet:

Tổng doanh số ở ô K2

Tương tự, hãy tạo một vòng lặp for để cộng các giá trị doanh số ở mọi hàng:

row_position = 1

for i in range(1, ws.max_row):

    row_position += 1
    NA_Sales = ws.cell(row=row_position, column=7).value
    EU_Sales = ws.cell(row=row_position, column=8).value
    JP_Sales = ws.cell(row=row_position, column=9).value
    Other_Sales = ws.cell(row=row_position, column=10).value

    total_sales = (NA_Sales + EU_Sales + JP_Sales + Other_Sales)
    ws.cell(row=row_position, column=11).value = total_sales

wb.save("videogamesales.xlsx")

Tệp Excel của bạn giờ sẽ có một cột mới phản ánh tổng doanh số trò chơi điện tử ở tất cả khu vực:

Tổng doanh số đã tính

Thêm hàng mới

Để thêm một hàng mới vào workbook, chỉ cần tạo một tuple với các giá trị bạn muốn và ghi vào sheet:

new_row = (1,'The Legend of Zelda',1986,'Action','Nintendo',3.74,0.93,1.69,0.14,6.51,6.5)

ws.append(new_row)
    
wb.save('videogamesales.xlsx')

Bạn có thể xác nhận dữ liệu đã được thêm bằng cách in hàng cuối cùng trong workbook:

values = [ws.cell(row=ws.max_row,column=i).value for i in range(1,ws.max_column+1)]
print(values)

Kết quả sau sẽ được tạo ra:

[1, 'The Legend of Zelda', 1986, 'Action', 'Nintendo', 3.74, 0.93, 1.69, 0.14, 6.51, 6.5]

Xóa hàng

Để xóa hàng mới chúng ta vừa tạo, bạn có thể chạy dòng lệnh sau:

ws.delete_rows(ws.max_row, 1) # row number, number of rows to delete

wb.save('videogamesales.xlsx')

Đối số đầu tiên trong delete_rows() là số hàng cần xóa. Đối số thứ hai là số lượng hàng cần loại bỏ.

Tạo công thức Excel với Openpyxl

Bạn có thể dùng Openpyxl để viết công thức giống hệt như trong Excel. Dưới đây là một số ví dụ về các hàm cơ bản bạn có thể tạo bằng Openpyxl:

AVERAGE()

Hãy tạo một cột mới tên “Average Sales” để tính doanh số trò chơi điện tử trung bình trên tất cả thị trường:

ws['P1'] = 'Average Sales'
ws['P2'] = '= AVERAGE(K2:K16220)'

wb.save('videogamesales.xlsx')

Doanh số trung bình trên tất cả thị trường xấp xỉ 0,19. Giá trị này sẽ hiển thị ở ô P2 của worksheet.

COUNTA()

Hàm “COUNTA” trong Excel đếm các ô có dữ liệu trong một phạm vi cụ thể. Hãy dùng nó để tìm số bản ghi giữa E2 và E16220:

ws['Q1'] = "Number of Populated Cells" 
ws['Q2'] = '=COUNTA(E2:E16220)'

wb.save('videogamesales.xlsx')

Có 16.219 bản ghi trong phạm vi này có thông tin.

COUNTIF()

COUNTIF() là một hàm Excel thường dùng để đếm số ô đáp ứng điều kiện cụ thể. Hãy dùng nó để đếm số trò chơi trong bộ dữ liệu này có thể loại “Sports”:

ws['R1'] = 'Number of Rows with Sports Genre'
ws['R2'] = '=COUNTIF(E2:E16220, "Sports")'

wb.save('videogamesales.xlsx')

Có 2.296 trò chơi thể loại thể thao trong bộ dữ liệu.

SUMIF()

Bây giờ, hãy tìm tổng “Sum of Sales” do các trò chơi thể thao tạo ra bằng hàm SUMIF:

ws['S1'] = 'Total Sports Sales'
ws['S2'] = '=SUMIF(E2:E16220, "Sports",K2:K16220)'
 
wb.save('videogamesales.xlsx')

Tổng số doanh số do các trò chơi thể thao tạo ra là 454.

CEILING()

Hàm CEILING() trong Excel làm tròn một số lên bội số gần nhất được chỉ định. Hãy làm tròn lên tổng doanh số do trò chơi thể thao tạo ra bằng hàm này:

ws['T1'] = 'Rounded Sum of Sports Sales'
ws['T2'] = '=CEILING(S2,25)'

wb.save('videogamesales.xlsx')

Chúng ta đã làm tròn tổng doanh số do trò chơi thể thao tạo ra đến bội số gần nhất của 25, kết quả là 475.

Các đoạn mã trên sẽ tạo ra kết quả sau trong sheet Excel của bạn (từ ô P1 đến T2):

Hàng doanh số trung bình

Để tham khảo nhanh về công thức, toán tử và hàm toán trong Excel, xem Excel Basics Cheat Sheet của chúng tôi.

Làm việc với Sheet trong Openpyxl

Giờ khi đã biết cách truy cập và ghi vào worksheet, hãy học cách chúng ta có thể thao tác, xóa và nhân bản chúng bằng Openpyxl.

Đổi tên sheet

Đầu tiên, hãy in tên của sheet đang hoạt động mà chúng ta đang làm việc bằng thuộc tính title của Openpyxl:

print(ws.title)

Kết quả sau sẽ được hiển thị:

vgsales

Giờ hãy đổi tên worksheet này bằng các dòng lệnh sau:

ws.title ='Video Game Sales Data'

wb.save('videogamesales.xlsx')

Tên của sheet đang hoạt động bây giờ sẽ được đổi thành “Video Game Sales Data.”

Tạo worksheet mới

Chạy dòng lệnh sau để liệt kê tất cả worksheet trong workbook:

print(wb.sheetnames)

Bạn sẽ thấy một mảng liệt kê tên tất cả worksheet trong tệp:

['Video Game Sales Data', 'Total Sales by Genre', 'Breakdown of Sales by Genre', 'Breakdown of Sales by Year']

Giờ hãy tạo một worksheet trống mới:

wb.create_sheet('Empty Sheet') # create an empty sheet
print(wb.sheetnames) # print sheet names again

wb.save('videogamesales.xlsx')

Lưu ý rằng một sheet mới tên “Empty Sheet” đã được tạo:

['Video Game Sales Data', 'Total Sales by Genre', 'Breakdown of Sales by Genre', 'Breakdown of Sales by Year', ‘Empty Sheet’]

Xóa worksheet

Để xóa một worksheet bằng Openpyxl, chỉ cần dùng thuộc tính remove và in lại tất cả tên sheet để xác nhận sheet đã bị xóa:

wb.remove(wb['Empty Sheet'])
print(wb.sheetnames)

wb.save('videogamesales.xlsx')

Lưu ý rằng worksheet “Empty Sheet” không còn nữa:

['Video Game Sales Data', 'Total Sales by Genre', 'Breakdown of Sales by Genre', 'Breakdown of Sales by Year']

Nhân bản worksheet

Cuối cùng, chạy dòng lệnh này để tạo một bản sao của một worksheet hiện có:

wb.copy_worksheet(wb['Video Game Sales Data'])
wb.save('vgsales_2.xlsx')

Khi in lại tất cả tên sheet, chúng ta nhận được kết quả sau:

['Video Game Sales Data', 'Total Sales by Genre', 'Breakdown of Sales by Genre', 'Breakdown of Sales by Year', 'Video Game Sales Data Copy']

Thêm biểu đồ vào tệp Excel với Openpyxl

Excel thường được coi là công cụ hàng đầu để tạo trực quan hóa và tóm tắt tập dữ liệu. Trong phần này, chúng ta sẽ học cách xây dựng biểu đồ trong Excel trực tiếp từ Python bằng Openpyxl.

Biểu đồ cột

Trước tiên, hãy tạo một biểu đồ cột đơn giản hiển thị tổng doanh số trò chơi điện tử theo thể loại. Chúng ta sẽ dùng worksheet “Total Sales by Genre” để thực hiện:

Worksheet cho biểu đồ cột

Worksheet này chứa một pivot table trong đó tổng doanh số đã được tổng hợp theo thể loại, như hình trên.

Hãy truy cập worksheet này trước khi bắt đầu tạo biểu đồ cột:

ws = wb['Total Sales by Genre'] # access the required worksheet

Bây giờ, chúng ta cần cho Openpyxl biết các giá trị và danh mục muốn vẽ.

Giá trị:

Các giá trị bao gồm dữ liệu “Sum of Sales” mà chúng ta muốn vẽ. Chúng ta cần cho Openpyxl biết nơi tìm dữ liệu này trong tệp Excel bằng cách chỉ định phạm vi bắt đầu và kết thúc của các giá trị.

Có bốn tham số trong Openpyxl cho phép bạn chỉ định vị trí giá trị của mình:

  • Min_column: Cột nhỏ nhất chứa dữ liệu

  • Max_column: Cột lớn nhất chứa dữ liệu

  • Min_row: Hàng nhỏ nhất chứa dữ liệu

  • Max_row: Hàng lớn nhất chứa dữ liệu

Dưới đây là hình minh họa cách bạn có thể xác định các tham số này:

Bốn tham số để xác định giá trị

Lưu ý rằng hàng nhỏ nhất là hàng đầu tiên chứ không phải hàng thứ hai. Đó là vì Openpyxl bắt đầu đếm từ hàng có giá trị số.

# Values for plotting

from openpyxl.chart import Reference

values = Reference(ws,         # worksheet object   
                   min_col=2,  # minimum column where your values begin
                   max_col=2,  # maximum column where your values end
                   min_row=1,  # minimum row you’d like to plot from
                   max_row=13) # maximum row you’d like to plot from

Danh mục

Giờ, chúng ta cần xác định các tham số tương tự cho danh mục trong biểu đồ cột:

Tham số cho danh mục biểu đồ cột

Dưới đây là mã bạn có thể dùng để đặt tham số cho danh mục của biểu đồ:

cats = Reference(ws, 
                 min_col=1, 
                 max_col=1, 
                 min_row=2, 
                 max_row=13)

Tạo biểu đồ cột

Giờ chúng ta có thể tạo đối tượng biểu đồ cột và đưa các giá trị và danh mục vào bằng các dòng lệnh sau:

from openpyxl.chart import BarChart

chart = BarChart()
chart.add_data(values, titles_from_data=True)
chart.set_categories(cats)

Đặt tiêu đề biểu đồ

Cuối cùng, bạn có thể đặt tiêu đề biểu đồ và cho Openpyxl biết muốn tạo nó ở đâu trong sheet Excel:

# set the title of the chart
chart.title = "Total Sales"

# set the title of the x-axis
chart.x_axis.title = "Genre"

# set the title of the y-axis
chart.y_axis.title = "Total Sales by Genre"

# the top-left corner of the chart
# is anchored to cell F2 .
ws.add_chart(chart,"D2")

# save the file 
wb.save("videogamesales.xlsx")

Sau đó bạn có thể mở tệp Excel và chuyển đến worksheet “Total Sales by Genre”. Bạn sẽ thấy một biểu đồ xuất hiện như sau:

Tổng doanh số theo thể loại

Biểu đồ cột nhóm

Giờ, hãy tạo một biểu đồ cột nhóm hiển thị tổng doanh số theo thể loại và khu vực. Bạn có thể tìm dữ liệu cho biểu đồ này trong worksheet “Breakdown of Sales by Genre”:

Bảng cho biểu đồ cột nhóm

Tương tự như khi tạo biểu đồ cột, chúng ta cần xác định phạm vi cho giá trị và danh mục:

Xác định giá trị và danh mục cho biểu đồ cột nhóm

Bây giờ chúng ta có thể truy cập worksheet và viết điều này thành mã:

### Creating a Grouped Bar Chart with Openpyxl
ws = wb['Breakdown of Sales by Genre'] # access worksheet

# Data for plotting
values = Reference(ws,
                   min_col=2,
                   max_col=5,
                   min_row=1,
                   max_row=13)

cats = Reference(ws, min_col=1, 
                     max_col=1, 
                     min_row=2, 
                     max_row=13)

Giờ chúng ta có thể tạo đối tượng biểu đồ cột, đưa giá trị và danh mục vào, và đặt tham số tiêu đề giống như trước đó:

# Create object of BarChart class
chart = BarChart()
chart.add_data(values, titles_from_data=True)
chart.set_categories(cats)

# set the title of the chart
chart.title = "Sales Breakdown"

# set the title of the x-axis
chart.x_axis.title = "Genre"

# set the title of the y-axis
chart.y_axis.title = "Breakdown of Sales by Genre"

# the top-left corner of the chart is anchored to cell H2.
ws.add_chart(chart,"H2")

# save the file 
wb.save("videogamesales.xlsx")

Khi mở worksheet, một biểu đồ cột nhóm như sau sẽ xuất hiện:

Kết quả biểu đồ cột nhóm

Biểu đồ đường xếp chồng

Cuối cùng, chúng ta sẽ tạo một biểu đồ đường xếp chồng dùng dữ liệu trong tab “Breakdown of Sales by Year.” Worksheet này chứa dữ liệu doanh số trò chơi điện tử theo năm và khu vực:

Bảng tổng doanh số

Hãy xác định phạm vi cho giá trị và danh mục của biểu đồ này:

Giá trị và danh mục cho biểu đồ đường xếp chồng

Giờ chúng ta có thể viết các giá trị nhỏ nhất và lớn nhất này thành mã:

# Data for plotting
values = Reference(ws,
                   min_col=2,
                   max_col=6,
                   min_row=1,
                   max_row=40)

cats = Reference(ws, min_col=1, max_col=1, min_row=2, max_row=40)

Cuối cùng, hãy tạo đối tượng biểu đồ đường và đặt tiêu đề biểu đồ, trục x và trục y:

# Create object of LineChart class
from openpyxl.chart import LineChart

chart = LineChart()
chart.add_data(values, titles_from_data=True)
chart.set_categories(cats)

# set the title of the chart
chart.title = "Total Sales"

# set the title of the x-axis
chart.x_axis.title = "Year"

# set the title of the y-axis
chart.y_axis.title = "Total Sales by Year"

# the top-left corner of the chart is anchored to cell H2 
ws.add_chart(chart,"H2")

# save the file 
wb.save("videogamesales.xlsx")

Một biểu đồ đường xếp chồng như thế này sẽ xuất hiện trên worksheet của bạn:

Biểu đồ đường xếp chồng

Định dạng ô bằng Openpyxl

Openpyxl cho phép người dùng tạo kiểu cho các ô trong workbook Excel. Bạn có thể làm bảng tính trông đẹp hơn bằng cách thay đổi cỡ chữ, màu nền và đường viền ô trực tiếp trong Python.

Dưới đây là một số cách tùy chỉnh bảng tính Excel bằng Openpyxl:

Thay đổi cỡ và kiểu chữ

Hãy tăng cỡ chữ ở ô A1 và in đậm văn bản bằng các dòng mã sau:

from openpyxl.styles import Font

ws = wb['Video Game Sales Data']
ws['A1'].font = Font(bold=True, size=12)

wb.save('videogamesales.xlsx')

Lưu ý rằng văn bản ở ô A1 giờ đã lớn hơn một chút và được in đậm:

dữ liệu phông lớn

Nếu chúng ta muốn thay đổi cỡ và kiểu chữ cho tất cả tiêu đề cột ở hàng đầu tiên thì sao?

Để làm vậy, ta có thể dùng cùng đoạn mã và tạo một vòng lặp for để lặp qua tất cả cột ở hàng đầu tiên:

for row in ws.iter_rows(min_row=1, max_row=1):
    for cell in row:
        cell.font = Font(bold=True, size=12)

wb.save('videogamesales.xlsx')

Khi chúng ta lặp qua [“1:1”], tức là đang cho Openpyxl biết hàng bắt đầu và kết thúc để lặp. Nếu muốn lặp qua mười hàng đầu tiên, chẳng hạn, thì ta sẽ chỉ định [“1:10”] thay vào đó.

Bạn có thể mở sheet Excel để kiểm tra các thay đổi đã được áp dụng:

dữ liệu phông nhỏ hơn

Thay đổi màu chữ

Bạn có thể thay đổi màu chữ trong Openpyxl bằng mã hex:

from openpyxl.styles import colors

ws['A1'].font = Font(color = 'FF0000',bold=True, size=12) ## red
ws['A2'].font = Font(color = '0000FF') ## blue

wb.save('videogamesales.xlsx')

Sau khi lưu workbook và mở lại, màu chữ ở ô A1 và A2 sẽ thay đổi:

thay đổi màu chữ

Thay đổi màu nền ô

Để thay đổi màu nền của một ô, bạn có thể dùng mô-đun PatternFill của Openpyxl:

## changing background color of a cell
from openpyxl.styles import PatternFill

ws["A1"].fill = PatternFill('solid', start_color="38e3ff") # light blue background color
wb.save('videogamesales.xlsx')

Thay đổi sau sẽ được phản ánh trong worksheet của bạn:

thay đổi màu ô

Thêm đường viền ô

Để thêm đường viền cho ô bằng Openpyxl, chạy các dòng mã sau:

## cell borders
from openpyxl.styles import Border, Side

my_border = Side(border_style="thin", color="000000")

ws["A1"].border = Border(
    top=my_border, left=my_border, right=my_border, bottom=my_border
)

wb.save("videogamesales.xlsx")

Bạn sẽ thấy một đường viền như thế này xuất hiện quanh ô A1:

thay đổi màu ô

Định dạng có điều kiện

Định dạng có điều kiện là quá trình làm nổi bật các giá trị cụ thể trong tệp Excel dựa trên một tập điều kiện. Nó giúp người dùng trực quan hóa dữ liệu dễ dàng hơn và hiểu rõ hơn các giá trị trong worksheet.

Hãy dùng Openpyxl để tô màu xanh lục tất cả giá trị doanh số trò chơi điện tử lớn hơn hoặc bằng 8:

from openpyxl.formatting.rule import CellIsRule

fill = PatternFill(
    start_color='90EE90',
    end_color='90EE90',fill_type='solid') # specify background color

ws.conditional_formatting.add(
    'G2:K16594', CellIsRule(operator='greaterThan', formula=[8], fill=fill)) # include formatting rule

wb.save('videogamesales.xlsx')

Trong khối mã đầu tiên, chúng ta chỉ định màu nền của các ô muốn định dạng. Ở đây là màu xanh lục nhạt.

Sau đó, chúng ta tạo quy tắc định dạng có điều kiện nêu rằng mọi giá trị lớn hơn 8 sẽ được tô bằng màu nền đã chỉ định. Chúng ta cũng nêu rõ phạm vi ô muốn áp dụng điều kiện này.

Sau khi chạy đoạn mã trên, tất cả giá trị doanh số trên 8 sẽ được làm nổi bật như sau:

định dạng có điều kiện

Kết luận

Chúng ta đã bao quát rất nhiều nội dung trong hướng dẫn này, từ những điều cơ bản khi dùng thư viện Openpyxl đến các thao tác nâng cao như tạo biểu đồ và định dạng bảng tính trong Python.

Bản thân Python và Excel bao phủ những phần khác nhau trong quy trình dữ liệu. Excel xử lý báo cáo và phân tích ad-hoc; Python xử lý mô hình, tự động hóa và tính toán ở quy mô lớn.

Ưu thế lớn nhất của Excel là hầu như ai cũng dùng. Từ các bên liên quan không kỹ thuật đến nhân sự mới vào nghề, nhân viên ở mọi cấp độ đều hiểu các báo cáo được trình bày trong bảng tính Excel.

Python, mặt khác, được dùng để phân tích và xây dựng mô hình trên lượng dữ liệu lớn. Nó có thể giúp các nhóm tự động hóa công việc nặng nhọc và cải thiện hiệu quả tổ chức.

Khi dùng kết hợp Excel và Python, bạn có thể tự động hóa hàng giờ công việc lặp lại trong khi vẫn cung cấp đầu ra theo định dạng mà cả nhóm đã quen thuộc. Để tiếp tục nâng cao kỹ năng này, tôi khuyến nghị khóa học Python for Spreadsheet Users, hoặc xem hướng dẫn Python in Excel để chạy Python trực tiếp bên trong bảng tính Excel.

Câu hỏi thường gặp (FAQs)

Python xử lý các bộ dữ liệu Excel lớn hiệu quả hơn chính Excel như thế nào?

Python có thể xử lý các bộ dữ liệu lớn hiệu quả hơn bằng cách sử dụng các thư viện như pandasnumpy, vốn được xây dựng hướng tới hiệu năng. Không giống Excel, Python không phụ thuộc vào giao diện đồ họa, cho phép xử lý hàng triệu hàng trong bộ nhớ và thực hiện các thao tác nâng cao mà không có nguy cơ bị treo hoặc chậm đáng kể.

Python có thể làm việc với các định dạng không phải Excel và chuyển đổi sang Excel không?

Có, Python có thể làm việc với nhiều định dạng tệp khác nhau như CSV, JSON và cơ sở dữ liệu. Với các thư viện như pandas, bạn có thể đọc các định dạng này và xuất chúng ra tệp Excel một cách dễ dàng. Ví dụ:

import pandas as pd
data = pd.read_csv('data.csv')  # Load CSV file
data.to_excel('data.xlsx', index=False)  # Save as Excel

Có thể kết hợp dữ liệu từ nhiều tệp Excel bằng Python không?

Có, Python cho phép bạn hợp nhất dữ liệu từ nhiều tệp Excel vào một tệp hoặc một worksheet duy nhất. Điều này có thể thực hiện bằng các thư viện như openpyxl hoặc pandas. Chẳng hạn, với pandas, bạn có thể đọc nhiều tệp vào các dataframe, gộp hoặc nối chúng, rồi lưu kết quả trở lại tệp Excel:

import pandas as pd
df1 = pd.read_excel('file1.xlsx')
df2 = pd.read_excel('file2.xlsx')
combined = pd.concat([df1, df2])
combined.to_excel('combined.xlsx', index=False)

Làm thế nào để đọc một tệp Excel lớn hiệu quả với openpyxl?

Mở workbook ở chế độ chỉ đọc (read_only=True) để giảm sử dụng bộ nhớ. Chế độ chỉ đọc truyền dữ liệu theo từng hàng thay vì nạp toàn bộ workbook vào bộ nhớ. Nó có thể xử lý các tệp có hàng trăm nghìn hàng mà không bị chậm, nhưng không hỗ trợ ghi lại vào tệp.

Sự khác nhau giữa openpyxl và pandas khi làm việc với Excel là gì?

openpyxl làm việc trực tiếp với định dạng .xlsx của Excel, cho phép bạn kiểm soát định dạng ô, biểu đồ, công thức và cấu trúc worksheet. pandas xem Excel như một nguồn dữ liệu và nạp nó vào DataFrame, phù hợp hơn cho phân tích và biến đổi dữ liệu. Hãy dùng openpyxl khi bạn cần định dạng ô, tạo biểu đồ hoặc dựng tệp Excel từ đầu. Dùng pandas khi bạn cần lọc, tổng hợp hoặc chuyển dạng dữ liệu từ tệp Excel.


Natassha Selvaraj's photo
Author
Natassha Selvaraj
LinkedIn
Twitter

Natassha là một chuyên viên tư vấn dữ liệu làm việc tại giao điểm giữa khoa học dữ liệu và tiếp thị. Cô tin rằng dữ liệu, khi được sử dụng khôn ngoan, có thể truyền cảm hứng cho sự phát triển vượt bậc của cá nhân và tổ chức. Là một chuyên gia dữ liệu tự học, Natassha thích viết các bài báo giúp những người theo đuổi khoa học dữ liệu bước chân vào ngành. Các bài viết trên blog cá nhân cũng như trên các ấn phẩm bên ngoài của cô thu hút trung bình 200 nghìn lượt xem mỗi tháng.

Chủ đề

Tìm hiểu thêm về Python và Bảng tính

Courses

Nhập dữ liệu vào Python: Giới thiệu

3 giờ
336.2K
Học cách nhập dữ liệu vào Python từ nhiều nguồn khác nhau, như Excel, SQL, SAS và trực tiếp từ web.
Xem chi tiếtRight Arrow
Bắt đầu khóa học
Xem thêmRight Arrow