Skip to content

Instantly share code, notes, and snippets.

@CoutinhoElias
Last active February 10, 2020 19:41
Show Gist options
  • Save CoutinhoElias/86412c73effb229ddb326df1a9d10afd to your computer and use it in GitHub Desktop.
Save CoutinhoElias/86412c73effb229ddb326df1a9d10afd to your computer and use it in GitHub Desktop.
Gerando em Excel
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)
@CoutinhoElias
Copy link
Author

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'},

            {'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'},

            {'CdChamada': '000003    ', 'DsCampo': 'TESTE 03', 'DsConteudo': 'OS3'},
            {'CdChamada': '000003    ', 'DsCampo': '1 MAIS UM', 'DsConteudo': '2'},
            {'CdChamada': '000003    ', 'DsCampo': '597629', 'DsConteudo': 'ELIAS'},
            {'CdChamada': '000003    ', 'DsCampo': 'chmod 777 file', 'DsConteudo': 'file.txt'}

]

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 = []

# 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')

Percorre cada registro de line_data para definir a coluna

for column in range(len(line_data)):
    worksheet.write(i, column, line_data[column])

Incrementa o i dentro do for para definir a linha na geração do Excel.

i+=1

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)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment