天天看点

处理Excel电子表格

一个Excel电子表格文档称为一个工作薄。

每个工作薄可以包含多个工作表。

用户当前查看的表,称为活动表。

python没有自带openpyxl,所以必须安装。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

<code>c:\python\Scripts&gt;pip3.6 install openpyxl</code>

<code>Collecting openpyxl</code>

<code>  </code><code>Downloading openpyxl-2.4.9.tar.gz (157kB)</code>

<code>    </code><code>100% |████████████████████████████████| 163kB 183kB/s</code>

<code>Collecting jdcal (from openpyxl)</code>

<code>  </code><code>Downloading jdcal-1.3.tar.gz</code>

<code>Collecting et_xmlfile (from openpyxl)</code>

<code>  </code><code>Downloading et_xmlfile-1.0.1.tar.gz</code>

<code>Installing collected packages: jdcal, et-xmlfile, openpyxl</code>

<code>  </code><code>Running setup.py install for jdcal ... done</code>

<code>  </code><code>Running setup.py install for et-xmlfile ... done</code>

<code>  </code><code>Running setup.py install for openpyxl ... done</code>

<code>Successfully installed et-xmlfile-1.0.1 jdcal-1.3 openpyxl-2.4.9</code>

<code>c:\python&gt;python.exe</code>

<code>Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] on win32</code>

<code>Type "help", "copyright", "credits" or "license" for more information.</code>

<code>&gt;&gt;&gt; import openpyxl</code>

<code>&gt;&gt;&gt;</code>

用openpyxl模块打开Excel文档

<code>&gt;&gt;&gt; </code><code>import</code> <code>openpyxl</code>

<code>&gt;&gt;&gt; wb</code><code>=</code><code>openpyxl.load_workbook(</code><code>'example.xlsx'</code><code>)</code>

<code>&gt;&gt;&gt; </code><code>type</code><code>(wb)</code>

<code>&lt;</code><code>class</code> <code>'openpyxl.workbook.workbook.Workbook'</code><code>&gt;</code>

openpyxl.load_workbook()函数接受文件名,返回一个workbook数据类型的值。这个workbook对象代表这个Excel文件。

example.xlsx需要在当前工作目录,才能处理它。可以导入os,使用函数os.getcwd()确定当前工作目录,并用os.chdir()改变当前工作目录。

从工作薄中取得工作表

调用get_sheet_names()方法可以取得工作薄中所有表名的列表。

<code>&gt;&gt;&gt; wb.get_sheet_names()</code>

<code>[</code><code>'Sheet1'</code><code>, </code><code>'Sheet2'</code><code>, </code><code>'Sheet3'</code><code>]</code>

<code>&gt;&gt;&gt; sheet</code><code>=</code><code>wb.get_sheet_by_name(</code><code>'Sheet3'</code><code>)</code>

<code>&gt;&gt;&gt; sheet</code>

<code>&lt;Worksheet </code><code>"Sheet3"</code><code>&gt;</code>

<code>&gt;&gt;&gt; </code><code>type</code><code>(sheet)</code>

<code>&lt;</code><code>class</code> <code>'openpyxl.worksheet.worksheet.Worksheet'</code><code>&gt;</code>

<code>&gt;&gt;&gt; sheet.title</code>

<code>'Sheet3'</code>

<code>&gt;&gt;&gt; anotherSheet</code><code>=</code><code>wb.get_active_sheet()</code>

<code>&gt;&gt;&gt; anotherSheet</code>

每个表由一个Worksheet对象表示,可以通过向工作薄方法get_sheet_by_name()传递表名字符串获得。

调用Workbook对象的get_active_sheet()方法,取得工作薄的活动表。

从表中取得单元格

<code>&gt;&gt;&gt; sheet</code><code>=</code><code>wb.get_sheet_by_name(</code><code>'Sheet1'</code><code>)</code>

<code>&gt;&gt;&gt; sheet[</code><code>'A1'</code><code>]</code>

<code>&lt;Cell </code><code>'Sheet1'</code><code>.A1&gt;</code>

<code>&gt;&gt;&gt; sheet[</code><code>'A1'</code><code>].value</code><code>=</code><code>'apple'</code>

<code>&gt;&gt;&gt; sheet[</code><code>'A1'</code><code>].value</code>

<code>'apple'</code>

<code>&gt;&gt;&gt; c</code><code>=</code><code>sheet[</code><code>'B1'</code><code>]</code>

<code>&gt;&gt;&gt; c.value</code><code>=</code><code>'juice'</code>

<code>&gt;&gt;&gt; </code><code>str</code><code>(c.row)</code>

<code>'1'</code>

<code>&gt;&gt;&gt; c.row</code>

<code>1</code>

<code>&gt;&gt;&gt; c.column</code>

<code>'B'</code>

<code>&gt;&gt;&gt; c.coordinate</code>

<code>'B1'</code>

Cell对象的value属性,包含这个单元格中保存的值。

Cell对象也有row、column和coordinate属性,提供该单元格的位置信息。

第一行或第一列的整数是1,不是0。

<code>&gt;&gt;&gt; sheet.cell(row</code><code>=</code><code>1</code><code>,column</code><code>=</code><code>2</code><code>)</code>

<code>&lt;Cell </code><code>'Sheet1'</code><code>.B1&gt;</code>

<code>&gt;&gt;&gt; sheet.cell(row</code><code>=</code><code>1</code><code>,column</code><code>=</code><code>2</code><code>).value</code>

<code>'juice'</code>

