Python使用openpyxl讀寫excel文件


Python使用openpyxl讀寫excel文件

這是一個第三方庫,可以處理xlsx格式的Excel文件。pip install openpyxl安裝。如果使用Aanconda,應該自帶了。

讀取Excel文件

需要導入相關函數。

  1. from openpyxl import load_workbook
  2. # 默認可讀寫,若有需要可以指定write_only和read_only為True
  3. wb = load_workbook('mainbuilding33.xlsx')

默認打開的文件為可讀寫,若有需要可以指定參數read_onlyTrue

獲取工作表--Sheet

  1. # 獲得所有sheet的名稱
  2. print(wb.get_sheet_names())
  3. # 根據sheet名字獲得sheet
  4. a_sheet = wb.get_sheet_by_name('Sheet1')
  5. # 獲得sheet名
  6. print(a_sheet.title)
  7. # 獲得當前正在顯示的sheet, 也可以用wb.get_active_sheet()
  8. sheet = wb.active

獲取單元格

  1. # 獲取某個單元格的值,觀察excel發現也是先字母再數字的順序,即先列再行
  2. b4 = sheet['B4']
  3. # 分別返回
  4. print(f'({b4.column}, {b4.row}) is {b4.value}') # 返回的數字就是int型
  5. # 除了用下標的方式獲得,還可以用cell函數, 換成數字,這個表示B4
  6. b4_too = sheet.cell(row=4, column=2)
  7. print(b4_too.value)

b4.column返回Bb4.row返回4, value則是那個單元格的值。另外cell還有一個屬性coordinate, 像b4這個單元格返回的是坐標B4

獲得最大行和最大列

  1. # 獲得最大列和最大行
  2. print(sheet.max_row)
  3. print(sheet.max_column)

獲取行和列

  • sheet.rows為生成器, 里面是每一行的數據,每一行又由一個tuple包裹。
  • sheet.columns類似,不過里面是每個tuple是每一列的單元格。
  1. # 因為按行,所以返回A1, B1, C1這樣的順序
  2. for row in sheet.rows:
  3. for cell in row:
  4. print(cell.value)
  5. # A1, A2, A3這樣的順序
  6. for column in sheet.columns:
  7. for cell in column:
  8. print(cell.value)

上面的代碼就可以獲得所有單元格的數據。如果要獲得某行的數據呢?給其一個索引就行了,因為sheet.rows是生成器類型,不能使用索引,轉換成list之后再使用索引,list(sheet.rows)[2]這樣就獲取到第三行的tuple對象。

  1. for cell in list(sheet.rows)[2]:
  2. print(cell.value)

如何獲得任意區間的單元格?

可以使用range函數,下面的寫法,獲得了以A1為左上角,B3為右下角矩形區域的所有單元格。注意range從1開始的,因為在openpyxl中為了和Excel中的表達方式一致,並不和編程語言的習慣以0表示第一個值。

  1. for i in range(1, 4):
  2. for j in range(1, 3):
  3. print(sheet.cell(row=i, column=j))
  4. # out
  5. <Cell mainbuilding33.A1>
  6. <Cell mainbuilding33.B1>
  7. <Cell mainbuilding33.A2>
  8. <Cell mainbuilding33.B2>
  9. <Cell mainbuilding33.A3>
  10. <Cell mainbuilding33.B3>

還可以像使用切片那樣使用。sheet['A1':'B3']返回一個tuple,該元組內部還是元組,由每行的單元格構成一個元組。

  1. for row_cell in sheet['A1':'B3']:
  2. for cell in row_cell:
  3. print(cell)
  4. for cell in sheet['A1':'B3']:
  5. print(cell)
  6. # out
  7. (<Cell mainbuilding33.A1>, <Cell mainbuilding33.B1>)
  8. (<Cell mainbuilding33.A2>, <Cell mainbuilding33.B2>)
  9. (<Cell mainbuilding33.A3>, <Cell mainbuilding33.B3>)

根據字母獲得列號,根據列號返回字母

需要導入, 這兩個函數存在於openpyxl.utils

  1. from openpyxl.utils import get_column_letter, column_index_from_string
  2. # 根據列的數字返回字母
  3. print(get_column_letter(2)) # B
  4. # 根據字母返回列的數字
  5. print(column_index_from_string('D')) # 4

