Python với Excel - Xử lý file (tập tin) đóng

  • Thread starter Thread starter befaint
  • Ngày gửi Ngày gửi
Liên hệ QC

befaint

|||||||||||||
Tham gia
6/1/11
Bài viết
14,540
Được thích
19,749
Ứng dụng Python trong việc xử lý dữ liệu Excel với file đóng (tức là không cần mở file lên để xử lý): Như đọc, ghi dữ liệu trên Range, thay đổi cấu trúc bảng (chèn, xóa dòng/ cột...).

Nhân tiện chủ đề này Chèn cột để đồng nhất cơ sở dữ liệu nên sẽ đăng bài xử lý về cấu trúc trước, cơ bản gọi là ghi dữ liệu vào file đóng.

1. Các thứ cần chuẩn bị
Theo hướng dẫn ở bài này: Python với Excel - Mở đầu và cài đặt thư viện

2. Code
Mượn các files ở Chèn cột để đồng nhất cơ sở dữ liệu, code viết cụ thể cho yêu cầu tại chủ đề đó.

Python:
import time, os
from openpyxl import load_workbook

excel_extension = ".xlsx"

def get_excel_files(excel_ext):
    """ return list of full path of Excel files """
    excel_files = []
    top_path = os.path.dirname(os.path.abspath(__file__))
    for file in os.listdir(top_path):
        if file.endswith(excel_ext):
            excel_files.append(os.path.join(top_path, file))
    return excel_files

def inset_columns(file_name):
    wb = load_workbook(file_name)
    ws = wb.active # activesheet
    y = str(ws['C7'].value) # get value of cell [C7]
    try:
        yy = abs(int(eval(y))) - 2014
    except:
        yy = 0
    # insert columns
    if yy > 0 and yy < 5:
        ws.insert_cols(3, yy)       
        # write year into range ['C7:G7']
        for i in range(3, 8):
            ws.cell(row = 7, column = i, value = 2014 + i - 3)
    wb.save(file_name)

# run
time_start = time.time()

for excelfile in get_excel_files(excel_extension):
    inset_columns(excelfile)
   
print(time.time() - time_start)

***
Tải file Python insert_columns.zip ở dưới, giải nén..
Trong thư mục Python insert_columns mở file insert_columns.py bằng IDLE Python rồi nhấn phím F5 để chạy code.

Chạy tẹo là xong..

216874
 

File đính kèm

Lần chỉnh sửa cuối:
Mạnh chưa hiểu bài này lắm ... nếu máy mạnh ko cài python thì chạy code sao đây ???
Mong chỉ dùm ... khi nào rảnh vọc chút ... biết đâu 1 ngày không xa lắm biết thêm code python
Cảm ơn
 
Upvote 0
Mạnh chưa hiểu bài này lắm ... nếu máy mạnh ko cài python thì chạy code sao đây ???
Mong chỉ dùm ... khi nào rảnh vọc chút ... biết đâu 1 ngày không xa lắm biết thêm code python
Cảm ơn
Mọi thứ xử lý bên Python nên anh cần cài đặt Python vào máy tính rồi chạy file *.py.

Python hoàn toàn miễn phí, dung lượng lại nhỏ gọn nữa..
 
Upvote 0
Ứng dụng Python trong việc xử lý dữ liệu Excel với file đóng (tức là không cần mở file lên để xử lý): Như đọc, ghi dữ liệu trên Range, thay đổi cấu trúc bảng (chèn, xóa dòng/ cột...).

Nhân tiện chủ đề này Chèn cột để đồng nhất cơ sở dữ liệu nên sẽ đăng bài xử lý về cấu trúc trước, cơ bản gọi là ghi dữ liệu vào file đóng.

1. Các thứ cần chuẩn bị
Theo hướng dẫn ở bài này:

2. Code
Mượn các files ở Chèn cột để đồng nhất cơ sở dữ liệu, code viết cụ thể cho yêu cầu tại chủ đề đó.

Python:
import time, os
from openpyxl import load_workbook

excel_extension = ".xlsx"

def get_excel_files(excel_ext):
    """ return list of full path of Excel files """
    excel_files = []
    top_path = os.path.dirname(os.path.abspath(__file__))
    for file in os.listdir(top_path):
        if file.endswith(excel_ext):
            excel_files.append(os.path.join(top_path, file))
    return excel_files

