簡體   English   中英

Python:Openpyxl為空單元格輸出“無”

[英]Python: Openpyxl outputs “None” for empty cells

下面的代碼應遍歷目錄,打開文件,轉換等。問題是當單元格為空時,生成的CSV文件將在其位置輸出“ None”。

有什么理由可以補救?

謝謝

import os
from openpyxl import load_workbook
import csv

for subdir, dirs, files in os.walk("C:\Users\Alan\Downloads\Knowledge\HOW DO I"):
    for file in files:
        filepath = subdir + os.sep + file

        wb = load_workbook(filename=filepath)
        sh = wb.active
        your_csv_file = open(filepath.replace(".xlsx","")+'_csv.csv','wb')
        wr = csv.writer(your_csv_file,quoting=csv.QUOTE_ALL)

        for rownum in sh.iter_rows():
            wr.writerow([unicode(val.value).encode('ascii','ignore') for val in rownum])

        your_csv_file.close()

OpenPyXl不存儲空單元格(空意味着沒有值,字體,邊框等)。 如果從工作表中獲得一個單元格,它將動態創建一個新的空單元格,其值為None

Worksheet.iter_rows()的當前實現(v2.4.0)使用Worksheet.cell()方法,該方法調用沒有值的 Cell()構造函數

您需要更改代碼以處理“空”單元格:

for rownum in sh.iter_rows():
    values = [(u"" if cell.value is None else unicode(cell.value))
              for cell in rownum]
    wr.writerow([value.encode('ascii', 'ignore') for value in rownum])

注意:由於可能是Windows用戶將數據導出到CSV文件,因此可以選擇更有用的編碼,例如: cp1252

為什么? 因為將“空”與“無”等同是正確的。 我想要'NA',所以我有類似以下內容:

def _transmap(dat):
    transmap = {
        # empty cells are going to be empty strings
        None: 'NA',
        # workaround for bug in openpyxl
        # https://bitbucket.org/openpyxl/openpyxl/issues/674/ 
        dt.datetime(1899, 12, 30, 0, 0): dt.time(0, 0),
        dt.datetime(1899, 12, 31, 0, 0): dt.datetime(1900, 1, 1, 0, 0),
    }
    return transmap[dat] if dat in transmap else dat

然后您會想像:

for rownum in sh.iter_rows():
            wr.writerow([unicode(_transmap(val.value)).encode('ascii','ignore') for val in rownum])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM