Как установить числовой формат ячейки в файле XLSX, используя Python - PullRequest
0 голосов
/ 07 октября 2018

Я хочу установить числовой формат для столбца или ячейки в файле XLSX, используя скрипт python.

Скрипт преобразования принимает файл 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 голосов
/ 07 октября 2018

Проблема не имеет ничего общего с вашим сценарием xlsxwriter, но заключается в том, как вы импортируете csv в Pandas.Ваш csv-файл имеет заголовок, но вы указываете в pd.read_csv (), что заголовка нет.Поэтому Pandas также анализирует строку заголовка как данные.Поскольку заголовок является строкой, весь столбец импортируется как строка (вместо целого или с плавающей точкой).

Просто удалите header = None в pd.read_csv и df.to_excel (), и все должно работать нормально.

так:

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