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

时间:2015-08-26 01:32:49

标签: python python-2.7 openpyxl

相关问题: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?

2 个答案:

答案 0 :(得分:1)

我认为问题在于,当您使用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

如果按行 -

  

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

你的意思是你想把它设置为只有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 :(得分:0)

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

  1. 您可以/应该将您的值从CSV转换为{ "_id" : "Project1", "data" : [ { "suite-pass" : 2, "suite-fail" : 1, "date" : ISODate("2015-08-19T08:40:47.049Z") }, { "suite-pass" : 1, "suite-fail" : 2, "date" : ISODate("2015-08-19T08:50:47.049Z") } ] } int,如下所示:

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

相关问题