python操作excel xlwt (轉)


Python中xlrd和xlwt模塊使用方法

 

 


xlrd模塊實現對excel文件內容讀取,xlwt模塊實現對excel文件的寫入。

安裝

?
1
2
pip install xlrd
pip install xlwt

 

xlrd模塊使用

excel文檔名稱為聯系人.xls,內容如下:

 

 

(1) 打開excel文件並獲取所有sheet

?
1
2
3
4
5
6
7
import xlrd
 
# 打開Excel文件讀取數據
data = xlrd.open_workbook( '聯系人.xls' )
 
sheet_name = data.sheet_names()  # 獲取所有sheet名稱
print (sheet_name) # ['銀行2', '銀行3']

(2) 根據下標獲取sheet名稱

?
1
2
3
# 根據下標獲取sheet名稱
sheet2_name = data.sheet_names()[ 1 ]
print (sheet2_name)  # '銀行3'

(3) 根據sheet索引或者名稱獲取sheet內容,同時獲取sheet名稱、行數、列數

?
1
2
3
4
5
6
7
8
9
10
11
12
13
# 根據sheet索引或者名稱獲取sheet內容,同時獲取sheet名稱、列數、行數
sheet2 = data.sheet_by_index( 1 )
print ( 'sheet2名稱:{}\nsheet2列數: {}\nsheet2行數: {}' . format (sheet2.name, sheet2.ncols, sheet2.nrows))
# sheet2名稱:銀行3
# sheet2列數: 7
# sheet2行數: 5
 
sheet1 = data.sheet_by_name( '銀行2' )
print ( 'sheet1名稱:{}\nsheet1列數: {}\nsheet1行數: {}' . format (sheet1.name, sheet1.ncols, sheet1.nrows))
 
# sheet1名稱:銀行2
# sheet1列數: 8
# sheet1行數: 6

 (4) 根據sheet名稱獲取整行和整列的值

?
1
2
3
4
5
6
#  根據sheet名稱獲取整行和整列的值
sheet1 = data.sheet_by_name( '銀行2' )
print (sheet1.row_values( 3 ))  
# ['', '張2', '開發', 'IT編碼', 999.0, 133111.0, 41463.0, 'zhang2@164.com'] 日期2013/7/7,實際卻顯示為浮點數41463.0
print (sheet1.col_values( 3 )) 
# ['', '工作職責', '', 'IT編碼', '網絡維修', '']

 (5)獲取指定單元格的內容

?
1
2
3
4
# 獲取指定單元格的內容
print (sheet1.cell( 1 , 0 ).value)  # 第2 行1列內容:機構名稱
print (sheet1.cell_value( 1 , 0 ))  # 第2 行1列內容:機構名稱
print (sheet1.row( 1 )[ 0 ].value)  # 第2 行1列內容:機構名稱

(6)獲取單元格內容的數據類型

?
1
2
3
4
5
# 獲取單元格內容的數據類型
print (sheet1.cell( 1 , 0 ).ctype)  # 第2 行1列內容 :機構名稱為string類型
print (sheet1.cell( 3 , 4 ).ctype)  # 第4行5列內容:999 為number類型
print (sheet1.cell( 3 , 6 ).ctype)  # 第4 行7列內容:2013/7/8 為date類型
# 說明:ctype : 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error

(7)獲取單元內容為日期類型的方式

   使用xlrd的xldate_as_tuple處理為date格式

?
1
2
3
4
5
6
7
8
from datetime import datetime,date
 
if sheet1.cell( 3 , 6 ).ctype = = 3 :
     print (sheet1.cell( 3 , 6 ).value)  # 41463.0
     date_value = xlrd.xldate_as_tuple(sheet1.cell( 3 , 6 ).value, data.datemode)
     print (date_value)  # (2013, 7, 8, 0, 0, 0)
     print (date( * date_value[: 3 ])) # 2013-07-08
     print (date( * date_value[: 3 ]).strftime( '%Y/%m/%d' ))  # 2013/07/08