將數據寫入Excel

工作表相關

需要導入WorkBook

  1. from openpyxl import Workbook
  2. wb = Workbook()

這樣就新建了一個新的工作表(只是還沒被保存)。

若要指定只寫模式,可以指定參數write_only=True。一般默認的可寫可讀模式就可以了。

  1. print(wb.get_sheet_names()) # 提供一個默認名叫Sheet的表,office2016下新建提供默認Sheet1
  2. # 直接賦值就可以改工作表的名稱
  3. sheet.title = 'Sheet1'
  4. # 新建一個工作表,可以指定索引,適當安排其在工作簿中的位置
  5. wb.create_sheet('Data', index=1) # 被安排到第二個工作表,index=0就是第一個位置
  6. # 刪除某個工作表
  7. wb.remove(sheet)
  8. del wb[sheet]

寫入單元格

還可以使用公式哦

  1. # 直接給單元格賦值就行
  2. sheet['A1'] = 'good'
  3. # B9處寫入平均值
  4. sheet['B9'] = '=AVERAGE(B2:B8)'

但是如果是讀取的時候需要加上data_only=True這樣讀到B9返回的就是數字,如果不加這個參數,返回的將是公式本身'=AVERAGE(B2:B8)'

append函數

可以一次添加多行數據,從第一行空白行開始(下面都是空白行)寫入。

  1. # 添加一行
  2. row = [1 ,2, 3, 4, 5]
  3. sheet.append(row)
  4. # 添加多行
  5. rows = [
  6. ['Number', 'data1', 'data2'],
  7. [2, 40, 30],
  8. [3, 40, 25],
  9. [4, 50, 30],
  10. [5, 30, 10],
  11. [6, 25, 5],
  12. [7, 50, 10],
  13. ]

由於append函數只能按行寫入。如果我們想按列寫入呢。append能實現需求么?如果把上面的列表嵌套看作矩陣。只要將矩陣轉置就可以了。使用zip()函數可以實現,不過內部的列表變成了元組就是了。都是可迭代對象,不影響。

  1. list(zip(*rows))
  2. # out
  3. [('Number', 2, 3, 4, 5, 6, 7),
  4. ('data1', 40, 40, 50, 30, 25, 50),
  5. ('data2', 30, 25, 30, 10, 5, 10)]

解釋下上面的list(zip(*rows))首先*rows將列表打散,相當於填入了若干個參數,zip從某個列表中提取第1個值組合成一個tuple,再從每個列表中提取第2個值組合成一個tuple,一直到最短列表的最后一個值提取完畢后結束,更長列表的之后的值被舍棄,換句話,最后的元組個數是由原來每個參數(可迭代對象)的最短長度決定的。比如現在隨便刪掉一個值,最短列表長度為2,data2那一列(豎着看)的值全部被舍棄。

  1. rows = [
  2. ['Number', 'data1', 'data2'],
  3. [2, 40],
  4. [3, 40, 25],
  5. [4, 50, 30],
  6. [5, 30, 10],
  7. [6, 25, 5],
  8. [7, 50, 10],
  9. ]
  10. # out
  11. [('Number', 2, 3, 4, 5, 6, 7), ('data1', 40, 40, 50, 30, 25, 50)]

最后zip返回的是zip對象,看不到數據的。使用list轉換下就好了。使用zip可以方便實現將數據按列寫入。

保存文件

所有的操作結束后,一定記得保存文件。指定路徑和文件名,后綴名為xlsx

  1. wb.save(r'D:\example.xlsx')

設置單元格風格--Style

先導入需要的類from openpyxl.styles import Font, colors, Alignment

分別可指定字體相關,顏色,和對齊方式。

字體

  1. bold_itatic_24_font = Font(name='等線', size=24, italic=True, color=colors.RED, bold=True)
  2. sheet['A1'].font = bold_itatic_24_font

上面的代碼指定了等線24號加粗斜體,字體顏色紅色。直接使用cell的font屬性,將Font對象賦值給它。

對齊方式

也是直接使用cell的屬性aligment,這里指定垂直居中和水平居中。除了center,還可以使用right、left等等參數。

  1. # 設置B1中的數據垂直居中和水平居中
  2. sheet['B1'].alignment = Alignment(horizontal='center', vertical='center')

設置行高和列寬

