2
2
3
3
#电子表格
4
4
5
- 一提到电子表格,可能立刻想到的是excel。殊不知,电子表格,还是 “历史悠久”的呢,比word要长久多了 。根据维基百科的记载整理一个简史:
5
+ 一提到电子表格,可能立刻想到的是excel。殊不知,电子表格“历史悠久”,比Word要长久多了 。根据维基百科的记载整理一个简史:
6
6
7
7
> VisiCalc是第一个电子表格程序,用于苹果II型电脑。由丹·布李克林(Dan Bricklin)和鮑伯·法蘭克斯頓(Bob Frankston)發展而成,1979年10月跟著蘋果二號電腦推出,成為蘋果二號電腦上的「殺手應用軟體」。
8
8
20
20
21
21
> 其实,除了微软的电子表格,在Linux系统中也有很好的电子表格,google也提供了不错的在线电子表格(可惜某国内不能正常访问)。
22
22
23
- 从历史到现在,电子表格都很广泛的用途。所以,python也要操作一番电子表格,因为有的数据,或许就是存在电子表格中 。
23
+ 从历史到现在,电子表格都很广泛的用途。所以,Python也要操作一番电子表格,因为有些数据,就存在电子表格中 。
24
24
25
- ##openpyl
25
+ ##openpyxl
26
26
27
- openpyl模块是解决Microsoft Excel 2007/2010之类版本中扩展名是Excel 2010 xlsx/xlsm/xltx/xltm的文件的读写的第三方库。(差点上不来气,这句话太长了。)
27
+ openpyxl模块是解决Microsoft Excel 2007/2010之类版本中扩展名是Excel 2010 xlsx/xlsm/xltx/xltm的文件的读写的第三方库。
28
28
29
29
###安装
30
30
31
- 安装第三方库,当然用法力无边的pip install
31
+ 安装第三方库,当然用法力无边的pip install。
32
32
33
33
$ sudo pip install openpyxl
34
34
@@ -39,15 +39,15 @@ openpyl模块是解决Microsoft Excel 2007/2010之类版本中扩展名是Excel
39
39
40
40
###workbook和sheet
41
41
42
- 第一步,当然是要引入模块 ,用下面的方式:
42
+ 第一步,引入模块 ,用下面的方式:
43
43
44
44
>>> from openpyxl import Workbook
45
45
46
46
接下来就用` Workbook() ` 类里面的方法展开工作:
47
47
48
48
>>> wb = Workbook()
49
49
50
- 请回忆Excel文件,如果想不起来,就打开Excel,我们第一眼看到的是一个称之为工作簿(workbook)的东西,里面有几个sheet,默认是三个,当然可以随意增删。默认又使用第一个sheet 。
50
+ 请回忆Excel文件,如果想不起来,就打开Excel,我们第一眼看到的是一个称之为工作簿(workbook)的东西,里面有几个sheet,默认是三个,当然可以随意增删。默认使用第一个sheet 。
51
51
52
52
>>> ws = wb.active
53
53
@@ -57,19 +57,19 @@ openpyl模块是解决Microsoft Excel 2007/2010之类版本中扩展名是Excel
57
57
58
58
>>> ws1 = wb.create_sheet()
59
59
60
- 甚至,还可以加塞 :
60
+ 甚至,还可以插队 :
61
61
62
62
>>> ws2 = wb.create_sheet(1)
63
63
64
- 排在了第二个位置 。
64
+ 在第二个位置插入了一个sheet 。
65
65
66
66
在Excel文件中一样,创建了sheet之后,默认都是以"Sheet1"、"Sheet2"样子来命名的,然后我们可以给其重新命名。在这里,依然可以这么做。
67
67
68
68
>>> ws.title = "python"
69
69
70
- ws所引用的sheet对象名字就是 "python"了。
70
+ ` ws ` 所引用的sheet对象名字就是 "python"了。
71
71
72
- 此时,可以使用下面的方式从工作簿对象中得到sheet
72
+ 此时,可以使用下面的方式从工作簿对象中得到sheet。
73
73
74
74
>>> ws01 = wb['python'] #sheet和工作簿的关系,类似键值对的关系
75
75
>>> ws is ws01
@@ -83,41 +83,41 @@ ws所引用的sheet对象名字就是"python"了。
83
83
84
84
整理一下到目前为止我们已经完成的工作:建立了工作簿(wb),还有三个sheet。还是显示一下比较好:
85
85
86
- >>> print wb.get_sheet_names()
86
+ >>> print wb.get_sheet_names() #Python 3: print(wb.get_sheet_names())
87
87
['python', 'Sheet2', 'Sheet1']
88
88
89
- Sheet2这个sheet之所以排在了第二位 ,是因为在建立的时候,用了一个加塞的方法。这跟Excel中差不多少,如果sheet命名了 ,就按照那个名字显示,否则就默认为名字是"Sheet1"形状的(注意,第一个字母大写)。
89
+ Sheet2之所以排在了第二位 ,是因为在建立的时候,用了一个插队的方法。这跟在Excel中差不多少,如果Sheet命名了 ,就按照那个名字显示,否则就默认为名字是"Sheet1"形状的(注意,第一个字母大写)。
90
90
91
- 也可以用循环语句,把所有的sheet名字打印出来 。
91
+ 也可以用循环语句,把所有的Sheet名字打印出来 。
92
92
93
93
>>> for sh in wb:
94
- ... print sh.title
94
+ ... print sh.title #Python 3: print(sh.title)
95
95
...
96
96
python
97
97
Sheet2
98
98
Sheet1
99
99
100
- 如果读者去 ` dir(wb) ` 工作簿对象的属性和方法,会发现它具有迭代的特征` __iter__ ` 方法 。说明,工作簿是可迭代的 。
100
+ 如果读者 ` dir(wb) ` 工作簿对象的属性和方法,会发现它具有迭代的特征` __iter__ ` 。说明,工作簿对象是可迭代的 。
101
101
102
102
###cell
103
103
104
- 为了能够清楚理解填数据的过程 ,将电子表中约定的名称以下图方式说明:
104
+ 为了能够清楚理解向电子表格中增加数据的过程 ,将电子表中约定的名称以下图方式说明:
105
105
106
106
![ ] ( ./2images/23401.jpg )
107
107
108
- 对于sheet,其中的cell是它的下级单位。所以,要得到某个cell,可以这样 :
108
+ 对于sheet,其中的cell是它的下级单位。所以,要得到某个cell可以这样 :
109
109
110
110
b4 = ws['B4']
111
111
112
- 如果B4这个cell已经有了,用这种方法就是将它的值赋给了变量b4 ;如果sheet中没有这个cell,那么就创建这个cell对象。
112
+ 如果B4这个cell已经有了,用这种方法就是将它的值赋给了变量 ` b4 ` ;如果sheet中没有这个cell,那么就创建这个cell对象。
113
113
114
- 请读者注意,当我们打开Excel,默认已经画好了好多cell。但是,在python操作的电子表格中 ,不会默认画好那样一个表格,一切都要创建之后才有。所以,如果按照前面的操作流程,上面就是创建了B4这个cell,并且把它作为一个对象被b4变量引用。
114
+ 请读者注意,当我们打开Excel,默认已经画好了好多cell。但是,在Python操作的电子表格的情况中 ,不会默认画好那样一个表格,一切都要创建之后才有。所以,如果按照前面的操作流程,上面就是创建了B4这个cell,并且把它作为一个对象被b4变量引用。
115
115
116
116
如果要给B4添加数据,可以这么做:
117
117
118
118
>>> ws['B4'] = 4444
119
119
120
- 因为b4引用了一个cell对象 ,所以可以利用这个对象的属性来查看其值:
120
+ 因为 ` b4 ` 引用了一个cell对象 ,所以可以利用这个对象的属性来查看其值:
121
121
122
122
>>> b4.value
123
123
4444
@@ -130,9 +130,10 @@ Sheet2这个sheet之所以排在了第二位,是因为在建立的时候,用
130
130
131
131
>>> a2 = ws.cell(row = 2, column = 1)
132
132
133
- 刚才已经提到,在建立了sheet之后 ,内存中的它并没有cell,需要程序去建立。上面都是一个一个地建立,能不能一下建立多个呢?比如要类似下面的:
133
+ 刚才已经提到,在建立了Sheet之后 ,内存中的它并没有cell,需要程序去建立。上面都是一个一个地建立,能不能一下建立多个呢?比如要类似下面的:
134
134
135
135
| A1| B1| C1|
136
+ | ----| ----| ---|
136
137
| A2| B2| C2|
137
138
| A3| B3| C3|
138
139
@@ -147,11 +148,11 @@ Sheet2这个sheet之所以排在了第二位,是因为在建立的时候,用
147
148
(<Cell python.A2>, <Cell python.B2>, <Cell python.C2>),
148
149
(<Cell python.A3>, <Cell python.B3>, <Cell python.C3>))
149
150
150
- 这是按照横向顺序数过来来的 ,即A1-B1-C1,然后下一横行 。还可以用下面的循环方法,一个一个地读到每个cell对象:
151
+ 这是按照横向顺序读过来的 ,即A1-B1-C1,作为一个元组,然后读下一横行,再组成一个元组 。还可以用下面的循环方法,一个一个地读到每个cell对象:
151
152
152
153
>>> for row in ws.iter_rows("A1:C3"):
153
154
... for cell in row:
154
- ... print cell
155
+ ... print cell #Python 3: print(cell)
155
156
...
156
157
<Cell python.A1>
157
158
<Cell python.B1>
@@ -163,15 +164,15 @@ Sheet2这个sheet之所以排在了第二位,是因为在建立的时候,用
163
164
<Cell python.B3>
164
165
<Cell python.C3>
165
166
166
- 也可以用sheet对象的 ` rows ` 属性,得到按照横向顺序依次排列的cell对象(注意观察结果,因为没有进行范围限制,所以是目前sheet中所有的cell ,前面已经建立到第四行了B4,所以,要比上面的操作多一个row):
167
+ 也可以用Sheet对象的 ` rows ` 属性,得到按照横向顺序依次排列的cell对象(注意观察结果,因为没有进行范围限制,所以是当前Sheet中所有的cell ,前面已经建立到第四行了B4,所以,要比上面的操作多一个row):
167
168
168
169
>>> ws.rows
169
170
((<Cell python.A1 >, <Cell python.B1 >, <Cell python.C1 >),
170
171
(<Cell python.A2 >, <Cell python.B2 >, <Cell python.C2 >),
171
172
(<Cell python.A3 >, <Cell python.B3 >, <Cell python.C3 >),
172
173
(<Cell python.A4 >, <Cell python.B4 >, <Cell python.C4 >))
173
174
174
- 用sheet对象的 ` columns ` 属性,得到的是按照纵向顺序排列的cell对象(注意观察结果):
175
+ 用Sheet对象的 ` columns ` 属性,得到的是按照纵向顺序排列的cell对象(注意观察结果):
175
176
176
177
>>> ws.columns
177
178
((<Cell python.A1>, <Cell python.A2>, <Cell python.A3>, <Cell python.A4>),
@@ -189,15 +190,15 @@ Sheet2这个sheet之所以排在了第二位,是因为在建立的时候,用
189
190
File "<stdin >", line 2, in <module >
190
191
AttributeError: 'tuple' object has no attribute 'value'
191
192
192
- 报错了。什么错误。关键就是没有注意观察上面的结果。tuple里面是以tuple为元素 ,再里面才是cell对象。所以,必须要“时时警醒”,常常谨慎。
193
+ 报错了。关键是没有注意观察上面的结果。元组里面是以元组为元素 ,再里面才是cell对象。所以,必须要“时时警醒”,常常谨慎。
193
194
194
195
>>> for row in ws.rows:
195
196
... for cell in row:
196
197
... cell.value = i
197
198
... i += 1
198
199
...
199
200
200
- 如此,就给每个cell添加了数据。查看一下,不过要换一个属性 :
201
+ 如此,就给每个cell添加了数据。查看一下,不过可以换一个属性 :
201
202
202
203
>>> for col in ws.columns:
203
204
... for cell in col:
@@ -236,12 +237,12 @@ Sheet2这个sheet之所以排在了第二位,是因为在建立的时候,用
236
237
237
238
>>> from openpyxl import load_workbook
238
239
>>> wb2 = load_workbook("23401.xlsx")
239
- >>> print wb2.get_sheet_names()
240
+ >>> print wb2.get_sheet_names() #Python 3: print(wb2.get_sheet_names())
240
241
['python', 'Sheet2', 'Sheet1']
241
242
>>> ws_wb2 = wb2["python"]
242
243
>>> for row in ws_wb2.rows:
243
244
... for cell in row:
244
- ... print cell.value
245
+ ... print cell.value #Python 3: print(cell.value)
245
246
...
246
247
1
247
248
2
0 commit comments