我有一个代码,从数据库中获取一些信息,并将其保存在Excel电子表格中。我的问题是在工作表中插入数字数据,因为当我运行并打开工作表时,我得到消息“转换为数字”。有没有一种方法可以用代码进行这种直接转换?
from hdbcli import dbapi
import pandas as pd
import time
from pyhdbcli import Error
from openpyxl import Workbook
from openpyxl.styles import numbers
try:
con = dbapi.connect(
address="xx",
port=xx,
user="xx",
password="xx",
databasename='xx'
)
declaracao = """
SELECT "VTEXT_PAPH2", "DSC_COMPOSTO", "ARTNR", "MAKTX",sum("KF_QTDADE_VENDAS") AS "KF_QTDADE_VENDAS", sum("KF_PESO_LIQUIDO") AS KF_PESO_LIQUIDO, sum("KF_SOMA_RECEITA_BRUTA_VENDAS") AS KF_SOMA_RECEITA_BRUTA_VENDAS, sum("KF_DEDUCOES_VENDAS") AS KF_DEDUCOES_VENDAS, sum("KF_DEVOLUCAO_VENDAS") AS KF_DEVOLUCAO_VENDAS, sum("KF_IMPOSTOS_S_VENDAS") AS KF_IMPOSTOS_S_VENDAS, sum("KF_ISS") AS KF_ISS, sum("KF_ICMS") AS KF_ICMS, sum("KF_PIS") AS KF_PIS, sum("KF_COFINS") AS KF_COFINS, sum("KF_IPI") AS KF_IPI, sum("KF_REC_LIQ_VENDAS") AS KF_REC_LIQ_VENDAS, sum("KF_CUSTO_PROD_VENDIDO") AS KF_CUSTO_PROD_VENDIDO, sum("KF_MATERIAIS") AS KF_MATERIAIS, sum("KF_MATERIA_PRIMA") AS KF_MATERIA_PRIMA, sum("KF_INGREDIENTES") AS KF_INGREDIENTES, sum("KF_EMBALAGENS") AS KF_EMBALAGENS, sum("KF_SEMIACABADOS") AS KF_SEMIACABADOS, sum("KF_PRODUTO_ACABADO") AS KF_PRODUTO_ACABADO, sum("KF_CO_PRODUTO") AS KF_CO_PRODUTO, sum("KF_DIFER_INVENTARIO") AS KF_DIFER_INVENTARIO, sum("KF_SERVICOS") AS KF_SERVICOS, sum("KF_SUBCONTRATACAO") AS KF_SUBCONTRATACAO, sum("KF_CMV_REVENDA") AS KF_CMV_REVENDA, sum("KF_RESULT_BRUTO_OPER") AS KF_RESULT_BRUTO_OPER, sum("KF_DESP_COM_VARIAVEIS") AS KF_DESP_COM_VARIAVEIS, sum("KF_COMISSOES_VENDAS") AS KF_COMISSOES_VENDAS, sum("KF_DESP_LOGISTICA_SOMA") AS KF_DESP_LOGISTICA_SOMA, sum("KF_DESCONTOS_INSTITUC") AS KF_DESCONTOS_INSTITUC, sum("KF_MARGEM_DE_CONTRIB") AS KF_MARGEM_DE_CONTRIB, sum("KF_CUSTOS_FIXOS") AS KF_CUSTOS_FIXOS, sum("KF_MAO_DE_OBRA") AS KF_MAO_DE_OBRA, sum("KF_GASTOS_GERAIS_FAB") AS KF_GASTOS_GERAIS_FAB, sum("KF_DESPESAS_FIXAS") AS KF_DESPESAS_FIXAS, sum("KF_DESP_ADMINISTRATIV") AS KF_DESP_ADMINISTRATIV, sum("KF_DESP_COMERCIAIS_TRADE") AS KF_DESP_COMERCIAIS_TRADE, sum("KF_DESP_COMERCIAIS") AS KF_DESP_COMERCIAIS, sum("KF_DESP_TRADE_MKT") AS KF_DESP_TRADE_MKT, sum("KF_DESP_MKT") AS KF_DESP_MKT, sum("KF_DESP_OPERACIONAL") AS KF_DESP_OPERACIONAL, sum("KF_DESP_TRIBUTARIA") AS KF_DESP_TRIBUTARIA, sum("KF_DESPESAS_PERDA_E_PROV") AS KF_DESPESAS_PERDA_E_PROV, sum("KF_OUTROS_RESULT_OPER") AS KF_OUTROS_RESULT_OPER, sum("KF_OUTRAS_REC_OPER") AS KF_OUTRAS_REC_OPER, sum("KF_OUTRAS_DESP_OPER_SOMA") AS KF_OUTRAS_DESP_OPER_SOMA, sum("KF_RES_ANTES_EF_FINAN") AS KF_RES_ANTES_EF_FINAN, sum("KF_RESULTADO_FINANC") AS KF_RESULTADO_FINANC, sum("KF_RECEITA_FINANCEIRA") AS KF_RECEITA_FINANCEIRA, sum("KF_DESPESA_FINANCEIRA") AS KF_DESPESA_FINANCEIRA, sum("KF_RES_ANTES_IR_CSLL") AS KF_RES_ANTES_IR_CSLL, sum("KF_PROVISAO_IR_CSLL") AS KF_PROVISAO_IR_CSLL, sum("KF_RES_APOS_IR_CSLL") AS KF_RES_APOS_IR_CSLL, sum("KF_OVER_PRICING") AS KF_OVER_PRICING
FROM "_SYS_BIC"."tirol.co/LUM_DRE_COPA_REAL_TESTE_ROBO"
WHERE (("MANDT" IN ('300') ))
AND (("DT_ANO" IN ('2023') ))
AND (("DT_BUDAT" BETWEEN ('20230501')
and ('20230524')))
GROUP BY "MANDT", "DT_PERIO", "DT_ANO", "VRGAR", "VERSI", "DT_BUDAT", "ARTNR", "MAKTX", "VTEXT_PAPH2", "DSC_COMPOSTO"
"""
cursor = con.cursor()
cursor.execute(declaracao)
linhas = cursor.fetchall()
workbook = Workbook()
sheet = workbook.active
header = ['Sublinha desc.', 'Composto Descrição', 'Artigo', 'Artigo desc.', 'QUANTIDADE VENDAS LÍQUIDA', 'PESO VENDAS LÍQUIDO', 'RECEITA BRUTA DE VENDAS', '(=) Deduções Vendas', 'Devoluções Vendas', '-- Descontos Institucionais', 'Over Pricing', '- Impostos S/ Vendas', '-- ISS', '-- ICMS', '-- PIS', '-- COFINS', '-- IPI', '(=) RECEITA LÍQUIDA VENDAS', '- CUSTO PRODUTO VENDIDO', '-- Materiais', '--- Matéria Prima', '--- Ingredientes', '--- Embalagens', '--- Semiacabados', '--- Produtos Acabados', '--- Co-Produto', '--- Diferença de Inventário', '-- Serviços', '--- Subcontratação', '- CMV - REVENDA', '= RECEITA LÍQUIDA - CV.', '- Despesas Comerciais Variaveis', '-- Comissões de Vendas', '-- Despesas Logísticas', '= MARGEM de CONTRIBUIÇÃO', '- Custos Fixos', '-- Mão de Obra', '-- Gastos Gerais Fabricação', '- Despesas Fixas', '-- Despesas Administrativas', '-- Despesas Comerciais', '--- Desp. Comerciais (somente as desp comerciais)', '--- Desp. Trade Mkt (somente as desp de trade)', '-- Despesas de Marketing', '-- Despesas Operacional', '-- Despesas Tributárias', '-- Despesas com Perda e Provisões', '- Outros Resultados Operacionais', '-- Outras Receitas Operacionais', '-- Outras Despesas Operacionais', '= RES. ANTES EF. FINANCEIRO', '- Resultado Financeiro', '-- Receita Financeira', '-- Despesa Financeira', 'RES. ANTES IR/CSLL', '-- Provisão IR/CSLL', 'RES. APÓS IR/CSLL',]
sheet.append(header)
for linha in linhas:
valores = [str(valor) if not isinstance(valor, (float, int)) else valor for valor in linha]
sheet.append(valores)
for cell in sheet[sheet.max_row]:
if isinstance(cell.value, (float, int)):
cell.number_format = numbers.FORMAT_CURRENCY_BRL_SIMPLE
workbook.save('dados3.xlsx')
except Error as e:
print("Erorr - ", e)
finally:
cursor.close()
con.close()
为了解决这个问题,我尝试了下面这行代码,但它仍然没有解决这个问题
if isinstance(cell.value, (float, int)):
cell.number_format = numbers.FORMAT_CURRENCY_BRL_SIMPLE
1条答案
按热度按时间8mmmxcuj1#
要使用Python转换Excel电子表格中的数字数据,您可以使用
openpyxl
库并将单元格的数字格式设置为所需的格式。在您的代码中,您已经导入了openpyxl
,因此您可以如下设置数字格式:这将检查单元格值是浮点还是整数,如果是,则将数字格式设置为巴西货币与简单格式。
如果您想设置不同的数字格式,可以参考
openpyxl
中的numbers
模块,该模块有许多可用的格式可供选择。