Last active
February 10, 2020 19:41
-
-
Save CoutinhoElias/86412c73effb229ddb326df1a9d10afd to your computer and use it in GitHub Desktop.
Gerando em Excel
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import xlsxwriter | |
question_add = [{'CdChamada': '000001 ', 'DsCampo': 'TESTE', 'DsConteudo': 'T1'}, | |
{'CdChamada': '000001 ', 'DsCampo': 'TESTE', 'DsConteudo': 'T2'}, | |
{'CdChamada': '000001 ', 'DsCampo': 'TESTE', 'DsConteudo': '1000'}, | |
{'CdChamada': '000001 ', 'DsCampo': 'TESTE', 'DsConteudo': 'VALOR 01'}, | |
{'CdChamada': '000001 ', 'DsCampo': 'SALUSTIANO', 'DsConteudo': 'QUARTO CAMPO'}, | |
{'CdChamada': '000002 ', 'DsCampo': 'TESTE 02', 'DsConteudo': 'OS2'}, | |
{'CdChamada': '000002 ', 'DsCampo': 'TESTE 02', 'DsConteudo': '2'}, | |
{'CdChamada': '000002 ', 'DsCampo': 'TESTE 02', 'DsConteudo': '3'}, | |
{'CdChamada': '000002 ', 'DsCampo': 'TESTE 02', 'DsConteudo': 'VALOR 02'}, | |
{'CdChamada': '000003 ', 'DsCampo': 'TESTE 02', 'DsConteudo': 'OS2'}, | |
{'CdChamada': '000003 ', 'DsCampo': 'TESTE 02', 'DsConteudo': '2'}, | |
{'CdChamada': '000003 ', 'DsCampo': 'TESTE 02', 'DsConteudo': '3'}, | |
{'CdChamada': '000003 ', 'DsCampo': 'TESTE 02', 'DsConteudo': 'VALOR 03'} | |
] | |
processed_data = {} | |
# Pega todos os nomes dos campos | |
fields = sorted(set(field_title for field_title in map(lambda x: x['DsCampo'], question_add))) | |
# Inserer o campo de OS porque ele não faz parte dos DsCampo | |
fields.insert(0, 'OS') | |
# Percorre todas os registros e os unica em registro processados | |
for question in question_add: | |
os_number = question.get('CdChamada') | |
# se já processamos um número de OS, nós enriquecemos ele com mais campos | |
if os_number in processed_data.keys(): | |
processed_data[os_number][question['DsCampo']] = question['DsConteudo'] | |
else: # senão.. criamos um novo com um campo | |
processed_data[os_number] = { | |
question['DsCampo']: question['DsConteudo'] | |
} | |
# o CSV nada mais é que um TXT com um formato | |
csv_data = [] | |
# Adiciona a linha com o nome das colunas no CSV | |
csv_data.append(','.join(fields) + ';\n') | |
i = 0 | |
# Passa por todos os registros que reduzimos os campos em vários registros para um único de acordo com a OS | |
for os_number in sorted(processed_data): | |
os_data = processed_data[os_number] | |
line_data = [] | |
data = [] | |
# Passamos por todas as colunas para que possamos respeitar a ordem delas no CSV (dict não tem ordem nas chaves) | |
for title in fields: | |
# se for a coluna de OS, devemos simplesmente pegar a chave do dicionario | |
if title == 'OS': | |
line_data.append(f'{os_number}') | |
else: | |
# Tentamos pegar o valor da coluna do dict, caso não seja encontrado nós damos o valor default de '-' | |
line_data.append(f'{os_data.get(title, "-")}') | |
# inserimos a linha no CSV respeitando o formato dele | |
csv_data.append(','.join(line_data) + ';\n') | |
print(line_data) | |
# Meu problema começa nas linhas 83-84 | |
# -------------------------------------------------------------------------------------- | |
workbook = xlsxwriter.Workbook('Coutinho.xlsx') | |
worksheet = workbook.add_worksheet('Elias') | |
# worksheet.write(0, 0, line_data[0]) | |
# worksheet.write(0, 1, line_data[1]) | |
# worksheet.write(0, 2, line_data[2]) | |
# worksheet.write(0, 3, line_data[3]) | |
# worksheet.write(1, 0, line_data[0]) | |
# worksheet.write(1, 1, line_data[1]) | |
# worksheet.write(1, 2, line_data[2]) | |
# worksheet.write(1, 3, line_data[3]) | |
# worksheet.write(2, 0, line_data[0]) | |
# worksheet.write(2, 1, line_data[1]) | |
# worksheet.write(2, 2, line_data[2]) | |
# worksheet.write(2, 3, line_data[3]) | |
# Se observar as linhas comentadas de 68-81 verá que tentei fazer manualmente | |
for column in range(len(line_data)): | |
worksheet.write(i, column, line_data[column]) | |
print(i, '-', column, ' === ', line_data[column]) | |
workbook.close() | |
i+=1 #Inicializo o i na linha 43 | |
# -------------------------------------------------------------------------------------- | |
# Salvamos as linhas num arquivo de saida | |
with open('custom_fields.csv', 'w') as output: | |
output.writelines(csv_data) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Resolvido!!!
question_add = [{'CdChamada': '000001 ', 'DsCampo': 'TESTE', 'DsConteudo': 'T1'},
{'CdChamada': '000001 ', 'DsCampo': 'TESTE', 'DsConteudo': 'T2'},
{'CdChamada': '000001 ', 'DsCampo': 'TESTE', 'DsConteudo': '1000'},
{'CdChamada': '000001 ', 'DsCampo': 'TESTE', 'DsConteudo': 'VALOR 01'},
{'CdChamada': '000001 ', 'DsCampo': 'SALUSTIANO', 'DsConteudo': 'QUARTO CAMPO'},
]
processed_data = {}
Pega todos os nomes dos campos
fields = sorted(set(field_title for field_title in map(lambda x: x['DsCampo'], question_add)))
Inserer o campo de OS porque ele não faz parte dos DsCampo
fields.insert(0, 'OS')
Percorre todas os registros e os unica em registro processados
for question in question_add:
os_number = question.get('CdChamada')
# se já processamos um número de OS, nós enriquecemos ele com mais campos
if os_number in processed_data.keys():
processed_data[os_number][question['DsCampo']] = question['DsConteudo']
else: # senão.. criamos um novo com um campo
processed_data[os_number] = {
question['DsCampo']: question['DsConteudo']
}
o CSV nada mais é que um TXT com um formato
csv_data = []
Adiciona a linha com o nome das colunas no CSV
csv_data.append(','.join(fields) + ';\n')
Inicializa o i para definir a linhana geração do Excel
i = 0
Cria o documento para escrever
workbook = xlsxwriter.Workbook('Coutinho.xlsx')
Dá o nome a planilha.
worksheet = workbook.add_worksheet('Elias')
Passa por todos os registros que reduzimos os campos em vários registros para um único de acordo com a OS
for os_number in sorted(processed_data):
os_data = processed_data[os_number]
line_data = []
Percorre cada registro de line_data para definir a coluna
Incrementa o i dentro do for para definir a linha na geração do Excel.
Fecha o arquivo aberto.
workbook.close()
Salvamos as linhas num arquivo de saida
with open('custom_fields.csv', 'w') as output:
output.writelines(csv_data)