def inset_columns(file_name):
    wb = load_workbook(file_name)
    ws = wb.active # activesheet
    y = str(ws['C7'].value) # get value of cell [C7]
    try:
        yy = abs(int(eval(y))) - 2014
    except:
        yy = 0
    # insert columns
    if yy > 0 and yy < 5:
        ws.insert_cols(3, yy)       
        # write year into range ['C7:G7']
        for i in range(3, 8):
            ws.cell(row = 7, column = i, value = 2014 + i - 3)
    wb.save(file_name)

# run
time_start = time.time()

for excelfile in get_excel_files(excel_extension):
    inset_columns(excelfile)
   
print(time.time() - time_start)

***
Tải file Python insert_columns.zip ở dưới, giải nén..
Trong thư mục Python insert_columns mở file insert_columns.py bằng IDLE Python rồi nhấn phím F5 để chạy code.

Chạy tẹo là xong..

View attachment 216874
Em cảm ơn bác rất nhiều ạ,
Chúc bác gặp nhiều điều may mắn trong cuộc sống
Nếu các năm nằm ở dòng 10 chẳng hạn thì thay row=7 bang row=10 và C7:G7 thay bang C10:G10 và C7 thay bang C10 phải không ạ
 
Upvote 0
Mọi thứ xử lý bên Python nên anh cần cài đặt Python vào máy tính rồi chạy file *.py.

Python hoàn toàn miễn phí, dung lượng lại nhỏ gọn nữa..
Mạnh đọc code Python bài 1 bắt đầu hình dung ra rồi đó ... mai mốt cài Python khi nào rảnh quậy coi sao
......
Mạnh đề nghị vầy coi có được ko nhé ... chỉ cho mạnh học với he còn ai thích thì tham gia cho vui
1/ Viết cho Mạnh xin 1 vài code mẫu đơn giản nhất VD như : 1 +1 = 2 ấy ??? để mạnh hình dung ra code và làm quen nhập môn Python !!!
- 1 code về mảng
- 1 code Range
- 1 code về sự kiện
- 1 code về ADO (Lấy dữ liệu lên + Ghi dữ liệu xuống)
- 1 code lấy dữ liệu File đóng cho vào mảng xong tính toán trên Mảng xong gán kết quả xuống Sheet
- 1 Code dictionary
- 1 code cách viết hàm sử dụng trên Cells
- + nhiều nhiều chút ???

