主頁 > 後端開發 > python實作——處理Excel表格(超詳細)

python實作——處理Excel表格(超詳細)

2021-10-14 08:18:39 後端開發

目錄

  • xls和xlsx
  • 基本操作
    • 1:用openpyxl模塊打開Excel檔案,查看所有sheet表
    • 2.1:通過sheet名稱獲取表格
      • 2.2:獲取活動表
    • 3.1:獲取表格的尺寸
    • 4.1:獲取單元格中的資料
      • 4.2:獲取單元格的行、列、坐標
    • 5:獲取區間內的資料
      • 獲取指定區間的資料
      • 獲取指定行列的資料
      • 按行、列獲取值
      • 獲取活動表的行列數
  • 操作
    • 創建新的excel
    • 修改單元格、excel另存為
    • 添加資料
      • 插入有效資料
      • 插入空行空列
    • 洗掉行、列
    • 移動指定區間的單元格(move_range)
    • 字母列號與數字列號之間的轉換
    • 字體樣式
      • 查看字體樣式
      • 修改字體樣式
      • 設定對齊格式
      • 設定行高列寬
      • 合并、拆分單元格
  • sheet表
    • 創建新的sheet(create_sheet)
    • 修改sheet名字(title)
    • 復制sheet表(copy_worksheet)
    • 洗掉sheet表(remove)
  • 操作多個Excel表
    • 背景知識
      • numpy與pandas
      • xlsxwriter

  • 一個Excel電子表格檔案稱為一個作業簿
  • 一個作業簿保存在一個擴展名為.xlsx的檔案中
  • 一個作業簿可以包含多個表
  • 用戶當前查看的表(或關閉Excel前最后查看的表)稱為活動表
  • 在特定行和列的方格稱為單元格、格子

在這里插入圖片描述

處理Excel表格需要用到openpyxl模塊,該模塊需要手動安裝pip install openpyxl

xls和xlsx

簡單來說:
xls是excel2003及以前版本所生成的檔案格式
xlsx是excel2007及以后版本所生成的檔案格式
(excel 2007之后版本可以打開上述兩種格式,但是excel2013只能打開xls格式)
進一步的詳細解釋參見:excel后綴.xls和.xlsx有什么區別

基本操作

用到的test.xlsx表格
在這里插入圖片描述

1:用openpyxl模塊打開Excel檔案,查看所有sheet表

openpyxl.load_workbook()函式接受檔案名,回傳一個workbook資料型別的值,這個workbook物件代表這個Excel檔案,這個有點類似File物件代表一個打開的文本檔案,

import os
import openpyxl

path = r"C:\Users\asuka\Desktop"
os.chdir(path)  # 修改作業路徑

workbook = openpyxl.load_workbook('test.xlsx')	# 回傳一個workbook資料型別的值
print(workbook.sheetnames)	# 列印Excel表中的所有表


# 結果:
# ['Sheet1', 'Sheet2']

2.1:通過sheet名稱獲取表格

在第10行,使用workbook['Sheet1']獲取指定sheet表

import os
import openpyxl

path = r"C:\Users\asuka\Desktop"
os.chdir(path)  # 修改作業路徑

workbook = openpyxl.load_workbook('test.xlsx')  # 回傳一個workbook資料型別的值
print(workbook.sheetnames)  # 列印Excel表中的所有表

sheet = workbook['Sheet1']  # 獲取指定sheet表
print(sheet)

# 結果:
# ['Sheet1', 'Sheet2']
# <Worksheet "Sheet1">

2.2:獲取活動表

使用workbook.active獲取活動表

import os
import openpyxl

path = r"C:\Users\asuka\Desktop"
os.chdir(path)  # 修改作業路徑

workbook = openpyxl.load_workbook('test.xlsx')  # 回傳一個workbook資料型別的值
sheet = workbook.active     # 獲取活動表
print(sheet)

# 結果:
# <Worksheet "Sheet1">

