使用XlsxWriter格式化Excel文件-区域设置似乎未应用于输出文件

lhcgjxsq  于 2023-01-18  发布在  其他
关注(0)|答案(1)|浏览(128)

我一直在尝试,一段时间以来,现在解决这个格式问题的工作,但无济于事。
我尽量简明扼要地说:我正在编写一个Python脚本作为自动化作业的一部分。该脚本预计将使用两个. csv文件作为输入,从客户端的数据库下载。. csv文件是通过自动化软件从其他地方获得的。之后,我基本上读取了主. csv(csv_dataframe)作为带有标题的 Dataframe ,另一个(csv_depara_espec)没有标题;然后我编辑了主csv,这样我就可以改变列的位置;然后用从辅助csv翻译的信息填充一列。到目前为止,所有工作都是使用Pandas完成的。然后,我使用xlsxwriter作为引擎创建了excel_dataframe,然后创建了一些格式化对象,然后将它们应用于excel_dataframe中的特定列。
下面是代码:

import os
from typing import Self
import pandas as pd
import pandas.io.excel
import numpy as np
import datetime
from datetime import datetime
from datetime import date
import time
import xlsxwriter

template_excel_file = r"C:\CriarTabelaOpme\Modelo Material Alto Custo - Intranet.xlsx"
depara_nome_espec_file = r"C:\CriarTabelaOpme\Especialidade_Dicionario.csv"

report_csv_file = r"C:\CriarTabelaOpme\ReportServiceIntranet.csv"

csv_dataframe = pd.read_csv(report_csv_file, sep = ',', encoding = "ISO-8859-1", engine = 'python', index_col = None, names = ['TIPO', 'CODIGO', 'PTU', 
'DESCRICAO', 'FORNECEDOR', 'VALOR', 'COD_PRINCP_ATIVO', 'PRINCIPIO_ATIVO', 'ANVISA', 'VALIDADE_RMS', 'FABRICANTE', 'DT_ATUALIZACAO', 'PTU_LIMITE', 'COD_ESP', 'NOME_ESPEC', 'REFERENCIA', 'OBSERVACAO'])
csv_dataframe.insert(16, "", "")

csv_depara_espec = pd.read_csv(depara_nome_espec_file, sep = ',', header = None, encoding = "ISO-8859-1", engine = 'python')
#print(csv_depara_espec)

csv_dataframe = csv_dataframe.iloc[:, [0,1,2,3,4,5,6,7,8,9,10,11,12,13,16,14,15]]
#print(csv_dataframe)

for row in range(len(csv_dataframe)):

    cod_esp_row = (csv_dataframe.iloc[row, 13])
    csv_dataframe.iloc[row,14] = csv_depara_espec.iloc[cod_esp_row, 1]

writer = pd.ExcelWriter(template_excel_file, engine = 'xlsxwriter', date_format = 'DD/MM/YYYY')

excel_dataframe = csv_dataframe.to_excel(writer, sheet_name = 'Material Alto Custo', index = False, header = ['TIPO', 'CODIGO', 'PTU', 
'DESCRICAO', 'FORNECEDOR', 'VALOR', 'COD_PRINCP_ATIVO', 'PRINCIPIO_ATIVO', 'ANVISA', 'VALIDADE_RMS', 'FABRICANTE', 'DT_ATUALIZACAO', 
'PTU_LIMITE', 'COD_ESP', 'NOME_ESPEC', 'REFERENCIA', 'OBSERVACAO'])

(max_row, max_col) = csv_dataframe.shape

workbook = writer.book 
worksheet = writer.sheets['Material Alto Custo']

header_format = workbook.add_format({'bold' : True, 
'font' : 'Arial', 
'size' : 10})

font_and_size = workbook.add_format({'font' : 'Arial', 'size' : 10}) 
column_valor_format = workbook.add_format({'num_format': '[$R$-pt-BR] #.##0,00'}) 
column_date_format = workbook.add_format({'num_format' : 'dd/mm/yyyy'}) 
column_left_zeroes_format = workbook.add_format({'num_format' : '00000000'})

