2014-05-09 15 views
6

Tôi có tệp * .xlsm có 20 trang tính trong đó. Tôi muốn lưu một số trang tính dưới dạng * .csv (mất định dạng). Đã thử các thư viện xlrd-xlwt và win32com nhưng không thể vượt qua được. Có ai vui lòng cung cấp đoạn mã thực hiện việc xử lý ở trên bằng Python không? Tôi có các phụ thuộc python khác nên không có ngôn ngữ nào khác hoạt động. Cảm ơnCách trích xuất trang tính từ * .xlsm và lưu nó dưới dạng * .csv bằng Python?

+0

Theo như tôi nhớ, tất cả các định dạng Microsoft Office gần đây là XML đóng gói vào thùng chứa Zip. Vì vậy, có lẽ bạn có thể xem các nguồn tệp .xlsm, làm rõ cấu trúc XML của nó và sau đó trích xuất các trường bắt buộc. – user3159253

Trả lời

4

xlrd cũng hoạt động tốt trên các tệp xlsm. Tôi đã thử nghiệm mã với một tệp xlsm ngẫu nhiên và nó hoạt động hoàn hảo.

import csv 
import xlrd 

workbook = xlrd.open_workbook('test.xlsx') 
for sheet in workbook.sheets(): 
    with open('{}.csv'.format(sheet.name), 'wb') as f: 
     writer = csv.writer(f) 
     writer.writerows(sheet.row_values(row) for row in range(sheet.nrows)) 

Nếu bạn đã mã hóa các vấn đề, hãy thử đoạn code dưới đây:

import csv 
import xlrd 

workbook = xlrd.open_workbook('test.xlsm') 
for sheet in workbook.sheets(): 
    if sheet.name == "Sheet_name_from_xlsm_file": 
     with open('{}.csv'.format(sheet.name), 'wb') as f: 
      writer = csv.writer(f) 
      for row in range(sheet.nrows): 
       out = [] 
       for cell in sheet.row_values(row): 
        try: 
         out.append(cell.encode('utf8')) 
        except: 
         out.append(cell) 
       writer.writerow(out) 
+0

Nếu cách này không hiệu quả, bạn nên tải lên tệp dữ liệu của mình nếu có thể. –

+0

Cảm ơn bạn đã trích đoạn nội dung! Tôi nhận được lỗi này: writer.writerows (sheet.row_values ​​(hàng) cho hàng trong phạm vi (sheet.nrows)) UnicodeEncodeError: 'ascii' codec không thể mã hóa ký tự u '\ xb5' ở vị trí 0: thứ tự không nằm trong phạm vi (128) Có cách nào để chỉ định mã hóa ở đây không? Rất tiếc, không thể tải tệp lên đây. – iPirate

+0

@iPirate Tôi nghĩ rằng bạn cần phải mã hóa các chuỗi với utf8 hoặc một cái gì đó tương tự. Hãy thử cp1252 nếu nó không hoạt động. Tôi đã cập nhật câu trả lời của mình. –

Các vấn đề liên quan