3.1:獲取表格的尺寸

這里所說的尺寸大小,指的是excel表格中的資料有幾行幾列,針對的是不同的sheet而言
使用sheet.dimensions獲取表格的尺寸
下面列印的A1:B7是什么意思呢?
在這里插入圖片描述

import os
import openpyxl

path = r"C:\Users\asuka\Desktop"
os.chdir(path)  # 修改作業路徑

workbook = openpyxl.load_workbook('test.xlsx')  # 回傳一個workbook資料型別的值
sheet = workbook['Sheet1']  # 獲取指定sheet表
print(sheet.dimensions)     # 獲取表格的尺寸大小

# 結果:
# A1:B7

4.1:獲取單元格中的資料

方法1:指定坐標的方式
sheet[“A1”]

import os
import openpyxl

path = r"C:\Users\asuka\Desktop"
os.chdir(path)  # 修改作業路徑

workbook = openpyxl.load_workbook('test.xlsx')  # 回傳一個workbook資料型別的值
sheet = workbook.active     # 獲取活動表
# print(sheet.dimensions)     # 獲取表格的尺寸大小

cell1 = sheet['A1']         # 獲取A1單元格的資料
cell2 = sheet['B7']         # 獲取B7單元格的資料
# cell2 = sheet['B7'].value		# 另一種寫法

# 正確示范
# cell1.value獲取單元格A1中的值
# cell2.value獲取單元格B7中的值
print(cell1.value,cell2.value)  # 姓名 18

# 錯誤示范
print(cell1,cell2)  # <Cell 'Sheet1'.A1> <Cell 'Sheet1'.B7>

方法2: 指定行列的方式
sheet.cell(row=, column=)方式

import os
import openpyxl

path = r"C:\Users\asuka\Desktop"
os.chdir(path)  # 修改作業路徑

workbook = openpyxl.load_workbook('test.xlsx')  # 回傳一個workbook資料型別的值
sheet = workbook.active     # 獲取活動表
# print(sheet.dimensions)     # 獲取表格的尺寸大小

cell1 = sheet.cell(row=1,column=1)         # 獲取第1行第1列的資料
cell2 = sheet.cell(row=3,column=2)         # 獲取第3行第4的資料

# 正確示范
# cell1.value獲取單元格A1中的值
# cell2.value獲取單元格B7中的值
print(cell1.value,cell2.value)  # 姓名 41

4.2:獲取單元格的行、列、坐標

  • .row 獲取某個格子的行數;
  • .columns 獲取某個格子的列數;
  • .corordinate 獲取某個格子的坐標;
import os
import openpyxl

path = r"C:\Users\asuka\Desktop"
os.chdir(path)  # 修改作業路徑

workbook = openpyxl.load_workbook('test.xlsx')  # 回傳一個workbook資料型別的值
sheet = workbook.active  # 獲取活動表
# print(sheet.dimensions)     # 獲取表格的尺寸大小

cell = sheet.cell(row=3, column=2)  # 獲取第3行第4的資料

print(cell.value, cell.row, cell.column, cell.coordinate)

'''
結果:
41 3 2 B3
'''

5:獲取區間內的資料

獲取單行單列資料的時候,使用一層for回圈;獲取多行多列、指定區間的資料時,使用兩層for回圈

獲取指定區間的資料

  1. 使用sheet['A1:A5']拿到指定區間
  2. 使用兩個for回圈拿到資料
import os
import openpyxl

path = r"C:\Users\asuka\Desktop"
os.chdir(path)  # 修改作業路徑

workbook = openpyxl.load_workbook('test.xlsx')  # 回傳一個workbook資料型別的值
sheet = workbook.active  # 獲取活動表
print('當前活動表是:')
print(sheet)

cell = sheet['A1:A5']  # 獲取A1到A5的資料

print(cell)

# 列印A1到A5的資料
for i in cell:
    for j in i:
        print(j.value)

