Trong quá trình làm việc, tôi thường tiếp cận các vấn đề một cách thực tế và linh hoạt thay vì tuân theo một cấu trúc cứng nhắc.
I. Yêu cầu bài toán
-
Truy xuất dữ liệu từ cơ sở dữ liệu Oracle theo điều kiện nhất định
-
Xử lý định dạng dữ liệu
-
Xuất dữ liệu theo từng bộ phận vào các trang tính khác nhau
Công cụ sử dụng: VS2019, Python 3.7
Để thực hiện các tác vụ này, bạn cần cài đặt các thư viện cần thiết thông qua lệnh pip install tên_thư_viện. Trong Visual Studio, bạn có thể cài đặt trực tiếp cho phiên bản Python 3.7 thông qua menu ngữ cảnh. Tuy nhiên, nếu sau khi cài đặt vẫn không nhận diện được các thư viện, hãy khởi động lại IDE. Nếu gặp lỗi mã hóa tiếng Trung trong VS, nên chuyển đổi file .py sang định dạng UTF-8 bằng công cụ chỉnh sửa như Notepad++.
- Viết script để lấy dữ liệu từ Oracle
import cx_Oracle as cx
Mẫu kết nối đến cơ sở dữ liệu Oracle, có nhiều cách thực hiện, nhưng tôi chỉ dùng một phương pháp đơn giản:
db2=cx.connect('soar','0000','192.168.10.25:1521/CQ')
Các thông số lần lượt là: tên người dùng, mật khẩu, địa chỉ IP, cổng kết nối và tên instance.
- Xây dựng câu truy vấn SQL để lấy dữ liệu mong muốn
sql3="select role_name as Role_Name,parent_menu as Module_Name,menu_name as Menu_Name from table1"
Bạn có thể giữ nguyên tên cột nếu không cần đổi, nhưng việc đổi tên giúp dễ đọc hơn. Khi cần xuống dòng trong chuỗi SQL, bạn có thể dùng ký tự \ hoặc kết hợp nhiều chuỗi.
sql3="select role_name as Role_Name,parent_menu as Module_Name,menu_name as Menu_Name " \
" from table1"
Thực thi truy vấn và lưu kết quả vào biến
cr2=db2.cursor()
cr2.execute(sql3)
rs2=cr2.fetchall()
cr2.close()
db2.close()
Quá trình này tạo ra một cursor, và phương thức fetchall() sẽ trả về toàn bộ dữ liệu. Tuy nhiên, nó không bao gồm tiêu đề cột, điều này khiến tôi khó khăn khi cần đưa tiêu đề vào Excel.
-
Sau khi có dữ liệu, cần xử lý và chuẩn bị định dạng cho Excel. Vì yêu cầu của khách hàng là chia dữ liệu theo từng phòng ban, mỗi phòng ban lại có định dạng riêng, việc xử lý thủ công từng phần sẽ rất tốn thời gian và nhàm chán, đặc biệt khi có hàng trăm sheet cần xử lý.
-
Import các thư viện hỗ trợ xử lý Excel
import pandas as pd
from styleframe import StyleFrame, Styler, utils
- Định dạng và xuất dữ liệu Excel
sf = StyleFrame(pd.DataFrame(rs2,columns=['Role_Name', 'Module_Name', 'Menu_Name']))
sf.apply_column_style(cols_to_style=["Role_Name","Module_Name","Menu_Name"],
styler_obj=Styler(font='Segoe UI', font_size=9 , bold=False ,
horizontal_alignment=utils.horizontal_alignments.left , wrap_text=True),
style_header=True)
sf.set_column_width(columns=["Role_Name","Module_Name","Menu_Name"],width=20)
ew = StyleFrame.ExcelWriter(r'D:\\V1.xlsx')
sf.to_excel(ew)
ew.save()
Trong ví dụ trên, các tiêu đề cột được xác định thủ công, tuy nhiên có thể lấy từ cơ sở dữ liệu nếu cần. Trong trường hợp này, do số lượng cột ít và cố định, tôi chọn cách đơn giản. Thư viện StyleFrame cung cấp nhiều tùy chọn định dạng, ở đây tôi chỉ sử dụng các thuộc tính cơ bản như kiểu chữ, kích thước, căn lề trái và độ rộng cột.
Mã trên xử lý một sheet duy nhất, bạn có thể mở rộng để xử lý nhiều sheet theo từng nhóm dữ liệu.