22
33#电子表格
44
5- 一提到电子表格,可能立刻想到的是excel。殊不知,电子表格,还是 “历史悠久”的呢,比word要长久多了 。根据维基百科的记载整理一个简史:
5+ 一提到电子表格,可能立刻想到的是excel。殊不知,电子表格“历史悠久”,比Word要长久多了 。根据维基百科的记载整理一个简史:
66
77> VisiCalc是第一个电子表格程序,用于苹果II型电脑。由丹·布李克林(Dan Bricklin)和鮑伯·法蘭克斯頓(Bob Frankston)發展而成,1979年10月跟著蘋果二號電腦推出,成為蘋果二號電腦上的「殺手應用軟體」。
88
2020
2121> 其实,除了微软的电子表格,在Linux系统中也有很好的电子表格,google也提供了不错的在线电子表格(可惜某国内不能正常访问)。
2222
23- 从历史到现在,电子表格都很广泛的用途。所以,python也要操作一番电子表格,因为有的数据,或许就是存在电子表格中 。
23+ 从历史到现在,电子表格都很广泛的用途。所以,Python也要操作一番电子表格,因为有些数据,就存在电子表格中 。
2424
25- ##openpyl 
25+ ##openpyxl 
2626
27- openpyl模块是解决Microsoft  Excel 2007/2010之类版本中扩展名是Excel 2010 xlsx/xlsm/xltx/xltm的文件的读写的第三方库。(差点上不来气,这句话太长了。) 
27+ openpyxl模块是解决Microsoft  Excel 2007/2010之类版本中扩展名是Excel 2010 xlsx/xlsm/xltx/xltm的文件的读写的第三方库。
2828
2929###安装
3030
31- 安装第三方库,当然用法力无边的pip install
31+ 安装第三方库,当然用法力无边的pip install。 
3232
3333    $ sudo pip install openpyxl 
3434
@@ -39,15 +39,15 @@ openpyl模块是解决Microsoft Excel 2007/2010之类版本中扩展名是Excel
3939
4040###workbook和sheet
4141
42- 第一步,当然是要引入模块 ,用下面的方式:
42+ 第一步,引入模块 ,用下面的方式:
4343
4444    >>> from openpyxl import Workbook 
4545
4646接下来就用` Workbook() ` 类里面的方法展开工作:
4747
4848    >>> wb = Workbook() 
4949
50- 请回忆Excel文件,如果想不起来,就打开Excel,我们第一眼看到的是一个称之为工作簿(workbook)的东西,里面有几个sheet,默认是三个,当然可以随意增删。默认又使用第一个sheet 。
50+ 请回忆Excel文件,如果想不起来,就打开Excel,我们第一眼看到的是一个称之为工作簿(workbook)的东西,里面有几个sheet,默认是三个,当然可以随意增删。默认使用第一个sheet 。
5151
5252    >>> ws = wb.active 
5353
@@ -57,19 +57,19 @@ openpyl模块是解决Microsoft Excel 2007/2010之类版本中扩展名是Excel
5757
5858    >>> ws1 = wb.create_sheet() 
5959
60- 甚至,还可以加塞 :
60+ 甚至,还可以插队 :
6161
6262    >>> ws2 = wb.create_sheet(1) 
6363
64- 排在了第二个位置 。
64+ 在第二个位置插入了一个sheet 。
6565
6666在Excel文件中一样,创建了sheet之后,默认都是以"Sheet1"、"Sheet2"样子来命名的,然后我们可以给其重新命名。在这里,依然可以这么做。
6767
6868    >>> ws.title = "python" 
6969
70- ws所引用的sheet对象名字就是 "python"了。
70+ ` ws ` 所引用的sheet对象名字就是 "python"了。
7171
72- 此时,可以使用下面的方式从工作簿对象中得到sheet
72+ 此时,可以使用下面的方式从工作簿对象中得到sheet。 
7373
7474    >>> ws01 = wb['python']    #sheet和工作簿的关系,类似键值对的关系 
7575    >>> ws is ws01 
@@ -83,41 +83,41 @@ ws所引用的sheet对象名字就是"python"了。
8383
8484整理一下到目前为止我们已经完成的工作:建立了工作簿(wb),还有三个sheet。还是显示一下比较好:
8585
86-     >>> print wb.get_sheet_names() 
86+     >>> print wb.get_sheet_names()    #Python 3: print(wb.get_sheet_names())  
8787    ['python', 'Sheet2', 'Sheet1'] 
8888
89- Sheet2这个sheet之所以排在了第二位 ,是因为在建立的时候,用了一个加塞的方法。这跟Excel中差不多少,如果sheet命名了 ,就按照那个名字显示,否则就默认为名字是"Sheet1"形状的(注意,第一个字母大写)。
89+ Sheet2之所以排在了第二位 ,是因为在建立的时候,用了一个插队的方法。这跟在Excel中差不多少,如果Sheet命名了 ,就按照那个名字显示,否则就默认为名字是"Sheet1"形状的(注意,第一个字母大写)。
9090
91- 也可以用循环语句,把所有的sheet名字打印出来 。
91+ 也可以用循环语句,把所有的Sheet名字打印出来 。
9292
9393    >>> for sh in wb: 
94-     ...     print sh.title 
94+     ...     print sh.title        #Python 3: print(sh.title)  
9595    ...  
9696    python 
9797    Sheet2 
9898    Sheet1 
9999
100- 如果读者去 ` dir(wb) ` 工作簿对象的属性和方法,会发现它具有迭代的特征` __iter__ ` 方法 。说明,工作簿是可迭代的 。
100+ 如果读者 ` dir(wb) ` 工作簿对象的属性和方法,会发现它具有迭代的特征` __iter__ ` 。说明,工作簿对象是可迭代的 。
101101
102102###cell
103103
104- 为了能够清楚理解填数据的过程 ,将电子表中约定的名称以下图方式说明:
104+ 为了能够清楚理解向电子表格中增加数据的过程 ,将电子表中约定的名称以下图方式说明:
105105
106106![ ] ( ./2images/23401.jpg ) 
107107
108- 对于sheet,其中的cell是它的下级单位。所以,要得到某个cell,可以这样 :
108+ 对于sheet,其中的cell是它的下级单位。所以,要得到某个cell可以这样 :
109109
110110    b4 = ws['B4'] 
111111
112- 如果B4这个cell已经有了,用这种方法就是将它的值赋给了变量b4 ;如果sheet中没有这个cell,那么就创建这个cell对象。
112+ 如果B4这个cell已经有了,用这种方法就是将它的值赋给了变量 ` b4 ` ;如果sheet中没有这个cell,那么就创建这个cell对象。
113113
114- 请读者注意,当我们打开Excel,默认已经画好了好多cell。但是,在python操作的电子表格中 ,不会默认画好那样一个表格,一切都要创建之后才有。所以,如果按照前面的操作流程,上面就是创建了B4这个cell,并且把它作为一个对象被b4变量引用。
114+ 请读者注意,当我们打开Excel,默认已经画好了好多cell。但是,在Python操作的电子表格的情况中 ,不会默认画好那样一个表格,一切都要创建之后才有。所以,如果按照前面的操作流程,上面就是创建了B4这个cell,并且把它作为一个对象被b4变量引用。
115115
116116如果要给B4添加数据,可以这么做:
117117
118118    >>> ws['B4'] = 4444 
119119
120- 因为b4引用了一个cell对象 ,所以可以利用这个对象的属性来查看其值:
120+ 因为 ` b4 ` 引用了一个cell对象 ,所以可以利用这个对象的属性来查看其值:
121121
122122    >>> b4.value 
123123    4444 
@@ -130,9 +130,10 @@ Sheet2这个sheet之所以排在了第二位,是因为在建立的时候,用
130130
131131    >>> a2 = ws.cell(row = 2, column = 1) 
132132
133- 刚才已经提到,在建立了sheet之后 ,内存中的它并没有cell,需要程序去建立。上面都是一个一个地建立,能不能一下建立多个呢?比如要类似下面的:
133+ 刚才已经提到,在建立了Sheet之后 ,内存中的它并没有cell,需要程序去建立。上面都是一个一个地建立,能不能一下建立多个呢?比如要类似下面的:
134134
135135| A1| B1| C1| 
136+ | ----| ----| ---| 
136137| A2| B2| C2| 
137138| A3| B3| C3| 
138139
@@ -147,11 +148,11 @@ Sheet2这个sheet之所以排在了第二位,是因为在建立的时候,用
147148     (<Cell python.A2>, <Cell python.B2>, <Cell python.C2>),  
148149     (<Cell python.A3>, <Cell python.B3>, <Cell python.C3>)) 
149150
150- 这是按照横向顺序数过来来的 ,即A1-B1-C1,然后下一横行 。还可以用下面的循环方法,一个一个地读到每个cell对象:
151+ 这是按照横向顺序读过来的 ,即A1-B1-C1,作为一个元组,然后读下一横行,再组成一个元组 。还可以用下面的循环方法,一个一个地读到每个cell对象:
151152
152153    >>> for row in ws.iter_rows("A1:C3"): 
153154    ...     for cell in row: 
154-     ...         print cell 
155+     ...         print cell        #Python 3: print(cell)  
155156    ...  
156157    <Cell python.A1> 
157158    <Cell python.B1> 
@@ -163,15 +164,15 @@ Sheet2这个sheet之所以排在了第二位,是因为在建立的时候,用
163164    <Cell python.B3> 
164165    <Cell python.C3> 
165166
166- 也可以用sheet对象的 ` rows ` 属性,得到按照横向顺序依次排列的cell对象(注意观察结果,因为没有进行范围限制,所以是目前sheet中所有的cell ,前面已经建立到第四行了B4,所以,要比上面的操作多一个row):
167+ 也可以用Sheet对象的 ` rows ` 属性,得到按照横向顺序依次排列的cell对象(注意观察结果,因为没有进行范围限制,所以是当前Sheet中所有的cell ,前面已经建立到第四行了B4,所以,要比上面的操作多一个row):
167168
168169    >>> ws.rows
169170    ((<Cell  python.A1 >, <Cell  python.B1 >, <Cell  python.C1 >), 
170171     (<Cell  python.A2 >, <Cell  python.B2 >, <Cell  python.C2 >), 
171172     (<Cell  python.A3 >, <Cell  python.B3 >, <Cell  python.C3 >), 
172173     (<Cell  python.A4 >, <Cell  python.B4 >, <Cell  python.C4 >))
173174
174- 用sheet对象的 ` columns ` 属性,得到的是按照纵向顺序排列的cell对象(注意观察结果):
175+ 用Sheet对象的 ` columns ` 属性,得到的是按照纵向顺序排列的cell对象(注意观察结果):
175176
176177    >>> ws.columns 
177178    ((<Cell python.A1>, <Cell python.A2>, <Cell python.A3>, <Cell python.A4>),  
@@ -189,15 +190,15 @@ Sheet2这个sheet之所以排在了第二位,是因为在建立的时候,用
189190      File "<stdin >", line 2, in <module >
190191    AttributeError: 'tuple' object has no attribute 'value'
191192
192- 报错了。什么错误。关键就是没有注意观察上面的结果。tuple里面是以tuple为元素 ,再里面才是cell对象。所以,必须要“时时警醒”,常常谨慎。
193+ 报错了。关键是没有注意观察上面的结果。元组里面是以元组为元素 ,再里面才是cell对象。所以,必须要“时时警醒”,常常谨慎。
193194
194195    >>> for row in ws.rows:
195196    ...     for cell in row:
196197    ...         cell.value = i
197198    ...         i += 1
198199    ... 
199200
200- 如此,就给每个cell添加了数据。查看一下,不过要换一个属性 :
201+ 如此,就给每个cell添加了数据。查看一下,不过可以换一个属性 :
201202
202203    >>> for col in ws.columns: 
203204    ...     for cell in col: 
@@ -236,12 +237,12 @@ Sheet2这个sheet之所以排在了第二位,是因为在建立的时候,用
236237
237238    >>> from openpyxl import load_workbook 
238239    >>> wb2 = load_workbook("23401.xlsx") 
239-     >>> print wb2.get_sheet_names() 
240+     >>> print wb2.get_sheet_names()        #Python 3: print(wb2.get_sheet_names())  
240241    ['python', 'Sheet2', 'Sheet1'] 
241242    >>> ws_wb2 = wb2["python"] 
242243    >>> for row in ws_wb2.rows: 
243244    ...     for cell in row: 
244-     ...         print cell.value 
245+     ...         print cell.value        #Python 3: print(cell.value)  
245246    ...  
246247    1 
247248    2 
0 commit comments