# 結果:
# 當前活動表是:
# <Worksheet "Sheet1">
# ((<Cell 'Sheet1'.A1>,), (<Cell 'Sheet1'.A2>,), (<Cell 'Sheet1'.A3>,), (<Cell 'Sheet1'.A4>,), (<Cell 'Sheet1'.A5>,))
# 姓名
# 張三
# 李四
# 王五
# 趙六

獲取指定行列的資料

  • sheet[“A”] — 獲取A列的資料
  • sheet[“A:C”] — 獲取A,B,C三列的資料
  • sheet[5] — 只獲取第5行的資料

下面的代碼,獲取一列資料的時候,使用一層for回圈

import os
import openpyxl

path = r"C:\Users\asuka\Desktop"
os.chdir(path)  # 修改作業路徑

workbook = openpyxl.load_workbook('test.xlsx')  # 回傳一個workbook資料型別的值
sheet = workbook.active  # 獲取活動表
print('當前活動表是:' + str(sheet))

cell = sheet['2']  # 獲取第2行的資料

# 列印A1到A5的資料
for i in cell:
    print(i.value)

# 結果:
# 當前活動表是:<Worksheet "Sheet1">
# 張三
# 74

下面代碼,獲取兩列資料的時候,使用兩層for回圈,注意到,兩列的結果列印到一起了,可讀性較差

import os
import openpyxl

path = r"C:\Users\asuka\Desktop"
os.chdir(path)  # 修改作業路徑

workbook = openpyxl.load_workbook('test.xlsx')  # 回傳一個workbook資料型別的值
sheet = workbook.active  # 獲取活動表
print('當前活動表是:' + str(sheet))

cell = sheet['A:B']  # 獲取AB列的資料

# 列印AB列資料
for i in cell:
    for j in i:
        print(j.value)

# 結果:
# 當前活動表是:<Worksheet "Sheet1">
# 姓名
# 張三
# 李四
# 王五
# 趙六
# alice
# bob
# 年齡
# 74
# 41
# 56
# 12
# 17
# 18

按行、列獲取值

iter_rows():按行讀取
iter_cols():按列讀取

import os
import openpyxl

path = r"C:\Users\asuka\Desktop"
os.chdir(path)  # 修改作業路徑

workbook = openpyxl.load_workbook('test.xlsx')  # 回傳一個workbook資料型別的值
sheet = workbook.active  # 獲取活動表
print('當前活動表是:' + str(sheet))

# 按行獲取值
print('按行獲取值')
for i in sheet.iter_rows(min_row=2, max_row=5, min_col=1, max_col=2):
    for j in i:
        print(j.value)

# 按列獲取值
print('按列獲取值')
for i in sheet.iter_cols(min_row=2, max_row=5, min_col=1, max_col=2):
    for j in i:
        print(j.value)

# 結果:
# 當前活動表是:<Worksheet "Sheet1">
# 按行獲取值
# 張三
# 74
# 李四
# 41
# 王五
# 56
# 趙六
# 12
# 按列獲取值
# 張三
# 李四
# 王五
# 趙六
# 74
# 41
# 56
# 12

在這里插入圖片描述

獲取活動表的行列數

方法1:使用
sheet.max_row 獲取行數
sheet.max_column 獲取列數

import os
import openpyxl

path = r"C:\Users\asuka\Desktop"
os.chdir(path)  # 修改作業路徑

workbook = openpyxl.load_workbook('2.xlsx')  # 回傳一個workbook資料型別的值
sheet = workbook.active  # 獲取活動表
print('當前活動表是:' + str(sheet))

rows = sheet.max_row        # 獲取行數
column = sheet.max_column   # 獲取列數

print(rows)
print(column)

'''
結果:
當前活動表是:<Worksheet "Sheet1">
381
6
'''

方法2:自己寫一個for回圈

import os
import openpyxl

path = r"C:\Users\asuka\Desktop"
os.chdir(path)  # 修改作業路徑

