python3 操作讀寫excel並保存本地


目錄
前言
安裝模塊
例1:創建一個excel 文件,並寫入不同類的內容
例2:寫入時間
例3:創建sheet
例4 :操作單元格
例5 :操作行/列/指定區域
例6:顯示小數
例7:獲取所有的行對象
例8:獲取所有的列對象
例9:單元格類型
例10:公式
例11:合並單元格/取消合並單元格
例12:插入圖片
前言
python中操作excel的模塊有很多,比如xlrd,xlwt,openpyxl,xlutils等。前兩個是一套,一個讀一個寫。注意:xlwt模塊,只能支持到excel2003,也就是擴展名為.xls的excel;xlrd模塊可以支持讀取07版本,也就是.xlsx擴展名的excel。每個模塊都有一些優缺點,本文以openpyxl模塊為例來進行介紹。

安裝模塊
安裝openpyxl和pillow(在文件中插入圖片時使用)

py -3 -m pip install openpyxl==2.5.4(指定版本安裝)

py -3 -m pip install pillow

一、創建excel 文件,並寫入不同的內容

# -*- coding: utf-8 -*-
import locale
from openpyxl import Workbook
wb = Workbook()    #創建文件對象
 
#獲取第一個sheet
ws = wb.active     
# 將數據寫入到指定的單元格
ws['A1'] = 42      #寫入數字
ws['B1'] = "自動化"+"automation test" #寫入中文
 
ws.append([1, 2, 3])    #寫入多個單元格
 
#保存為a.xlsx
wb.save("a.xlsx")

運行結果

二、寫入時間

from openpyxl import Workbook
import datetime
import time
import locale
wb = Workbook()    #創建文件對象
ws = wb.active     #獲取第一個sheet
 
ws['A2'] = datetime.datetime.now()    #寫入一個當前時間
 
#寫入一個自定義的時間格式
locale.setlocale(locale.LC_CTYPE, 'chinese')
ws['A3'] =time.strftime("%Y年%m月%d日 %H時%M分%S秒",time.localtime())
 
# Save the file
wb.save("sample.xlsx")

運行結果

三、創建sheet

前面的例子都是操作默認創建的sheet,也可以用create_sheet()方法生成指定名稱的sheet進行操作。

from openpyxl import Workbook 
wb = Workbook()
 
ws = wb.create_sheet("kongsh") 
ws1 = wb.create_sheet("Mysheet")
 
ws1.title = "New Title"  
ws2 = wb.create_sheet("Mysheet", 0)        #設定sheet的插入位置
ws2.title = u"測試用例"
#設置sheet名的背景色
ws1.sheet_properties.tabColor = "1072BA"
 
#獲取某個sheet對象
print (wb["測試用例"])
print (wb["New Title" ])
 
#獲取所有的sheet名字
print (wb.sheetnames)
for sheet_name in wb.sheetnames:
    print (sheet_name)
    print(wb[sheet_name])
 
#遍歷獲取sheet對象,按照sheet順序獲取
for sheet in wb:
    print (sheet)
    print(sheet.title)#獲取sheet名稱
 
#復制一個sheet
wb["New Title" ]["A1"]="gloryroad"
source = wb["New Title" ]
target = wb.copy_worksheet(source)
 
target.title="New copy Title"
 
#保存文件
wb.save("a.xlsx")

運行結果

四、操作單元格

# -*- coding: utf-8 -*-
from openpyxl import Workbook
wb = Workbook()
ws1 = wb.create_sheet("Mysheet")           #創建一個sheet
ws1["A1"]=123.11
ws1["B2"]="測試用例"
#行號和列號必須從1開始,獲取指定單元格的內容
d = ws1.cell(row=1, column=1, value=10)
#指定行列坐標組成的字符串,value屬性就是單元格的值
print (ws1["A1"].value)
print (ws1["B2"].value)
print (d.value)
print (ws1.cell(row=4,column=2).value)
 
# 保存文件
wb.save("a.xlsx")

運行結果

五、操作行/列/指定區域

# -*- coding: utf-8 -*-
from openpyxl import Workbook, load_workbook
wb = Workbook()
ws1 = wb.create_sheet("Mysheet")           #創建一個sheet
 
