import xlwings as xw #導入xlwings模塊
file_path = 'e:/table/text.xlsx' #給出來源工作簿的文件路徑
sheet_name = 'sheetOne' #給出要拆分的工作表的名稱
app = xw.App(visible=False,add_book=False)
workbook = app.books.open(file_path) #打開來源工作簿
worksheet = workbook.sheets[sheet_name] #選中要拆分的工作表
value = worksheet.range('A2').expand('table').value #讀取要拆分的工作表中的所有數據
data = dict() #創建一個空字典用於按產品名稱分類存放數據
for i in range(len(value)): #按行遍歷工作表數據
product_name = value[i][1] #獲取當前行的產品名稱,作為數據的分類依據
if product_name not in data: #判斷字典中是否不存在當前行的產品名稱
data[product_name] = [] #如果不存在,則創建一個與當前行的產品名稱對應的空列表,用於存放當前行的數據
data[product_name].append(value[i]) #將當前行的數據追加到當前行的產品名稱對應的列表中
for key,value in data.items(): #按產品名稱遍歷分類後的數據
new_workbook = xw.books.add() #新建目標工作簿
new_worksheet = new_workbook.sheets.add(key) #在目標工作薄中新增工作表並命名為當前的產品名稱
new_worksheet['A1'].value = worksheet['A1:H1'].value #將要拆分的工作表的列標題復制到新建的工作表中
new_worksheet['A2'].value = value #將當前產品名稱下的數據復制到新建的工作表中
new_workbook.save('{}.xlsx'.format(key)) #以當前產品名稱作為文件名保存目標工作簿
app.quit()
代碼解析:
第2~7行代碼用於指定要拆分哪個工作簿中的哪個工作表,並讀取這個工作表中的所有數據。第7行代碼中的“A2”是指讀取數據的起始單元格,可根據實際需求更改。
第9~13行代碼中的for語句利用第8行代碼中創建的空字典來按照產 品名稱分類整理前面讀取的數據。第10行代碼中的value[i][1]用於按數 據區域的行和列確定分類依據,兩個中括號中的值分別用於指定行序號 和列序號(均從0開始),例如,[0][0]代表第1行第1列,[0][1]代表第1 行第2列,[1][1]代表第2行第2列,依此類推。本案例的分類依據是“產 品名稱”,該列位於整個數據區域的B列,也就是第2列,所以value後為 [i][1]。可根據實際需求設置分類依據
第14~19行代碼中的for語句用於新建工作簿,並將前面分類整理好 的數據分別復制到這些新建工作簿的工作表中。第17行代碼中,A1:H1 代表要拆分的工作表“統計表”的列標題單元格區域,A1則表示從新建工 作簿中工作表的單元格A1開始粘貼列標題單元格區域。第18行代碼中 的A2是指從新建工作簿中工作表的單元格A2開始粘貼分類後的產品數 據。這3個參數可以根據實際需求更改
擴展(format()函數):
s1 = '{}今年{}歲。'.format('小明', 7) #不設置拼接位置,按默認順序拼接
s2 = '{1}今年{0}歲。'.format(7, '小明') #用數字序號指定拼接位置
s3 = '{name}今年{age}歲。'.format(name='小明', age=7) #用變量名指定拼接位
print(s1)
print(s2)
print(s3)
import xlwings as xw #導入xlwings模塊
import pandas as pd
app = xw.App(visible=False,add_book=False)
workbook = app.books.open('e:\\table\\text.xlsx') #打開工作簿
worksheet = workbook.sheets[sheet_name] #選中要拆分的工作表
value = worksheet.range('A1').options(pd.DataFrame,header = 1,index = False,expand = 'table').value #讀取要拆分的工作表數據
data = value.groupby('product_name') #將數據按照'product_name'分組
for idx,group in data:
new_worksheet = workbook.sheets.add(idx) #在工作簿中新增工作表並命名為當前的產品名稱
workbook.save()
workbook.close()
app.quit()