有時候數據太長顯示不完,就需要拉長拉高單元格。

  1. # 第2行行高
  2. sheet.row_dimensions[2].height = 40
  3. # C列列寬
  4. sheet.column_dimensions['C'].width = 30

合並和拆分單元格

所謂合並單元格,即以合並區域的左上角的那個單元格為基准,覆蓋其他單元格使之稱為一個大的單元格。

相反,拆分單元格后將這個大單元格的值返回到原來的左上角位置。

  1. # 合並單元格, 往左上角寫入數據即可
  2. sheet.merge_cells('B1:G1') # 合並一行中的幾個單元格
  3. sheet.merge_cells('A1:C3') # 合並一個矩形區域中的單元格

合並后只可以往左上角寫入數據,也就是區間中:左邊的坐標。

如果這些要合並的單元格都有數據,只會保留左上角的數據,其他則丟棄。換句話說若合並前不是在左上角寫入數據,合並后單元格中不會有數據。

以下是拆分單元格的代碼。拆分后,值回到A1位置。

  1. sheet.unmerge_cells('A1:C3')

這里就拿常用的說,具體的去看openpyxl文檔

 

閱讀原文

 

python xlrd,xlwt 讀寫excel文件

python 讀excel文件,需要xlrd庫。下載地址:https://pypi.python.org/pypi/xlrd

python 寫excel文件,需要xlwt庫。下載地址:https://pypi.python.org/pypi/xlwt/1.1.2

下載后修改擴展名為rar, 解壓后安裝:

安裝成功后就可以引用了。如下代碼:

# -*- coding: utf-8 -*-
import os
import xlrd
import xlwt
import datetime

##################讀excel文件##############################

#打開Excel文件,參數:excelFile:Excel文件路徑
def open_Excel(excelFile):
  excelFile = unicode(excelFile, "utf8")
  if os.path.isfile(excelFile):
    try:
      data = xlrd.open_workbook(excelFile)
      return data
    except Exception,e:
      print str(e)

'''往EXCEl單元格寫內容,每次寫一行sheet:頁簽名稱;row:行內容列表;rowIndex:行索引;
isBold:true:粗字段,false:普通字體'''
def WriteSheetRow(sheet,rowValueList,rowIndex,isBold):
  i = 0
  style = xlwt.easyxf('font: bold 1') #粗字體

  #style = xlwt.easyxf('font: bold 1, color red;') #紅色字體
  for svalue in rowValueList:
    strValue = unicode(str(svalue),'utf-8')
    if isBold:
      sheet.write(rowIndex,i,strValue,style)
    else:
      sheet.write(rowIndex,i,strValue)
    i = i + 1

#根據索引獲取Excel表格中的數據 參數:excelFile:Excel文件路徑 ,by_index:表的索引
def open_Excel_ByIndex(excelFile,sheetIndex):
  data = open_Excel(excelFile)
  table = data.sheets()[sheetIndex]
  nrows = table.nrows #行數
  ncols = table.ncols #列數
  cursor = getSqlCursor()
  for i in xrange(0,nrows):
    headCols = table.row_values(i) #某一行數據 
    for a in headCols:
      print a

#測試
open_Excel_ByIndex("D:\\test.xlsx",0)

#根據名稱獲取Excel表格中的數據 參數:excelFile:Excel文件路徑 
#sheetName:Sheet1名稱 
def open_Excel_BySheetName(excelFile,sheetName):
  sheetName = unicode(sheetName, "utf8")
  data = open_Excel(excelFile)
  table = data.sheet_by_name(sheetName)
  nrows = table.nrows #行數
  ncols = table.ncols #列數
  cursor = getSqlCursor()
  for i in xrange(0,nrows):
    headCols = table.row_values(i) #某一行數據 
    for a in headCols:
      print a
#測試
open_Excel_BySheetName("D:\\test.xlsx",'sheet1')

##################寫excel文件##############################
'''寫excel文件''' 
def save_Excel(strFile):
  excelFile = unicode(strFile, "utf8")
  wbk = xlwt.Workbook()
  sheet = wbk.add_sheet('sheet1')
  headList = ['標題1','標題2','標題3','標題4']
  rowIndex = 0
  WriteSheetRow(sheet,headList,rowIndex,,True)
  for i in xrange(1,11):
    rowIndex = rowIndex + 1
    valueList = []
    for j in xrange(1,5):
      valueList.append(j*i)
    WriteSheetRow(sheet,valueList,rowIndex,False)
  wbk.save(excelFile)

