使用 Python 合併多個格式一致的 Excel 文件

一 問題描述


 

最近朋友在工做中遇到這樣一個問題,她天天都要處理以下一批 Excel 表格:每一個表格的都只有一個 sheet,表格的前兩行爲表格標題及表頭,表格的最後一行是相關人員簽字。最終目標是將每一個表格的內容合併到一個 Excel 表格中,使之成爲一張表格。在她未諮詢我以前,天天覆制粘貼這一類操做佔用了她絕大部分時間。表格樣式以下:python

 

 

 

二 需求分析


 

根據她的描述,最終需求應該是這樣的:在這一批表格中選取任意一個表格的前兩行做爲新表格的標題與表頭,將這兩行內容以嵌套列表的形式插入一個名爲 data 空列表中。取每張表格的第3至倒數第二行,剔除空白行的內容。並將全部表格的內容以子列表的方式依次插入 data 列表中。任取一表格的最後一行以子列表的方式插入 data 列表中。最後將 data 列表的內容寫入一個新的 Excel 表格中。app

三 查閱資料

經過幾分鐘的上網查詢,得出如下結論:優化

  • 3.1 經過 xlrd 和 xlsxwriter 模塊便可解決次需求;
  • 3.2 之因此使用 xlrd 和 xlsxwriter 是由於: xlrd擅長讀取 Excel 文件,不適合寫入,用 xlsxwriter 來進行大規模寫入 Excel 表格不會出現報錯。

四 編碼

一切以解決當前問題爲嚮導,說幹就幹。 coding ... ...編碼

# -*- coding:utf-8 -*-
import os, xlrd, xlsxwriter

source_dir = r'input'
new_execl = "All in one.xlsx"
raw_excels = os.listdir(source_dir)
keyword = "油站經理" # 除包括此關鍵字的行均插入
data = []

filename = os.path.join(source_dir, raw_excels[0])
wb = xlrd.open_workbook(filename)
sheet = wb.sheets()[0]
data.append(sheet.row_values(0))
data.append(sheet.row_values(1))

for excel in raw_excels:
    filename = os.path.join(source_dir, excel)
    wb = xlrd.open_workbook(filename)
    sheet = wb.sheets()[0]
    for row_num in range(2, sheet.nrows):
        row_values = [str(i) for i in sheet.row_values(row_num)]
        if len(''.join(row_values)) and (keyword not in ''.join(row_values)):
            data.append(sheet.row_values(row_num))
data.append(sheet.row_values(sheet.nrows-1))

new_wb = xlsxwriter.Workbook(new_execl)
worksheet = new_wb.add_worksheet()
font = new_wb.add_format({"font_size":11})
for i in range(len(data)):
    for j in range(len(data[i])):
        worksheet.write(i, j, data[i][j], font)
new_wb.close()

半小時後,大功告成!spa

五 使用說明

  • 5.1 下載安裝 Python3.X(具體安裝步驟本身查一下);
  • 5.2 安裝 xlrd 和 xlsxwriter 模塊,參考命令: pip install xlrd xlsxwriter。開始此步驟以前可能須要先升級pip,具體升級命令系統會提示,複製粘貼便可;
  • 5.3 新建一個名爲 input 的文件夾,將須要合併的文件複製到這個文件夾下;
  • 5.4 把以上代碼複製以 excels_merge.py 的文件名保存在與 input 文件夾同級別的文件夾中,雙擊鼠標稍後便可。若是沒有關聯打開方式,那麼就在資源管理器的地址欄輸入「cmd」,在打開的命令窗口輸入:python excels_merge.py。生成的 All in one.xlsx 即爲合併後的新 Excel 文件。

六 總結

  • 6.1 [str(i) for i in sheet.row_values(row_num)]這一部分代碼實現了將列表內的元素統一轉化爲字符串,主要是爲了下一行代碼實現將列表轉換爲字符串;
  • 6.3 此的腳本不對源 Excel 文件進行任何操做,但是放心使用;
  • 6.4 以上腳本就是隨手一寫,都沒有優化,之後若是數據量太大估計會考慮優化,但願你們多提意見或建議;
  • 6.5 源代碼能夠訪問個人同名 CSDN 博客及 GitHub 獲取。

 

  • 更多請關注請繼續關注公衆號python社區營其它相關文章!
相關文章
相關標籤/搜索