workbook = openpyxl.load_workbook('test.xlsx')  # 回傳一個workbook資料型別的值
sheet = workbook.active  # 獲取活動表
print('當前活動表是:' + str(sheet))

row = []
column = []
# 獲取當前活動表有多少行
for i in sheet.rows:
    row.append(list(i))         # i是元組型別,轉為串列

# 獲取當前活動表有多少列
for i in sheet.columns:
    column.append(list(i))    # i是元組型別,轉為串列

print('行數:'+str(len(row)))
print('列數:'+str(len(column)))

'''
結果:
當前活動表是:<Worksheet "1號sheet">
行數:12
列數:3
'''

操作

創建新的excel

第9行代碼用來指定創建的excel的活動表的名字:

  • 不寫第9行,默認創建sheet
  • 寫了第9行,創建指定名字的sheet表
import os
import openpyxl

path = r"C:\Users\asuka\Desktop"
os.chdir(path)  # 修改作業路徑

workbook = openpyxl.Workbook()
sheet = workbook.active
sheet.title = '1號sheet'
workbook.save('1.xlsx')

修改單元格、excel另存為

第9行代碼,通過給單元格重新賦值,來修改單元格的值
第9行代碼的另一種寫法sheet['B1'].value = 'age'
第10行代碼,保存時如果使用原來的(第7行)名字,就直接保存;如果使用了別的名字,就會另存為一個新檔案

import os
import openpyxl

path = r"C:\Users\asuka\Desktop"
os.chdir(path)  # 修改作業路徑

workbook = openpyxl.load_workbook('test.xlsx')  # 回傳一個workbook資料型別的值
sheet = workbook.active  # 獲取活動表
sheet['A1'] = 'name'
workbook.save('test.xlsx')

在這里插入圖片描述

添加資料

插入有效資料

使用append()方法,在原來資料的后面,按行插入資料

import os
import openpyxl

path = r"C:\Users\asuka\Desktop"
os.chdir(path)  # 修改作業路徑

workbook = openpyxl.load_workbook('test.xlsx')  # 回傳一個workbook資料型別的值
sheet = workbook.active  # 獲取活動表
print('當前活動表是:' + str(sheet))

data = [
    ['素子',23],
    ['巴特',24],
    ['塔奇克馬',2]
]
for row in data:
    sheet.append(row)   # 使用append插入資料
workbook.save('test.xlsx')

在這里插入圖片描述

插入空行空列

  • insert_rows(idx=數字編號, amount=要插入的行數),插入的行數是在idx行數的下方插入
  • insert_cols(idx=數字編號, amount=要插入的列數),插入的位置是在idx列數的左側插入
import os
import openpyxl

path = r"C:\Users\asuka\Desktop"
os.chdir(path)  # 修改作業路徑

workbook = openpyxl.load_workbook('test.xlsx')  # 回傳一個workbook資料型別的值
sheet = workbook.active  # 獲取活動表
print('當前活動表是:' + str(sheet))

sheet.insert_rows(idx=3, amount=2)
sheet.insert_cols(idx=2, amount=1)
workbook.save('test.xlsx')

在這里插入圖片描述

洗掉行、列

  • delete_rows(idx=數字編號, amount=要洗掉的行數)
  • delete_cols(idx=數字編號, amount=要洗掉的列數)
import os
import openpyxl

path = r"C:\Users\asuka\Desktop"
os.chdir(path)  # 修改作業路徑

workbook = openpyxl.load_workbook('test.xlsx')  # 回傳一個workbook資料型別的值
sheet = workbook.active  # 獲取活動表
print('當前活動表是:' + str(sheet))

sheet.delete_rows(idx=10)           # 洗掉第10行
sheet.delete_cols(idx=1, amount=2)  # 洗掉第1列,及往右共2列
workbook.save('test.xlsx')

在這里插入圖片描述

移動指定區間的單元格(move_range)

move_range(“資料區域”,rows=,cols=):正整數為向下或向右、負整數為向左或向上

