Python:Openpyxl 为空单元格输出 "None"

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() 构造函数而没有 value.

您需要更改代码以处理 "empty" 个单元格:

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])

注意:由于您将数据导出到 CSV 文件,大概是 Windows 用户,您可以选择更有用的编码,例如:cp1252.

为什么?因为把"empty"等同于"None"似乎是对的。不过我想要 '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])