<code>&gt;&gt;&gt; </code><code>for</code> <code>i </code><code>in</code> <code>range</code><code>(</code><code>1</code><code>,</code><code>8</code><code>,</code><code>2</code><code>):</code>

<code>...     </code><code>print</code><code>(i,sheet.cell(row</code><code>=</code><code>i,column</code><code>=</code><code>2</code><code>).value)</code>

<code>...</code>

<code>1</code> <code>juice</code>

<code>3</code> <code>None</code>

<code>5</code> <code>None</code>

<code>7</code> <code>None</code>

可以通过Worksheet对象的get_highest_row()和get_highest_column()方法,确定表的大小。

get_highest_column()方法返回一个整数,而不是Excel中出现的字母。

列字母和数字之间的转换

要从字母转换到数字,就调用openpyxl.cell.column_index_from_string()函数。

要从数字转换到字母,就调用openpyxl.cell.get_column_letter()函数。

从表中取得行和列

19

20

21

22

<code>&gt;&gt;&gt; </code><code>tuple</code><code>(sheet[</code><code>'A1'</code><code>:</code><code>'C3'</code><code>])</code>

<code>((&lt;Cell </code><code>'Sheet1'</code><code>.A1&gt;, &lt;Cell </code><code>'Sheet1'</code><code>.B1&gt;, &lt;Cell </code><code>'Sheet1'</code><code>.C1&gt;), (&lt;Cell </code><code>'Sheet1'</code><code>.A2&gt;, &lt;Cell </code><code>'Sheet1'</code><code>.B2&gt;, &lt;Cell </code><code>'Sheet1'</code><code>.C2&gt;), (&lt;Cell </code><code>'Sheet1'</code><code>.A3&gt;, &lt;Cell </code><code>'Sheet1'</code><code>.B3&gt;, &lt;Cell </code><code>'Sheet1'</code><code>.C3&gt;))</code>

<code>&gt;&gt;&gt; </code><code>for</code> <code>i </code><code>in</code> <code>sheet[</code><code>'A1'</code><code>:</code><code>'C3'</code><code>]:</code>

<code>...     </code><code>for</code> <code>j </code><code>in</code> <code>i:</code>

<code>...             </code><code>print</code><code>(j.coordinate,j.value)</code>

<code>...     </code><code>print</code><code>(</code><code>'--- END OF ROW ---'</code><code>)</code>

<code>A1 apple</code>

<code>B1 juice</code>

<code>C1 cake</code>

<code>-</code><code>-</code><code>-</code> <code>END OF ROW </code><code>-</code><code>-</code><code>-</code>

<code>A2 </code><code>None</code>

<code>B2 nurse</code>

<code>C2 </code><code>None</code>

<code>A3 </code><code>None</code>

<code>B3 </code><code>None</code>

<code>C3 </code><code>None</code>

总结:

1、导入openpyxl模块

2、调用openpyxl.load_workbook()函数

3、取得Workbook对象

4、调用get_active_sheet()或get_sheet_by_name()工作薄方法

5、取得Worksheet对象

6、使用索引或工作表的cell()方法,带上row和column关键字参数

7、取得Cell对象

8、读取Cell对象的value属性

【扩展】

1、Font对象

Font对象的style属性影响文本在单元格中的显示方式。

要设置字体风格属性,就向Font()函数传入关键字参数。

2、公式

<code>&gt;&gt;&gt; sheet[</code><code>'B10'</code><code>]</code><code>=</code><code>'=sum(B1:B9)'</code>

<code>&gt;&gt;&gt; wb.save(</code><code>'example.xlsx'</code><code>)       </code><code>##保存</code>

3、调整行和列

Worksheet对象由row_dimensions和column_dimensions属性,控制行高和列宽。

<code>&gt;&gt;&gt; sheet.row_dimensions[</code><code>1</code><code>].height</code><code>=</code><code>70</code>

<code>&gt;&gt;&gt; sheet.column_dimensions[</code><code>'B'</code><code>].width</code><code>=</code><code>40</code>

<code>&gt;&gt;&gt; wb.save(</code><code>'example.xlsx'</code><code>)</code>

利用merge_cells()工作表方法,可以将一个矩形区域中的单元格合并为一个单元格。

要拆分单元格,就调用unmerge_cells()工作表方法。

<code>&gt;&gt;&gt; sheet.merge_cells(</code><code>'A1:D3'</code><code>)</code>

在OpenPyXL中,每个Worksheet对象都有一个freeze_panes属性,可以设置为一个Cell对象或一个单元格坐标的字符串。

单元格上边的所有行和左边的所有列都会冻结,但单元格所在的行和列不会冻结。

要解冻所有的单元格,就将freeze_panes设置为None或‘A1’。

<code>&gt;&gt;&gt; sheet.freeze_panes</code><code>=</code><code>'A2'</code>  <code>##行1将永远可见</code>

如果需要创建图标,需要做下列事情:

1、从一个矩形区域选择的单元格,创建一个Reference对象

2、通过传入Reference对象,创建一个Series对象

3、创建一个Chart对象

4、将Series对象添加到Chart对象

5、可选地设置Chart对象的drawing.top、drawing.left、drawing.width和drawing.height变量

6、将Chart对象添加到Worksheet对象

如果加载一个Workbook对象,然后马上保存到同样的.xlsx文件名中,实际上会删除其中的图表。

本文转自Grodd51CTO博客,原文链接:http://blog.51cto.com/juispan/2050824,如需转载请自行联系原作者