#測試
save_Excel("D:\\test.xlsx")

結果如下:

##################單元格常用設置##############################

1、設置超鏈接

  #設置超鏈接
  

  font = xlwt.Font() # Create Font
  font.colour_index = 4 # 藍色字體
  font.underline=True
  style = xlwt.XFStyle()
  style.font = font
  sheet.write(rowIndex,4,xlwt.Formula('HYPERLINK("https://www.baidu.com";"baidu")'),style)

2、設置單元格背景色

  #設置單元格背景色 
  pattern = xlwt.Pattern()
  pattern.pattern = xlwt.Pattern.SOLID_PATTERN
  pattern.pattern_fore_colour = 5 #黃色
  style = xlwt.XFStyle()
  style.pattern = pattern
  sheet.write(5, 5, 'Cell Contents', style)
  ''' 顏色值
  0 = Black, 1 = White, 2 = Red, 3 = Green, 4 = Blue, 
  5 = Yellow, 6 = Magenta, 7 = Cyan, 16 = Maroon, 
  17 = Dark Green, 18 = Dark Blue, 19 = Dark Yellow ,
  20 = Dark Magenta, 21 = Teal,
  22 = Light Gray, 23 = Dark Gray 
  '''

3、設置粗字體

  style = xlwt.easyxf('font: bold 1')

  sheet.write(5, 5, 'Cell Contents', style)

4、設置字體顏色

  style = xlwt.easyxf('font: bold 0, color red;')#紅色字體

  sheet.write(5, 5, 'Cell Contents', style)

5、設置列寬帶

  sheet.col(1).width = 3333 # 3333 = 1" (one inch)

6、設置日期格式

  style = xlwt.XFStyle()
  style.num_format_str = 'YYYY/MM/DD h:mm:ss' 
  sheet.write(5, 5, datetime.datetime.now(), style)

  

  #Other options: D-MMM-YY, D-MMM, MMM-YY, h:mm, h:mm:ss, h:mm, h:mm:ss,
  # M/D/YY h:mm, mm:ss, [h]:mm:ss, mm:ss.0

7、合並行和列

  sheet.write_merge(0, 0, 0, 3, 'First Merge')

  sheet.write_merge(2, 4, 0, 3, 'Second Merge')

  

8、給單元格增加邊框 

  borders = xlwt.Borders() # Create Borders
  borders.left = xlwt.Borders.DASHED

  # May be: NO_LINE, THIN, MEDIUM, DASHED, DOTTED, THICK, DOUBLE, HAIR, MEDIUM_DASHED,   THIN_DASH_DOTTED,              #MEDIUM_DASH_DOTTED, THIN_DASH_DOT_DOTTED, MEDIUM_DASH_DOT_DOTTED,

  #SLANTED_MEDIUM_DASH_DOTTED, or 0x00 through 0x0D.
  borders.right = xlwt.Borders.DASHED
  borders.top = xlwt.Borders.DASHED
  borders.bottom = xlwt.Borders.DASHED
  borders.left_colour = 0x40
  borders.right_colour = 0x40
  borders.top_colour = 0x40
  borders.bottom_colour = 0x40
  style = xlwt.XFStyle() # Create Style
  style.borders = borders # Add Borders to Style

  

9、設置單元格中內容中位置,居中,局左右等

  alignment = xlwt.Alignment() # Create Alignment
  # May be: HORZ_GENERAL, HORZ_LEFT, HORZ_CENTER, HORZ_RIGHT, 
  #HORZ_FILLED, HORZ_JUSTIFIED, HORZ_CENTER_ACROSS_SEL, HORZ_DISTRIBUTED
  alignment.horz = xlwt.Alignment.HORZ_CENTER   #水平居中
  # May be: VERT_TOP, VERT_CENTER, VERT_BOTTOM, VERT_JUSTIFIED, VERT_DISTRIBUTED
  alignment.vert = xlwt.Alignment.VERT_CENTER    #垂直居中
  style = xlwt.XFStyle() # Create Style
  style.alignment = alignment # Add Alignment to Style
  sheet.write(5, 5, 'Cell Contents', style)


免責聲明!

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



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