本文,用Python從一個Excel表格提取數(shù)據(jù)填到另一個表格,詳情代碼中注釋都說明了,請親們詳細(xì)查閱:文章來源地址http://www.zghlxwxcb.cn/news/detail-523013.html
#將要對填的兩張xlsx表格放在同一個目錄,并在下方指定該目錄
路徑='G:\\Xct\\python'
#“填寫表”就是要填充數(shù)據(jù)的EXCEL表格
填寫表='東璟府-備案管理人員工資表.xlsx'
#有些工作表第一行是大標(biāo)題,第二或三行才是明細(xì)標(biāo)題(如:姓名等)
#為節(jié)省程序運(yùn)行時間,在這里事先指定好標(biāo)題行,如:“姓名”在第
#3行,就在下面填“3”,類推。
填寫表標(biāo)題行=3
#“數(shù)據(jù)表”就是用來搜索數(shù)據(jù)(不修改,只當(dāng)字典查)的EXCEL表格
數(shù)據(jù)表='三項(xiàng)目備案人員銀行賬號匯總.xlsx'
數(shù)據(jù)表標(biāo)題行=1
#由于EXCEL表格排版多種多樣,為簡化模型,本代碼只自動搜索并
#填充一列數(shù)據(jù),親們?nèi)绻畛涠嗔?,可自行加一個循環(huán),或修改
# 下面這個數(shù)字,反復(fù)運(yùn)行本代碼,即可實(shí)現(xiàn)多列數(shù)據(jù)的填充(本代
# 碼總是在列后一列后面新增一列來填充數(shù)據(jù),所以不會造成數(shù)據(jù)覆蓋)
#數(shù)據(jù)表要填充的列是指:例如,一張表中有一列是“銀行賬號”,而
#另一張表則沒有,現(xiàn)要將前一張表(數(shù)據(jù)表)的“銀行賬號”這一列
# 的數(shù)據(jù)填充到后一張表(填寫表)中,那么“銀行賬號”這列所在的
# 列數(shù),就填在這下面。
數(shù)據(jù)表要填充的列=2
#--------------------沒有意義的分割符---------------------
#導(dǎo)入日志模塊
import logging
logging.basicConfig(level=logging.DEBUG,format='%(asctime)s-%(levelname)s:%(message)s')
logging.disable(logging.CRITICAL)
#logging.debug(變量)
#--------------------沒有意義的分割符---------------------
#切換工作目錄
import os
原工作目錄 = os.getcwd()
logging.debug(f'原工作目錄:%s' % (原工作目錄))
#預(yù)存儲工作目錄
os.chdir(路徑)
現(xiàn)工作目錄 = os.getcwd()
logging.debug(f'現(xiàn)工作目錄:%s' % (現(xiàn)工作目錄))
#切換到工作目錄
#--------------------沒有意義的分割符---------------------
#讀取填寫表
#讀取Excel文件,需要導(dǎo)入相關(guān)函數(shù)
#coding=gbk
import openpyxl
from openpyxl import load_workbook
要填寫的表格 = load_workbook(填寫表)
#--------------------沒有意義的分割符---------------------
# 獲得所有sheet的名稱
#print(f'該工作簿共有如下工作表:\n{要填寫的表格.get_sheet_names()}')
#--------------------沒有意義的分割符---------------------
# 獲得當(dāng)前正在顯示的sheet, 也可以用wb.get_active_sheet()
工作表 = 要填寫的表格.active
#print(f'獲得當(dāng)前正在顯示的工作表:{工作表}')
#print(f'獲得當(dāng)前正在顯示的工作表名:{工作表.title}')
#--------------------沒有意義的分割符---------------------
# 獲得最大列和最大行
最大列數(shù)=工作表.max_column
#print('最大列數(shù):', 工作表.max_column)
最大行數(shù)=工作表.max_row
#print('最大行數(shù):', 工作表.max_row)
#--------------------沒有意義的分割符---------------------
#定位“姓名”列
for 變量 in range(1,最大列數(shù)+1):
單元格= 工作表.cell(row=填寫表標(biāo)題行, column=變量)
if 單元格.value=='姓名':
姓名列=單元格.column
#print(姓名列)
#--------------------沒有意義的分割符---------------------
'''
#遍歷姓名
for 行變量 in range(填寫表標(biāo)題行+1,最大行數(shù)):
單元格 = 工作表.cell(row=行變量, column=姓名列)
if not 單元格.value==None:
print(單元格.value)
'''
#--------------------沒有意義的分割符---------------------
#讀取數(shù)據(jù)表
要查找的表格 = load_workbook(數(shù)據(jù)表)
#--------------------沒有意義的分割符---------------------
#獲得當(dāng)前正在顯示的工作表
數(shù)據(jù)工作表 = 要查找的表格.active
#print(f'獲得當(dāng)前正在顯示的工作表:{數(shù)據(jù)工作表.title}')
#--------------------沒有意義的分割符---------------------
# 獲得最大列和最大行
數(shù)據(jù)表最大列數(shù)=數(shù)據(jù)工作表.max_column
#print('數(shù)據(jù)表最大列數(shù):', 數(shù)據(jù)工作表.max_column)
數(shù)據(jù)表最大行數(shù)=數(shù)據(jù)工作表.max_row
#print('數(shù)據(jù)表最大行數(shù):', 數(shù)據(jù)工作表.max_row)
#--------------------沒有意義的分割符---------------------
#定位“數(shù)據(jù)姓名”列
for 數(shù)據(jù)變量 in range(1,數(shù)據(jù)表最大行數(shù)+1):
數(shù)據(jù)單元格= 數(shù)據(jù)工作表.cell(row=數(shù)據(jù)表標(biāo)題行, column=數(shù)據(jù)變量)
if 數(shù)據(jù)單元格.value=='姓名':
數(shù)據(jù)姓名列=數(shù)據(jù)單元格.column
#print(數(shù)據(jù)姓名列)
#--------------------沒有意義的分割符---------------------
'''
#遍歷數(shù)據(jù)表姓名
for 數(shù)據(jù)行變量 in range(數(shù)據(jù)表標(biāo)題行+1,數(shù)據(jù)表最大行數(shù)):
數(shù)據(jù)單元格 = 數(shù)據(jù)工作表.cell(row=數(shù)據(jù)行變量, column=數(shù)據(jù)姓名列)
if not 數(shù)據(jù)單元格.value==None:
print(數(shù)據(jù)單元格.value)
'''
#--------------------沒有意義的分割符---------------------
#遍歷填寫表姓名
for 行變量 in range(填寫表標(biāo)題行+1,最大行數(shù)):
單元格 = 工作表.cell(row=行變量, column=姓名列)
if not 單元格.value==None:
填寫表姓名=單元格.value
#遍歷數(shù)據(jù)表姓名
for 數(shù)據(jù)行變量 in range(數(shù)據(jù)表標(biāo)題行 + 1, 數(shù)據(jù)表最大行數(shù)):
數(shù)據(jù)單元格 = 數(shù)據(jù)工作表.cell(row=數(shù)據(jù)行變量, column=數(shù)據(jù)姓名列)
if not 數(shù)據(jù)單元格.value == None:
數(shù)據(jù)表姓名=數(shù)據(jù)單元格.value
#搜索兩表姓名
if 填寫表姓名==數(shù)據(jù)表姓名:
#在填寫表的最后一列后面,新增一列,用來填充搜索結(jié)果
修改填寫表單元格=工作表.cell(row=行變量, column=最大列數(shù)+1)
#定位到數(shù)據(jù)表的數(shù)據(jù)單元格,并獲取它的值(搜索的結(jié)果)
數(shù)據(jù)表數(shù)據(jù)源單元格=數(shù)據(jù)工作表.cell(row=數(shù)據(jù)行變量, column=數(shù)據(jù)表要填充的列)
#將“搜索結(jié)果”填入“填寫表”的當(dāng)前工作表中的最后一列
修改填寫表單元格.value = 數(shù)據(jù)表數(shù)據(jù)源單元格.value
#print (f'{填寫表姓名}的銀行賬號是:{修改填寫表單元格.value}')
#--------------------沒有意義的分割符---------------------
#保存表格
要填寫的表格.save(填寫表)
#--------------------沒有意義的分割符---------------------
# 打開修改后的Excel表格文件
import os
os.startfile(路徑+'//'+填寫表)
#--------------------沒有意義的分割符---------------------
'''
寫在后面的話:
1,為了防止各個工作表格式不同而出錯,我就不再遍歷所有工作
表了,需要在同一個工作簿中填充多張工作表的親,可自行將要
填充數(shù)據(jù)的工作表前置展示,然后保存退出,運(yùn)行一下上述代碼
就會自動填充當(dāng)前工作表。
2,需要注意的是:
如果要修改的EXCEL表格被打開著,會造成出錯,無法保存,所
以,運(yùn)行代碼前,需要先退出要修改的EXCEL表格。
3,日志模塊可以刪掉,代碼中已經(jīng)關(guān)閉了,這是測試時用的
4,作為國人,我討厭英文,所以能用中文的地方盡量用中文,
習(xí)慣看鳥語的親敬請見諒。
5,我是初學(xué)者,代碼中做了大量注釋,供自己學(xué)習(xí)、復(fù)習(xí)用,嫌
我煩的親還望海涵。如有錯誤或更簡便的方法,還請直言不諱。
6,除了用openpyxl,還有其它的模塊也能實(shí)現(xiàn)。我學(xué)Python不為
考級,故不考慮孔已己那樣的“回字有幾種寫法”,只要能解決現(xiàn)
實(shí)問題,一招制敵足矣。對其它模塊感興趣的親,可以參考后面
我問ChatGPT要來的答案——pandas庫和xlrd庫
——將出東方 2023-03-23
'''
#以下是GhatGPT的原文,一字未改,但請自行測試:
'''
當(dāng)然可以!以下是一個使用Python和openpyxl庫修改Excel單元格并
保存的示例代碼:
首先,確保已安裝openpyxl庫:
```
pip install openpyxl
```
接下來,可以使用以下代碼作為模板:
import openpyxl
# 加載Excel文檔
workbook = openpyxl.load_workbook('example.xlsx')
# 選擇要編輯的工作表
worksheet = workbook['Sheet1']
# 修改單元格內(nèi)容
worksheet['A1'] = 'Hello World!'
# 保存修改后的Excel文檔
workbook.save('example.xlsx')
```
在這個示例中,我們首先使用 `load_workbook()` 方法加載了一個
名為 `example.xlsx` 的Excel文檔。然后,我們選擇要編輯的工作表,
這里是 `Sheet1`。接著,我們使用 `worksheet['A1']` 訪問了單元格
`A1` 并將其內(nèi)容修改為 `Hello World!`。最后,我們使用 `save()` 方
法保存了修改后的Excel文檔。
希望這可以幫到你!
'''
#在我的追問下,GhatGPT給出的另外兩個方法:
'''
好的,這是一個很常見的任務(wù),你需要使用Python的pandas庫來讀
取和寫入Excel表格,以及使用xlrd庫來搜索數(shù)據(jù)。下面是一個基本
的代碼框架,你可以根據(jù)自己的需要進(jìn)行修改和擴(kuò)展:
```python
import pandas as pd
import xlrd
# 讀取要搜索的Excel表格
search_file = xlrd.open_workbook('search.xlsx')
search_sheet = search_file.sheet_by_index(0)
# 讀取要填寫數(shù)據(jù)的Excel表格
target_file = pd.read_excel('target.xlsx')
# 遍歷搜索表格中的每一行,查找匹配的數(shù)據(jù)并填寫到目標(biāo)表格中
for row_idx in range(1, search_sheet.nrows):
search_value = search_sheet.cell(row_idx, 0).value # 獲取要搜索的數(shù)據(jù)
target_row = target_file[target_file['列名'] == search_value] # 在目標(biāo)表格中查找匹配的行
if not target_row.empty:
# 如果找到匹配的行,則將搜索表格中的數(shù)據(jù)填寫到目標(biāo)表格中
target_file.at[target_row.index[0], '要填寫的列名'] = search_sheet.cell(row_idx, 1).value
# 保存目標(biāo)表格
target_file.to_excel('target.xlsx', index=False)
```
在上面的代碼中,你需要將其中的`search.xlsx`和`target.xlsx`替換
為你實(shí)際使用的文件名,并將`列名`和`要填寫的列名`替換為你實(shí)
際使用的列名。你還需要安裝xlrd和pandas庫,如果你還沒有安裝
的話。
'''
#還有一個方法:
'''
好的,這個任務(wù)可以使用Python中的pandas庫來完成。首先,我們
需要安裝pandas庫,這可以通過在終端中運(yùn)行以下命令來完成:
```
pip install pandas
```
然后,我們需要導(dǎo)入pandas庫并讀取要搜索的Excel表格和要填入
數(shù)據(jù)的Excel表格。假設(shè)要搜索的Excel表格名為“search.xlsx”,要
填入數(shù)據(jù)的Excel表格名為“output.xlsx”,則可以使用以下代碼來完
成:
```python
import pandas as pd
# 讀取要搜索的Excel表格
df_search = pd.read_excel('search.xlsx')
# 讀取要填入數(shù)據(jù)的Excel表格
df_output = pd.read_excel('output.xlsx')
```
接下來,我們可以使用pandas庫中的merge函數(shù)將兩個表格合并。
假設(shè)要在要填入數(shù)據(jù)的Excel表格中填入名為“John”的人的數(shù)據(jù),
則可以使用以下代碼:
```python
# 將兩個表格合并
df_merged = pd.merge(df_output, df_search[df_search['Name'] == 'John'], on='ID', how='left')
# 在要填入數(shù)據(jù)的Excel表格中填入搜索到的數(shù)據(jù)
df_merged.loc[df_merged['Name_y'].notna(), 'Data'] = df_merged['Data'] + df_merged['Name_y']
# 刪除不需要的列
df_merged = df_merged.drop(['Name_y'], axis=1)
# 保存結(jié)果到要填入數(shù)據(jù)的Excel表格中
df_merged.to_excel('output.xlsx', index=False)
```
這個代碼將在要填入數(shù)據(jù)的Excel表格中搜索名為“John”的人,然
后將他們的數(shù)據(jù)填入“Data”列中。最后,結(jié)果將保存到要填入數(shù)
據(jù)的Excel表格中。
'''
文章來源:http://www.zghlxwxcb.cn/news/detail-523013.html
到了這里,關(guān)于Python從一個Excel表格提取數(shù)據(jù)填到另一個表格的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!