ws1["A1"]=1
ws1["A2"]=2
ws1["A3"]=3
##ws1["A10"]=3
 
ws1["B1"]=4
ws1["B2"]=5
ws1["B3"]=6
 
ws1["C1"]=7
ws1["C2"]=8
ws1["C3"]=9
 
#操作單列
print (ws1["A"])
for cell in ws1["A"]:
    print (cell.value)
 
 
#最大有效行和列
print(ws1.max_row,ws1.max_column)
 
#最小有效行和列
print(ws1.min_row,ws1.min_column)
 
print(ws1.columns)
print(ws1.rows)
 
 
#操作單列
print (ws1["A"])
for cell in ws1["A"]:
    print (cell.value)
 
#操作多列,獲取每一個值
print (ws1["A:C"])
for column in ws1["A:C"]:
    for cell in column:
        print (cell.value)
 
#操作多行
row_range = ws1[1:3]
print(row_range)
for row in row_range:
      for cell in row:
            print(cell.value)
 
#指定一個操作的區域
print ("*"*50)
for row in ws1.iter_rows(min_row=1, min_col=1, 
max_col=3, max_row=3):
    for cell in row:
        print (cell.value)
 
#獲取所有行
print (ws1.rows)
for row in ws1.rows:
    print (row)
 
print ("*"*50)
#獲取所有列
print (ws1.columns)
for col in ws1.columns:
    print (col)
 
# 保存文件
wb.save("a.xlsx")

運行結果

六、顯示小數

# -*- coding: utf-8 -*-
 
from openpyxl import Workbook
from openpyxl import load_workbook
wb = load_workbook('a.xlsx')
wb.guess_types = True#將單元格的百分數顯示為小數
#wb.guess_types = False#將單元格的百分數顯示為百分數
ws=wb.active
ws["D1"]="12%"
print (ws["D1"].value)
 
# 保存
wb.save("a.xlsx")

運行結果

七、獲取所有的行對象

#coding=utf-8
from openpyxl import Workbook
from openpyxl import load_workbook
#加載一個已經存在的excel文件
wb = load_workbook('a.xlsx')
ws=wb.active
rows=[]
for row in ws.iter_rows():
            rows.append(row)
 
print (rows)                 #所有行
print (rows[0])              #獲取第一行
print (rows[0][0])            #獲取第一行第一列的單元格對象
print (rows[0][0].value)          #獲取第一行第一列的單元格對象的值
 
 
print (rows[len(rows)-1])             #獲取最后行
print (rows[len(rows)-1][len(rows[0])-1])       #獲取第后一行和最后一列的單元格對象
print (rows[len(rows)-1][len(rows[0])-1].value)  #獲取第后一行和最后一列的單元格對象的值

八、獲取所有的列對象

#coding=utf-8
from openpyxl import load_workbook
wb = load_workbook('sample.xlsx')
ws=wb.active
cols=[]
cols = []
for col in ws.iter_cols():
    cols.append(col)
 
print (cols)               #所有列
print (cols[0])                #獲取第一列
print (cols[0][0])              #獲取第一列的第一行的單元格對象
print (cols[0][0].value)         #獲取第一列的第一行的值
 
print ("*"*30)
print (cols[len(cols)-1])            #獲取最后一列
print (cols[len(cols)-1][len(cols[0])-1])      #獲取最后一列的最后一行的單元格對象
print (cols[len(cols)-1][len(cols[0])-1].value)    #獲取最后一列的最后一行的單元格對象的值

運行結果

九、單元格類型

# -*- coding: utf-8 -*-
from openpyxl import Workbook
from openpyxl import load_workbook
import datetime
wb = load_workbook('a.xlsx')
 
ws=wb.active
wb.guess_types = True
 
ws["A1"]=datetime.datetime(2010, 7, 21)
print (ws["A1"].number_format)
 
ws["A2"]="12%"
print (ws["A2"].number_format)
 
ws["A3"]= 1.1
print (ws["A3"].number_format)
 
ws["A4"]= "中國"
print (ws["A4"].number_format)
# 保存文件
wb.save("a.xlsx")

運行結果

說明:如果是常規,顯示general,如果是數字,顯示'0.00_ ',如果是百分數顯示0%

十、公式