import os
import openpyxl

path = r"C:\Users\asuka\Desktop"
os.chdir(path)  # 修改作業路徑

workbook = openpyxl.load_workbook('test.xlsx')  # 回傳一個workbook資料型別的值
sheet = workbook.active  # 獲取活動表
print('當前活動表是:' + str(sheet))

sheet.move_range('D11:F12',rows=0,cols=-3)  # 移動D11到F12構成的矩形格子
workbook.save('test.xlsx')

在這里插入圖片描述

字母列號與數字列號之間的轉換

核心代碼

from openpyxl.utils import get_column_letter, column_index_from_string

# 根據列的數字回傳字母
print(get_column_letter(2))  # B
# 根據字母回傳列的數字
print(column_index_from_string('D'))  # 4

舉個例子:

import os
import openpyxl
from openpyxl.utils import get_column_letter, column_index_from_string

path = r"C:\Users\asuka\Desktop"
os.chdir(path)  # 修改作業路徑

workbook = openpyxl.load_workbook('2.xlsx')  # 回傳一個workbook資料型別的值
sheet = workbook.active  # 獲取活動表
print('當前活動表是:' + str(sheet))

# 根據列的數字回傳字母
print(get_column_letter(2))  # B
# 根據字母回傳列的數字
print(column_index_from_string('D'))  # 4

字體樣式

查看字體樣式

import os
import openpyxl
import openpyxl.styles

path = r"C:\Users\asuka\Desktop"
os.chdir(path)  # 修改作業路徑

workbook = openpyxl.load_workbook('test.xlsx')  # 回傳一個workbook資料型別的值
sheet = workbook.active  # 獲取活動表
print('當前活動表是:'+str(sheet))

cell = sheet['A1']
font = cell.font
print('當前單元格的字體樣式是')
print(font.name, font.size, font.bold, font.italic, font.color)

'''
當前活動表是:<Worksheet "1號sheet">
當前單元格的字體樣式是
等線 11.0 False False <openpyxl.styles.colors.Color object>
Parameters:
rgb=None, indexed=None, auto=None, theme=1, tint=0.0, type='theme'
'''

修改字體樣式

openpyxl.styles.Font(name=字體名稱,size=字體大小,bold=是否加粗,italic=是否斜體,color=字體顏色)
其中,字體顏色中的color是RGB的16進制表示

import os
import openpyxl
import openpyxl.styles

path = r"C:\Users\asuka\Desktop"
os.chdir(path)  # 修改作業路徑

workbook = openpyxl.load_workbook('test.xlsx')  # 回傳一個workbook資料型別的值
sheet = workbook.active  # 獲取活動表
print(sheet)

cell = sheet['A1']
cell.font = openpyxl.styles.Font(name="微軟雅黑", size=20, bold=True, italic=True, color="FF0000")

workbook.save('test.xlsx')

在這里插入圖片描述

再者,可以使用for回圈,修改多行多列的資料,在這里介紹了獲取的方法

import os
import openpyxl
import openpyxl.styles

path = r"C:\Users\asuka\Desktop"
os.chdir(path)  # 修改作業路徑

workbook = openpyxl.load_workbook('test.xlsx')  # 回傳一個workbook資料型別的值
sheet = workbook.active  # 獲取活動表
print(sheet)

cell = sheet['A']
for i in cell:
    i.font = openpyxl.styles.Font(name="微軟雅黑", size=20, bold=True, italic=True, color="FF0000")

workbook.save('test.xlsx')

在這里插入圖片描述

設定對齊格式

Alignment(horizontal=水平對齊模式,vertical=垂直對齊模式,text_rotation=旋轉角度,wrap_text=是否自動換行)
水平對齊:‘distributed’,‘justify’,‘center’,‘left’, ‘centerContinuous’,'right,‘general’
垂直對齊:‘bottom’,‘distributed’,‘justify’,‘center’,‘top’