(8)獲取單元內容為number的方式(轉為整型)

?
1
2
3
4
if sheet1.cell( 3 , 5 ).ctype = = 2 :
     print (sheet1.cell( 3 , 5 ).value)  # 133111.0
     num_value = int (sheet1.cell( 3 , 5 ).value)
     print (num_value)  # 133111

(9) 獲取合並單元格的內容 

需要merged_cells屬性
?
1
2
3
4
5
6
7
8
9
10
11
# 這里,需要在讀取文件的時候添加個參數,將formatting_info參數設置為True,默認是False,否
# 則可能調用merged_cells屬性獲取到的是空值。<br>
data = xlrd.open_workbook( '聯系人.xls' ,formatting_info = True )
sheet1 = data.sheet_by_name( '銀行2' )
print (sheet1.merged_cells)  # [(0, 1, 0, 8), (2, 6, 0, 1)]<br>
# merged_cells返回的這四個參數的含義是:(row,row_range,col,col_range),其中[row,row_range)包括row,
# 不包括row_range,col也是一樣,下標從0開始。
#(0, 1, 0, 8) 表示1列-8列合並 (2, 6, 0, 1)表示3行-6行合並<br>
# 分別獲取合並2個單元格的內容:
print (sheet1.cell( 0 , 0 ).value)  # 銀行2
print (sheet1.cell_value( 2 , 0 ))  # 銀行2
規律 : 獲取merge_cells返回的row和col低位的索引即可!

 使用以下方法更加方便

?
1
2
3
4
5
6
7
8
9
merge_value = []
for (row,row_range,col,col_range) in sheet1.merged_cells:
     merge_value.append((row,col))
 
print (merge_value)  # [(0, 0), (2, 0)]
for v in merge_value:
     print (sheet1.cell(v[ 0 ], v[ 1 ]).value)
# 銀行2
# 銀行2

  

xlwt模塊

 

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import xlwt
from datetime import datetime,date
 
def set_style(name, height, bold = False , format_str = ''):
     style = xlwt.XFStyle()  # 初始化樣式
 
     font = xlwt.Font()  # 為樣式創建字體
     font.name = name  # 'Times New Roman'
     font.bold = bold
     font.height = height
 
     borders = xlwt.Borders() # 為樣式創建邊框
     borders.left = 6
     borders.right = 6
     borders.top = 6
     borders.bottom = 6
 
     style.font = font
     style.borders = borders
     style.num_format_str = format_str
 
     return style
 
wb = xlwt.Workbook()
ws = wb.add_sheet( 'A Test Sheet' ) # 增加sheet
ws.col( 0 ).width = 200 * 30 # 設置第一列列寬
 
ws.write( 0 , 0 , 1234.56 ,set_style( 'Times New Roman' , 220 ,bold = True ,format_str = '#,##0.00' ))
ws.write( 1 , 0 , datetime.now(), set_style( 'Times New Roman' , 220 ,bold = False , format_str = 'DD-MM-YYYY' ))
styleOK = xlwt.easyxf( 'pattern: fore_colour light_blue;'
 
                           'font: colour green, bold True;' )
 
pattern = xlwt.Pattern() #一個實例化的樣式類
 
pattern.pattern = xlwt.Pattern.SOLID_PATTERN # 固定的樣式
 
pattern.pattern_fore_colour = xlwt.Style.colour_map[ 'red' ] #背景顏色
 
styleOK.pattern = pattern
ws.write( 2 , 0 , 1 ,style = styleOK)
ws.write( 2 , 1 , 1 )
ws.write( 2 , 2 , xlwt.Formula( "A3+B3" ))
 
wb.save( 'example.xls' )   # 保存xls

 