from openpyxl import Workbook
from openpyxl import load_workbook
 
wb = load_workbook('a.xlsx')
 
ws1=wb.active
 
ws1["A1"]=1
ws1["A2"]=2
ws1["A3"]=3
 
ws1["A4"] = "=SUM(1, 1)"
ws1["A5"] = "=SUM(A1:A3)"
 
print (ws1["A4"].value)  #打印的是公式,不是公式計算后的值,程序無法取到計算后的值
print (ws1["A5"].value)  #打印的是公式,不是公式計算后的值,程序無法取到計算后的值
 
# 保存文件
wb.save("a.xlsx")

運行結果

十一、合並單元格/取消合並單元格

# -*- coding: utf-8 -*-
from openpyxl import Workbook
from openpyxl import load_workbook
 
 
wb = Workbook()
ws = wb.active
 
ws.merge_cells('A2:D2')
ws.unmerge_cells('A2:D2')#取消合並
 
# 或者
ws.merge_cells(start_row=2,start_column=1,end_row=2,end_column=4)
ws.unmerge_cells(start_row=2,start_column=1,end_row=2,end_column=4)#取消合並
 
 
#保存文件
wb.save("a.xlsx")

十二、插入圖片

# -*- coding: utf-8 -*-
from openpyxl import load_workbook
from openpyxl.drawing.image import Image
 
wb = load_workbook('a.xlsx')
ws1=wb.active
img = Image(r'F:\important icon_xx.png')
ws1.add_image(img, 'A1')
 
# 保存文件
wb.save("a.xlsx")

運行結果

十三、python簡單操作讀excel

以如下excel文件為例進行操作
文件名為demo,有兩個sheet,名為工作表1和工作表2
工作表1中有如下數據

簡單使用

# coding=utf-8

import xlrd

# 打開文件
data = xlrd.open_workbook('file/demo.xlsx')

# 查看工作表
data.sheet_names()
print("sheets:" + str(data.sheet_names()))

# 通過文件名獲得工作表,獲取工作表1
table = data.sheet_by_name('工作表1')

# 打印data.sheet_names()可發現,返回的值為一個列表,通過對列表索引操作獲得工作表1
# table = data.sheet_by_index(0)

# 獲取行數和列數
# 行數:table.nrows
# 列數:table.ncols
print("總行數:" + str(table.nrows))
print("總列數:" + str(table.ncols))

# 獲取整行的值 和整列的值,返回的結果為數組
# 整行值:table.row_values(start,end)
# 整列值:table.col_values(start,end)
# 參數 start 為從第幾個開始打印,
# end為打印到那個位置結束,默認為none
print("整行值:" + str(table.row_values(0)))
print("整列值:" + str(table.col_values(1)))

# 獲取某個單元格的值,例如獲取B3單元格值
cel_B3 = table.cell(3,2).value
print("第三行第二列的值:" + cel_B3)

獲得所有的數據

# coding=utf-8

import xlrd

def read_xlrd(excelFile):
    data = xlrd.open_workbook(excelFile)
    table = data.sheet_by_index(0)

    for rowNum in range(table.nrows):
        rowVale = table.row_values(rowNum)
        for colNum in range(table.ncols):
            if rowNum > 0 and colNum == 0:
                print(int(rowVale[0]))
            else:
                print(rowVale[colNum])
        print("---------------")

    # if判斷是將 id 進行格式化
    # print("未格式化Id的數據:")
    # print(table.cell(1, 0))
    # 結果:number:1001.0


if __name__ == '__main__':
    excelFile = 'file/demo.xlsx'
    read_xlrd(excelFile=excelFile)

運行結果:

python修改數據

如果在項目中使用則可將內容方法稍為做修改,獲得所有的數據后,將每一行數據作為數組進行返回  

# coding=utf-8

import xlrd

def read_xlrd(excelFile):
    data = xlrd.open_workbook(excelFile)
    table = data.sheet_by_index(0)
    dataFile = []

    for rowNum in range(table.nrows):
        # if 去掉表頭
        if rowNum > 0:
            dataFile.append(table.row_values(rowNum))

    return dataFile


if __name__ == '__main__':
    excelFile = 'file/demo.xlsx'
    print(read_xlrd(excelFile=excelFile))

運行結果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM