将 txt 转换为 xlsx,同时将数字单元格的单元格 属性 设置为数字

Converting txt to xlsx while setting the cell property for number cells as number

相关问题:

我修改了以下代码,谢谢 Anand S Kumar。

import csv
import openpyxl

import sys


def convert(input_path, output_path):
    """
    Read a csv file (with no quoting), and save its contents in an excel file.
    """
    wb = openpyxl.Workbook()
    ws = wb.worksheets[0]

    with open(input_path) as f:
        reader = csv.reader(f, delimiter='\t', quoting=csv.QUOTE_NONE)
        for row_index, row in enumerate(reader, 1):
            for col_index, value in enumerate(row, 1):
                ws.cell(row=row_index, column=col_index).value = value

    wb.save(output_path)


def main():
    try:
        input_path, output_path = sys.argv[1:]
    except ValueError:
        print 'Usage: python %s input_path output_path' % (sys.argv[0],)
    else:
        convert(input_path, output_path)


if __name__ == '__main__':
    main()

这样做的一个问题是,它以一种将纯数字单元格保存为普通文本的方式保存 xlsx。

因此,当我不得不使用 MS-Excel 手动打开 xlsx 文件,然后单击 "Convert to number"。

如果单元格是纯数字,此代码能否以自动将单元格 属性 设置为数字的方式将 txt 转换为 xlsx?

我认为问题是当您使用 csv 模块读取数据时,您正在读取所有字符串。示例 -

a.csv 看起来像 -

1,2,3
3,4,5
4,5,6

代码和结果 -

>>> import csv
>>> with open('a.csv','r') as f:
...     reader = csv.reader(f)
...     for row in reader:
...             print(row)
...
['1', '2', '3']
['3', '4', '5']
['4', '5', '6']

并且在您的特定代码中,您直接将 csv 模块返回的值设置为 openpyxl ,因此您得到的是字符串,而不是数字。

这里最好的解决方案是,如果您知道哪些列是您希望数据为整数的列,则可以检查您的代码以将这些数据转换为整数,然后再将其设置为 excel。示例 -

int_cols = set([2,4,5]) #This should be the list of all columns , 1 indexed, that contain integers.
with open(input_path) as f:
    reader = csv.reader(f, delimiter='\t', quoting=csv.QUOTE_NONE)
    for row_index, row in enumerate(reader, 1):
        for col_index, value in enumerate(row, 1):
            if col_index in int_cols:
                 ws.cell(row=row_index, column=col_index).value = int(value)
            else:
                ws.cell(row=row_index, column=col_index).value = value

如果有浮动,你可以对它们使用类似的逻辑,定义一组浮动的列,然后如果 col_index 是那个列,在保存之前将值转换为 float .


如果按行 -

Can this code convert txt to xlsx in a way that automatically sets the cell property as number, if the cell is purely number?

你的意思是你想为所有只有 digits (甚至不是小数)的单元格设置它为数字,那么你可以使用像下面这样的方法 -

def int_or_str(x):
    try:
        return int(x)
    except ValueError:
        return x

然后在您的代码中,您可以将设置值的行更改为 -

ws.cell(row=row_index, column=col_index).value = int_or_str(value)

在上面的方法中使用float(),如果你也想转换浮点数。

有两件事可能导致您的问题:

  1. 您 can/should 将您的值从 CSV 转换为 intfloat,如下所示:

    ws.cell(row=row_index, column=col_index).value = int(value)  # or float(value)
    
  2. 您的 csv.reader;你应该确保你确实有制表符作为分隔符或者你的 CSV 确实没有被引用。

openpyxl 确实支持工作簿的 guess_types 参数,如果可能的话会将字符串转换为数字。在没有歧义的情况下使这种事情变得更容易。但是您通常最好自己管理转换。