import os
import openpyxl.styles

path = r"C:\Users\asuka\Desktop"
os.chdir(path)  # 修改作業路徑

workbook = openpyxl.load_workbook('test.xlsx')  # 回傳一個workbook資料型別的值
sheet = workbook.active  # 獲取活動表
print('當前活動表是:' + str(sheet))

cell = sheet['A1']
alignment = openpyxl.styles.Alignment(horizontal="center", vertical="center", text_rotation=0, wrap_text=True)
cell.alignment = alignment

workbook.save('test.xlsx')

在這里插入圖片描述

當然,你仍舊可以呼叫for回圈來實作對多行多列的操作

import os
import openpyxl.styles

path = r"C:\Users\asuka\Desktop"
os.chdir(path)  # 修改作業路徑

workbook = openpyxl.load_workbook('test.xlsx')  # 回傳一個workbook資料型別的值
sheet = workbook.active  # 獲取活動表
print('當前活動表是:' + str(sheet))

cell = sheet['A']
alignment = openpyxl.styles.Alignment(horizontal="center", vertical="center", text_rotation=0, wrap_text=True)
for i in cell:
    i.alignment = alignment
    
workbook.save('test.xlsx')

在這里插入圖片描述

設定行高列寬

設定行列的寬高:

  • row_dimensions[行編號].height = 行高
  • column_dimensions[列編號].width = 列寬
import os
import openpyxl
import openpyxl.styles

path = r"C:\Users\asuka\Desktop"
os.chdir(path)  # 修改作業路徑

workbook = openpyxl.load_workbook('test.xlsx')  # 回傳一個workbook資料型別的值
sheet = workbook.active  # 獲取活動表
print('當前活動表是:' + str(sheet))

# 設定第1行的高度
sheet.row_dimensions[1].height = 50
# 設定B列的卷度
sheet.column_dimensions['B'].width = 20

workbook.save('test.xlsx')

在這里插入圖片描述

設定所有單元格
(顯示的結果是設定所有,有資料的單元格的)

from openpyxl import load_workbook
from openpyxl.utils import get_column_letter
import os

os.chdir(r'C:\Users\asuka\Desktop')

workbook = load_workbook('1.xlsx')
print(workbook.sheetnames)  # 列印所有的sheet表
ws = workbook[workbook.sheetnames[0]]  # 選中最左側的sheet表

width = 2.0  # 設定寬度
height = width * (2.2862 / 0.3612)  # 設定高度

print("row:", ws.max_row, "column:", ws.max_column)  # 列印行數,列數
for i in range(1, ws.max_row + 1):
    ws.row_dimensions[i].height = height
for i in range(1, ws.max_column + 1):
    ws.column_dimensions[get_column_letter(i)].width = width

workbook.save('test.xlsx')

在這里插入圖片描述

合并、拆分單元格

合并單元格有下面兩種方法,需要注意的是,如果要合并的格子中有資料,即便python沒有報錯,Excel打開的時候也會報錯,

  • merge_cells(待合并的格子編號)
  • merge_cells(start_row=起始行號,start_column=起始列號,end_row=結束行號,end_column=結束列號)
import os
import openpyxl
import openpyxl.styles

path = r"C:\Users\asuka\Desktop"
os.chdir(path)  # 修改作業路徑

workbook = openpyxl.load_workbook('test.xlsx')  # 回傳一個workbook資料型別的值
sheet = workbook.active  # 獲取活動表
print('當前活動表是:' + str(sheet))

# 方法1:
sheet.merge_cells('A12:B13')
# 方法2:
sheet.merge_cells(start_row=12, start_column=3, end_row=13, end_column=4)

# 加一個居中對齊
cell = sheet['A12']
alignment = openpyxl.styles.Alignment(horizontal="center", vertical="center", text_rotation=0, wrap_text=True)
cell.alignment = alignment

