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

相关问题:Error in converting txt to xlsx using python

我修改了以下代码,谢谢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文件,然后单击“转换为数字”时.

如果单元格是纯数字的,此代码是否可以通过将单元格属性自动设置为数字的方式将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是该列,则在保存之前将值转换为浮点数.

如果按行-

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

您的意思是要为所有只包含数字(甚至不是小数)的单元格将其设置为number,然后可以使用以下方法-

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().

上一篇:福昕foxit phantom pdf高级编辑器企业版10.1 pro安装破解教程


下一篇:python-如何使用openpyxl设置图表区域的图形属性