如何使用python设置XLSX文件中单元格的数字格式

时间:2018-10-06 21:06:35

标签: excel python-3.x pandas format xlsxwriter

我想使用python脚本为XLSX文件中的列或单元格设置数字格式。

转换脚本获取CSV文件并将其转换为XLSX。我故意将标头视为常规行,因为最终脚本会在转换结束时按照指定的命令行参数以各种方式进行处理。

下面的示例仅显示我尝试将数字格式设置为列或单元格的情况。

我该怎么办?

使用此代码,我设法在右侧设置对齐方式。但是任何设置数字格式的方法均会失败。 XLSX文件仍将绿色三角形保留在单元格的左上角,并拒绝将其视为数字单元格。 随附的屏幕截图显示“错误”结果。

enter image description here

----数据文件----

a,b,c,d,e
q,1,123,0.4,1
w,2,897346,.786876,-1.1
e,3,9872346,7896876.098098,2.098
r,4,65,.3,1322
t,5,1,0.897897978,-786

---- python脚本----

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

import os
import pandas
import xlsxwriter

def is_type( value ):
    '''Function to identify true type of the value passed
        Input parameters:   value - some value which type need to be identified
        Returned values:    Type of the value
    '''
    try:
        int(value)
        return "int"
    except:
        try:
            float(value)
            return "float"
        except:
            return "str"

csv_file_name = "test37.csv"
xls_file_name = "test37.xlsx"

# Read CSV file to DataFrame
df = pandas.read_csv(csv_file_name, header=None, low_memory=False, quotechar='"', encoding="ISO-8859-1")
# Output DataFrame to Excel file
df.to_excel(xls_file_name, header=None, index=False, encoding="utf-8")
# Create writer object for output of XLSX file
writer = pandas.ExcelWriter(xls_file_name, engine="xlsxwriter")
# Write our Data Frame object to newly created file
xls_sheet_name = os.path.basename(xls_file_name).split(".")[0]
df.to_excel(writer, header=None, index=False, sheet_name=xls_sheet_name, float_format="%0.2f")
# get objects for workbook and worksheet
wb = writer.book
ws = writer.sheets[xls_sheet_name]
ws.set_zoom(120)

num_format1 = wb.add_format({
    'align': 'right'
})
num_format2 = wb.add_format({
    'align': 'right',
    'num_format': '0.00'
})
num_format3 = wb.add_format()
num_format3.set_num_format('0.00')

ws.set_column('D:D', None, num_format1)
ws.set_column('D:D', None, num_format2)

for column in df.columns:
    for row in range(1,len(df[column])):
        if is_type(df[column][row]) == "int":
            #print("int "+str(df.iloc[row][column]))
            ws.write( row, column, df.iloc[row][column], num_format2 )
        elif is_type(df[column][row]) == "float":
            #print("float "+str(df.iloc[row][column]))
            ws.write( row, column, df.iloc[row][column], num_format2 )
        else:
            pass


wb.close()
writer.save()

exit(0)

1 个答案:

答案 0 :(得分:1)

问题与您的xlsxwriter脚本无关,而在于您在Pandas中导入csv的方式。您的csv文件具有标题,但是您在pd.read_csv()中指定没有标题。因此,Pandas还将标题行解析为数据。因为标题是字符串,所以整个列都作为字符串(而不是整数或浮点数)导入。

只需删除pd.read_csv和df.to_excel()中的'header = None',它就可以正常工作。

如此:

...<first part of your code>

# Read CSV file to DataFrame
df = pandas.read_csv(csv_file_name, low_memory=False, quotechar='"', encoding="ISO-8859-1")
# Output DataFrame to Excel file
df.to_excel(xls_file_name, index=False, encoding="utf-8")

<rest of your code>...