cell = sheet['C12']
alignment = openpyxl.styles.Alignment(horizontal="center", vertical="center", text_rotation=0, wrap_text=True)
cell.alignment = alignment

workbook.save('test.xlsx')

在這里插入圖片描述

拆分單元格的方法同上

  • unmerge_cells(待合并的格子編號)
  • unmerge_cells(start_row=起始行號,start_column=起始列號,end_row=結束行號,end_column=結束列號)

sheet表

創建新的sheet(create_sheet)

create_sheet(“新的sheet名”):創建一個新的sheet表

import os
import openpyxl

path = r"C:\Users\asuka\Desktop"
os.chdir(path)  # 修改作業路徑

workbook = openpyxl.load_workbook('test.xlsx')  # 回傳一個workbook資料型別的值
sheet = workbook.active  # 獲取活動表
print('當前活動表是:' + str(sheet))

workbook.create_sheet('3號sheet')    # 創建新的sheet表
print(workbook.sheetnames)			 # 查看所有的sheet表
workbook.save('test.xlsx')

'''
當前活動表是:<Worksheet "Sheet1">
['Sheet1', 'Sheet2', '3號sheet']
'''

在這里插入圖片描述

修改sheet名字(title)

第11行,使用title修改sheet表的名字

import os
import openpyxl

path = r"C:\Users\asuka\Desktop"
os.chdir(path)  # 修改作業路徑

workbook = openpyxl.load_workbook('test.xlsx')  # 回傳一個workbook資料型別的值
sheet = workbook.active  # 獲取活動表
print('當前活動表是:' + str(sheet))

sheet.title = '1號sheet'  # 修改sheet表
workbook.save('test.xlsx')

在這里插入圖片描述

復制sheet表(copy_worksheet)

在“操作”>“修改單元格、excel另存為”中提到了另存為,其實復制sheet表就是一個另存為的程序,你要是在12行代碼保存的時候使用第7行的檔案名,那么復制的sheet表就保存到自己身上,內容跟copy.xlsx一樣,

import os
import openpyxl

path = r"C:\Users\asuka\Desktop"
os.chdir(path)  # 修改作業路徑

workbook = openpyxl.load_workbook('test.xlsx')  # 回傳一個workbook資料型別的值
sheet = workbook.active  # 獲取活動表
print('當前活動表是:' + str(sheet))

workbook.copy_worksheet(sheet)	# 復制sheet表
workbook.save('copy.xlsx')

在這里插入圖片描述

洗掉sheet表(remove)

remove(“sheet名”):洗掉某個sheet表
要洗掉某sheet表,需要激活這個sheet表,即:將其作為活動表(關于活動表的定義請看前面文章開頭寫的有)下面8~11行代碼展示了原始活動表與手動更換活動表,第13行代碼刪掉活動表

import os
import openpyxl

path = r"C:\Users\asuka\Desktop"
os.chdir(path)  # 修改作業路徑

workbook = openpyxl.load_workbook('test.xlsx')  # 回傳一個workbook資料型別的值
sheet = workbook.active  # 獲取活動表
print('當前活動表是:' + str(sheet))
sheet = workbook['3號sheet']     # 手動切換到要洗掉的sheet表,一旦切換,這張表就是活動表
print('當前活動表是:' + str(sheet))

workbook.remove(sheet)  # 洗掉當前活動表
print(workbook.sheetnames)
workbook.save('test.xlsx')

'''
當前活動表是:<Worksheet "Sheet1">
當前活動表是:<Worksheet "3號sheet">
['Sheet1', 'Sheet2']
'''

在這里插入圖片描述

操作多個Excel表

其實想用openpyxl玩這個,但是網上用的是別的庫,就有點無語,以后熟練的話在自己寫一個函式實作吧

背景知識

numpy與pandas

NumPy是 Python 語言的一個擴展程式庫,支持大量的維度陣列與矩陣運算,此外也針對陣列運算提供大量的數學函式庫;pandas 是基于NumPy 的一種工具,該工具是為解決資料分析任務而創建的,我們需要利用Pandas進行Excel的合并

  1. 下面的代碼生成了一個5行3列的包含15個字符的嵌套串列