聯系人表

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import xlwt
from datetime import datetime, date
 
 
def set_style(name, height, bold = False , format_str = ' ',align=' center'):
     style = xlwt.XFStyle()  # 初始化樣式
 
     font = xlwt.Font()  # 為樣式創建字體
     font.name = name  # 'Times New Roman'
     font.bold = bold
     font.height = height
 
     borders = xlwt.Borders()  # 為樣式創建邊框
     borders.left = 2
     borders.right = 2
     borders.top = 0
     borders.bottom = 2
 
     alignment = xlwt.Alignment()  # 設置排列
     if align = = 'center' :
         alignment.horz = xlwt.Alignment.HORZ_CENTER
         alignment.vert = xlwt.Alignment.VERT_CENTER
     else :
         alignment.horz = xlwt.Alignment.HORZ_LEFT
         alignment.vert = xlwt.Alignment.VERT_BOTTOM
 
     style.font = font
     style.borders = borders
     style.num_format_str = format_str
     style.alignment = alignment
 
     return style
 
 
wb = xlwt.Workbook()
ws = wb.add_sheet( '聯系人' ,cell_overwrite_ok = True # 增加sheet
rows = [ '機構名稱' , '姓名' , '部門' , '電話' , '入職日期' , '手機' , '郵箱' ]
col1 = [ '王1' , '王2' , '王3' ]
col2 = [ '666' , '777' , '888' ]
col3 = [ '2014-08-09' , '2014-08-11' , '2015-08-09' ]
# 寫第一行數據
ws.write_merge(
     0 ,
     0 ,
     0 ,
     6 ,
     '聯系人表' ,
     set_style(
         'Times New Roman' ,
         320 ,
         bold = True ,
         format_str = ''))  # 合並單元格
 
styleOK = xlwt.easyxf()
 
pattern = xlwt.Pattern()  # 一個實例化的樣式類
pattern.pattern = xlwt.Pattern.SOLID_PATTERN  # 固定的樣式
pattern.pattern_fore_colour = xlwt.Style.colour_map[ 'yellow' # 背景顏色
 
borders = xlwt.Borders()  # 為樣式創建邊框
borders.left = 2
borders.right = 2
borders.top = 6
borders.bottom = 2
 
font = xlwt.Font()  # 為樣式創建字體
font.name = 'Times New Roman'
font.bold = True
font.height = 220
 
styleOK.pattern = pattern
styleOK.borders = borders
styleOK.font = font
 
# 寫第二行數據
for index, val in enumerate (rows):
     ws.col(index).width = 150 * 30 # 定義列寬
     ws.write( 1 , index, val, style = styleOK)
 
# 寫第3行-6行第一列數據
ws.write_merge(
     2 ,
     2 + len (col1) - 1 ,
     0 ,
     0 ,
     'x機構' ,
     set_style(
         'Times New Roman' ,
         320 ,
         bold = True ,
         format_str = ''))  # 合並單元格
 
# 從第3行開始寫1列數據
for index, val in enumerate (col1):
     ws.col( 1 ).width = 150 * 30 # 定義列寬
     ws.write(index + 2 , 1 , val, style = set_style( 'Times New Roman' ,
         200 ,
         bold = False ,
         format_str = ' ',align=' '))
 
# 從第3行開始寫4列數據
for index, val in enumerate (col2):
     ws.col( 3 ).width = 150 * 30 # 定義列寬
     ws.write(index + 2 , 3 , val, style = set_style( 'Times New Roman' ,
         200 ,
         bold = False ,
         format_str = ' ',align=' '))
 
 
# 從第3行開始寫5列數據
for index, val in enumerate (col3):
     ws.col( 4 ).width = 150 * 30 # 定義列寬
     ws.write(index + 2 , 4 , val, style = set_style( 'Times New Roman' ,
         200 ,
         bold = False ,
         format_str = ' ',align=' '))
 
ws.write( 4 , 2 , '技術部' , style = styleOK)
ws.write( 4 , 5 , '186777233' , style = styleOK)
ws.write( 4 , 6 , 'wang@166.com' , style = styleOK)
wb.save( 'test.xls' )   # 保存xls

  

 

 

 

 


免責聲明!

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



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