如何使用 openpyxl / pandas 或任何 python 将我从几个 excel 表中提取的字符串数据保存到新工作簿中?

Posted

技术标签:

【中文标题】如何使用 openpyxl / pandas 或任何 python 将我从几个 excel 表中提取的字符串数据保存到新工作簿中?【英文标题】:How do I save the string data I have extracted from several excel sheets to a new workbook using openpyxl / pandas or anything python? 【发布时间】:2020-07-13 17:32:48 【问题描述】:

堆栈溢出社区的第二个问题 - 我还不太擅长这个......

我正在尝试编写一些代码

    打开一系列 Excel 文档并找到工作表“已审核” 从多个单元格中提取值 将数据重新排列到新的 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)

我最终想要的是..

任何帮助将不胜感激 - 但尤其是针对新手程序员


感谢 JONAS 在下面建议代码 - 输出现在看起来像这样 5 列,而不是我想要的 9 列。我也想给标题起不同的标题,所以 H1 / HA / Header A 只是一个书签,我第一次问这个问题时并不清楚

Jonas - 你的代码比我的代码好很多 [更优雅!]


使用建议的代码


#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: name 'wb' is not defined

【问题讨论】:

【参考方案1】:

因此,您可以尝试将单元格的值保存到 list 中,然后再次将此列表保存到每个 excel 文件的 list 中,这将是您的新 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)

【讨论】:

看起来好多了 - 但输出是 5 列而不是我想要的 9 列 您可以在内部 for 循环中改变行和列的范围。目前,您正在为第 5 列和第 7 列获取从 min_row = 3 到 max_row = 7 的值。如果您想获得更多行,请将这些值 (min_row / max_row) 更改为您喜欢的任何值。 我可能不太清楚......循环运行良好 - 拾取所有正确的单元格......这是 excel 的输出是 5 列,行数是那里的两倍是电子表格。我想要每个电子表格一行 - 我似乎无法到达那里! #frustration! 那么在这种情况下,您只需将“new_df.append(a)”和“new_df.append(b)”更改为“new_df.append(a+b)”(我在我的发布)。 对它很感兴趣 - 得到一个新的 unicode 错误 - 所以在文件名中添加了 'r' (r'C:\user ...并且它可以工作!!谢谢!所有人都应该投票'已回答'' - 有帮助等 - 如果我可以给你买啤酒,请告诉我!:D

以上是关于如何使用 openpyxl / pandas 或任何 python 将我从几个 excel 表中提取的字符串数据保存到新工作簿中?的主要内容,如果未能解决你的问题,请参考以下文章

Pandas与openpyxl库的超强结合,再见,Excel!

Pandas与openpyxl库的超强结合,再见,Excel!

Pandas与openpyxl库的超强结合,再见,Excel!

Pandas与openpyxl库的 "完美" 融合!

Python学习:如何使用pandas分析excel数据

将 pandas Series 或 DataFrame 列插入现有 Excel 文件的第一个空列(使用 OpenPyXL?)