(注意,第4行代碼:15是等于35的,如果是15對應43,或者16對應5*3都會報錯)
(注意,第5行代碼,雖然5行3列是15個資料,但是可以指定資料從1開頭,到16結束)

import numpy as np
import pandas as pd

xx = np.arange(15).reshape(5, 3)
yy = np.arange(1, 16).reshape(5, 3)

print(xx)
print(yy)

'''
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]
 [12 13 14]]
[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]
 [13 14 15]]
'''
  1. 添加表頭

使用pandas庫的DataFrame來添加表頭,關于列印的結果,把最左側的一列去掉之后會發現結果很和諧,這是因為最左側的一列代表行號,此時xx變數的型別是<class ‘pandas.core.frame.DataFrame’>

import numpy as np
import pandas as pd

xx = np.arange(15).reshape(5, 3)
yy = np.arange(1, 16).reshape(5, 3)
xx = pd.DataFrame(xx, columns=["語文", "數學", "外語"])
yy = pd.DataFrame(yy, columns=["語文", "數學", "外語"])
print(xx)
print(yy)

'''
結果:
   語文  數學  外語
0   0   1   2
1   3   4   5
2   6   7   8
3   9  10  11
4  12  13  14
   語文  數學  外語
0   1   2   3
1   4   5   6
2   7   8   9
3  10  11  12
4  13  14  15
'''
  1. 合并兩個矩陣

pd.concat(list)括號中傳入的是一個串列;
ignore_list=True表示忽略原有索引,重新生成一組新的索引;
或者直接可以寫成z = pd.concat([xx,yy],ignore_list=True);
不知道為什么失敗,暫時擱淺

xlsxwriter

xlsxwriter模塊一般是和xlrd模塊搭配使用的,
xlsxwriter:負責寫入資料,
xlrd:負責讀取資料,

  1. 創建一個作業簿
import xlsxwriter
import os

path = r"C:\Users\asuka\Desktop"
os.chdir(path)

# 這一步相當于創建了一個新的"作業簿";
# "demo.xlsx"檔案不存在,表示新建"作業簿";
# "demo.xlsx"檔案存在,表示新建"作業簿"覆寫原有的"作業簿";
workbook = xlsxwriter.Workbook("demo.xlsx")

# close是將"作業簿"保存關閉,這一步必須有,否則創建的檔案無法顯示出來,
workbook.close()
  1. 創建sheet表
import xlsxwriter
import os

path = r"C:\Users\asuka\Desktop"
os.chdir(path)

workbook = xlsxwriter.Workbook("cc.xlsx")   # 創建一個名為cc.xlsx的檔案
worksheet = workbook.add_worksheet("2018年銷售量")  # 創建一個名為“2018年銷售量”的sheet表

workbook.close()
  1. 寫入資料
import xlsxwriter
import os

path = r"C:\Users\asuka\Desktop"
os.chdir(path)

# 創建一個名為【demo.xlsx】作業簿;
workbook = xlsxwriter.Workbook("demo.xlsx")

# 創建一個名為【2018年銷售量】作業表;
worksheet = workbook.add_worksheet("2018年銷售量")

# 使用write_row方法,為【2018年銷售量】作業表,添加一個表頭;
headings = ['產品', '銷量', "單價"]
worksheet.write_row('A1', headings)
# 使用write方法,在【2018年銷售量】作業表中插入一條資料;
# write語法格式:worksheet.write(行,列,資料)

data = ["蘋果", 500, 8.9]
for i in range(len(headings)):
    worksheet.write(1, i, data[i])

workbook.close()

在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/312133.html

標籤:python

上一篇:Python自動繪制UML圖、函式呼叫圖(Call Graph)

下一篇:碼神軍訓(四,五)——代碼跳舞軍體拳

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more