worksheet.set_row(0, None, header_format)

worksheet.set_column(0,max_col, 20.0, font_and_size)

worksheet.set_column(1, 1, 20.0, column_left_zeroes_format)
worksheet.set_column(2, 2, 20.0, column_left_zeroes_format)

worksheet.set_column(5, 5, 20.0, column_valor_format)

worksheet.set_column(9, 9, 20.0, column_date_format)
worksheet.set_column(11, 11, 20.0, column_date_format)
worksheet.set_column(12, 12, 20.0, column_date_format)

for i, j in enumerate(list(csv_dataframe.columns)):
    worksheet.write(0, i, j, header_format)

#Fechar planilha
writer.close()

总而言之,格式化标题、每一列的字体和大小以及在数字左侧使用零掩码的B列和C列(索引1和2)可以很好地工作,但值(货币、巴西雷亚尔)和日期的格式就不行了。
这是代码执行后的结果格式:
[![在此输入图像说明][1]][1]
这是预期的结果:
[![在此输入图像说明][2]][2]
我通过手动双击每行中的每个单元格,然后按回车键,得到了预期的结果。前四行被手动修改以显示预期的效果。修改的列是F、J、M和M。
我认为这一定是由于Excel文件的区域设置格式(巴西葡萄牙语与美国英语相反,美国英语是我工作中使用的VM上的格式区域)。对于这个问题有什么要做的吗?
先谢谢你了!

sy5wg1nm

sy5wg1nm1#

这里有几个问题。
对于区域设置标题中的问题,您需要使用美国样式千位数和小数点值“”和.“”,而不是区域设置变量。在本例中,使用'[$R$-pt-BR] #,##0.00'而不是'[$R$-pt-BR] #.##0,00'。这在XlsxWriter文档的不同区域设置中的数字格式一节中有更详细的说明。
其次,货币/数字值实际上是字符串,因为数据是从CSV读取的。在您的图像中,您会注意到Excel单元格中的绿色三角形,这表明存在存储为字符串的数字。Excel不能/不会将数字格式应用于字符串,因此您需要将这些列转换为浮点数才能使数字格式生效。
此外,日期和日期时间格式由Pandas为每个单元格设置,不能被列格式覆盖。您需要在ExcelWriter() API中设置日期格式。
下面是一个进行这些更改的较小示例:

import pandas as pd
from datetime import datetime

# Create a Pandas dataframe from some datetime data.
df = pd.DataFrame({'valididad': [datetime(2023, 1, 1, 11, 30, 55),
                                 datetime(2023, 1, 2, 1,  20, 33),
                                 datetime(2023, 1, 3, 11, 10, 21),
                                 datetime(2023, 1, 4, 16, 45, 35),
                                 datetime(2023, 1, 5, 12, 10, 15)],
                   'valor':    ['53.4',
                                '723.19',
                                '1723.19',
                                '2723.19',
                                '1000000'],
                   })

# Convert numbers as strings to floats.
df['valor'] = df['valor'].astype(float)

# Also set the default datetime and date formats.
writer = pd.ExcelWriter("pandas_test.xlsx",
                        engine='xlsxwriter',
                        date_format='dd/mm/yyyy',
                        datetime_format='dd/mm/yyyy')

# Convert the dataframe to an XlsxWriter Excel object.
df.to_excel(writer, sheet_name='Sheet1', index=False)

# Get the xlsxwriter workbook and worksheet objects.
workbook = writer.book
worksheet = writer.sheets['Sheet1']

# Set the currency format.
valor_format = workbook.add_format({'num_format': '[$R$-pt-BR] #,##0.00'})
worksheet.set_column(1, 2, 16, valor_format)

# Set the column width to make the dates clearer.
worksheet.set_column(0, 0, 16)

# Close the Pandas Excel writer and output the Excel file.
writer.close()

这将给予预期结果:

相关问题