Как мне сохранить строковые данные, извлеченные из нескольких листов Excel, в новую книгу, используя openpyxl / pandas или что-нибудь python? - PullRequest
1 голос
/ 13 июля 2020

Второй вопрос к сообществу Stack overflow - я пока не очень хорошо разбираюсь в этом ....

Я пытаюсь написать код, который

  1. откроет серию документов Excel и найдите лист 'Модерируемый'
  2. извлеките значения из ряда ячеек
  3. перегруппируйте данные в новый лист Excel, при этом каждая отдельная электронная таблица будет представлена ​​в виде новой строки ячеек

Я ДУМАЮ, что я достиг 1 и 2 из приведенного выше списка, хотя значения возвращаются в виде строки, и это, кажется, вызывает проблемы с сохранением в Excel. Раздел небрежного кода импорта отражает варианты, которые я изучал до сих пор ...

`import sys
import os
import openpyxl
import pandas as pd
import numpy as np
import glob
from openpyxl.workbook import workbook
from openpyxl import load_workbook

path=r'C:\Users\longr\Desktop\pfile\sandbox' #working directory
filenames = glob.glob(path + "/*.xlsx")#lists all excel files

for file in filenames:
    
    wb1 = load_workbook(file, data_only=True)#works
    ws1=wb1['Moderated']#works
    
    for row in ws1.iter_rows(min_row=3,max_row=7,min_col=5,max_col=5):
        for cell in row:
            a=(cell.value)
            print (a) #works
            
   
    for row in ws1.iter_rows(min_row=3,max_row=7,min_col=7,max_col=7):
        for cell in row:
            b=(cell.value)
            print (b) 

print(type(a))
    
writer = pd.ExcelWriter(r'C:\users\longr\Desktop\pfile\sandbox\Out\Out.xlsx', engine='openpyxl')
df.to_excel(writer, index=True)`

Результат на данный момент ...
Лист 1 text1 (e2)
Лист 1 text2 (e4)
Лист 1 text3 (e5)
Нет
Лист 1 text4 (e7)
Лист 1 text5 (g3)
Лист 1 text6 (g4)
Лист 1 text7 (g5)
Лист 1 текст 8 (g6)
Лист 1 text9 (g7)
Лист 2 text1 (e2)
Лист 2 text2 (e4)
Лист 2 text3 (e5)
Нет
лист 2 text4 (e7)
лист 2 text5 (g3)
лист 2 text6 (g4)
лист 2 text7 (g5)
лист 2 текст 8 (g6)
лист 2 text9 (g7)

В конечном итоге я бы хотел получить .. excel sheet with 10 columns all in a different order from the original list recover, one per spreadsheet read

ANY help would be appreciated - but especially if aimed at newbie programmer


THANK YOU to JONAS for suggesting code below - output now looks like this screenshot of excel spreadsheet with 5 column headers and 4 rows 5 columns rather than the 9 I was aiming for. I also want to title the headings differently, so H1 / HA / Header A is just a bookmark, I wasnt clear about that when I first asked the question

таблица Excel с 10 заголовками столбцов и 2 строками

Йонас - ваш код НАМНОГО лучше моего [намного элегантнее!]

С предложенным кодом

#LATEST
import sys
import os
import openpyxl
import pandas as pd
import numpy as np
import glob
from openpyxl.workbook import workbook
from openpyxl import load_workbook
from openpyxl import writer

path=r'C:\Users\longr\Desktop\pfile\sandbox' #working directory
filenames = glob.glob(path + "/*.xlsx")#lists all excel files

new_df=[] #create new DataFrame

#create a new list, which will be your result

for file in filenames:
    
    wb1 = load_workbook(file, data_only=True)#works
    ws1=wb1['Moderated']#works
    
    a = [] #list for values in col = 5
    b = [] #list for values in col = 7

    for row in ws1.iter_rows(min_row=3,max_row=7,min_col=5,max_col=7): #use the loop to directly get the values from column 5 and 7.
        for i, cell in enumerate(row):
            if i == 0: a.append(cell.value) # save cell of col = 5 value into list a
            if i == 2: b.append(cell.value) # save cell of col = 7 value into list b

    new_df.append(a+b) #append list a and b to your bigger list for each excel-fi              
                
import string   
alphabet = string.ascii_uppercase[:27] # Alphabet for column names (header A, header B, ...)
    
df = pd.DataFrame(new_df, columns = ['header ' + alphabet[i] for i in range(len(new_df[0]))]) #create new DataFrame

writer = pd.ExcelWriter(r'C:\users\longr\Desktop\pfile\sandbox\out\out.xlsx', engine='openpyxl')

wb.save(r'C:\users\longr\Desktop\pfile\sandbox\out\out.xlsx') 

print('Spreadsheet saved')#works

КОД ОШИБКИ: NameError: имя 'wb' не определено

1 Ответ

1 голос
/ 13 июля 2020

Итак, вы могли бы попробовать сохранить значения ваших ячеек в list, а затем снова сохранить этот список в list для каждого из ваших файлов Excel, который будет вашим новым DataFrame:

new_df = [] #create a new list, which will be your result

for file in filenames:
    
    wb1 = load_workbook(file, data_only=True)#works
    ws1=wb1['Moderated']#works
    
    a = [] #list for values in col = 5
    b = [] #list for values in col = 7

    for row in ws1.iter_rows(min_row=3,max_row=7,min_col=5,max_col=7): #use the loop to directly get the values from column 5 and 7.
        for i, cell in enumerate(row):
            if i == 0: a.append(cell.value) # save cell of col = 5 value into list a
            if i == 2: b.append(cell.value) # save cell of col = 7 value into list b

    new_df.append(a+b) #append list a and b to your bigger list for each excel-file    


import string   
alphabet = string.ascii_uppercase[:27] # Alphabet for column names (header A, header B, ...)
    
df = pd.DataFrame(new_df, columns = ['header ' + alphabet[i] for i in range(len(new_df[0]))]) #create new DataFrame

with pd.ExcelWriter('C:\users\longr\Desktop\pfile\sandbox\Out\Out.xlsx') as writer:
    df.to_excel(writer)
...