2/ Python có viết được File *.DLL như Dephi hay ko ... xong làm thủ tục gọi hàm từ Excel được hay ko (DLL đó có phải đăng ký với Windows hay chỉ copy qua bất kỳ máy nào chạy cũng ok ???

3/ Có viết được Form trong DLL hay ko xong làm thủ tục keo nó từ Excel

4/ Quá trình Mạnh học phát Sinh khó khăn gì mong @befaint hổ trợ chỉ cho mạnh với

Xin cảm ơn

mà Mạnh cảm giác thấy học code Delphi nó dễ hơn code Python hay sao ý ??!!
 
Upvote 0
...
mà Mạnh cảm giác thấy học code Delphi nó dễ hơn code Python hay sao ý ??!!
"cảm giác" là vấn đề chủ quan.
Khách quan mà nói thì Python học dễ hơn hầu hết các ngôn ngữ khác.
Hầu hết các vấn đề cần thiết đều đã được cộng đồng Python viết sẵn ra rồi, và cho vào thư viện (library)
Cái khó là biết cách tìm trên mạng để mò ra được cái thư viện chứa vấn đề của mình. Điển hình là code ở bài chủ (bài #1) đã dùng hàm của thư viện os để đọc file system và hàm của openpyxl để làm việc với file Excel.
 
Upvote 0
NHƯNG
Python với Excel - Xử lý file (tập tin) đóng

Tập tin ĐÓNG thì đáng nghi ngờ nhất, và là điều không thể với mọi ngôn ngữ, code
Nên ở diễn đàn này vẫn có sự hiểu nhầm là "file đóng"
 
Upvote 0
NHƯNG


Tập tin ĐÓNG thì đáng nghi ngờ nhất, và là điều không thể với mọi ngôn ngữ, code
Nên ở diễn đàn này vẫn có sự hiểu nhầm là "file đóng"
Mạnh có nghe đâu đó trên Internet hắn nói

1/ Code ADO lấy dữ liệu file đang đóng là tại mình ko thấy nó mở nên keo vậy chứ thực ra nó mở Ngầm đâu đó trên máy Tính ??
2/ Còn code thuần DAO thì nó đóng thật hay sao ý

Hên thì Mạnh nói trúng .... Sai thì Next he .....hahahahaha
 
Upvote 0
Mạnh có nghe đâu đó trên Internet hắn nói

1/ Code ADO lấy dữ liệu file đang đóng là tại mình ko thấy nó mở nên keo vậy chứ thực ra nó mở Ngầm đâu đó trên máy Tính ??
2/ Còn code thuần DAO thì nó đóng thật hay sao ý

Hên thì Mạnh nói trúng .... Sai thì Next he .....hahahahaha
Kiểu gì cũng connection, rồi có cả Cnn.Open hay OpenDatabase (ghi rõ luôn vậy ở cả ADO, DAO...)
Nên File đóng thì không thể lấy đọc dữ liệu từ file
 
Upvote 0
Mục 1 thì anh cần đọc từ lý thuyết cơ bản abc trước. Cũng bắt đầu từ kiểu dữ liệu, biến...
Kiểu dữ liệu trong Python có nhiều cái hay ho như tuple, list, dict.. vụ này hơn hẳn array trong VBA (em thấy vậy).
Tạo class thì rất đơn giản..
Còn sau áp dụng làm gì thì tìm đọc cụ thể môi trường đó. Cụ thể với Excel thì tìm các thư viện hỗ trợ và đọc docs của nó.
Ví dụ cụ thể công cụ tương ứng Dictionary trong VBA thì Python lấy dữ liệu của range rồi dùng Python set để chuyển nó về dạng Hashable rồi dò rất tiện..

Mục 2 và 3, anh có thể tham khảo thư viện xlwings. Thư viện này rất hay ấy..
Việc tạo *.dll anh tham khảo cách họ làm cho cái xlwings kia luôn.
Nếu rành rồi thì mình tự tạo thư viện như họ :)

Em cũng mới đọc Python thôi.
 
Upvote 0
...
1/ Code ADO lấy dữ liệu file đang đóng là tại mình ko thấy nó mở nên keo vậy chứ thực ra nó mở Ngầm đâu đó trên máy Tính ??
2/ Còn code thuần DAO thì nó đóng thật hay sao ý
...
Tuỳ theo bạn định nghĩ từ "mở" và "đóng"
Theo nghĩa chính thức (tổng quát) thì phải "mở" file mới đọc được nó. Trừ phi bạn dùng phần mềm đặc biệt có khả năng load cả cụm ký tự binary (nhị phân) vào nó rồi tự parse lấy.
Theo định nghĩa ở ngữ cảnh diễn đàn GPE thì làm việc trên file đóng có nghĩa là code của bạn không trực tiếp "mở" file ấy. ADO hay DAO nó có "mở" hay không là chuyện của nó.
Điểm này rất quan trọng trong lập trình hướng đối tượng. Khi sử dụng đối tượng, code VBA của bạn chỉ cần biết cái giao diện. ADO là một đối tượng chuyên làm việc với dữ liệu. Code VBA của bạn chỉ cần biết cái giao diện lấy/ghi dữ liệu (tức là cái protocol/lệ luật như kết nối, sql, và recordset). Việc nó mở file Excel bằng cách nào code VBA của bạn không cần biết tới.

Chú: thực ra code bài #1 có rõ rệt là dùng hàm load_workbook và hàm này trả về một đối tượng.
Tôi không biết thư viện openpyxl cho nên không rõ đối tượng ấy có phải là workbook hay là cái bóng (shaddow) của workbook (ví dụ được đọc ở dạng xml?).
Nếu là workbook thì trên nguyên tắc, file có được mở trực tiếp. Nếu là cái bóng thì rất có thể nó không mở trực tiếp; chỉ update vào lúc save thôi.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom