有很多不同的东西你可以写到电子表格,从简单的文本或数字值到复杂的公式,图表,甚至图像。
创建一个简单的电子表格
之前,大家看到了一个非常快速的例子,就是如何将 "Hello world!"写进电子表格中,所以大家可以从这个开始。
上面代码中高亮的几行是最重要的写法:
第5行告诉你如何创建一个新的空工作簿。
第8行和第9行显示了如何向特定单元格添加数据。
第11行告诉你如何在完成后保存电子表格。
尽管上面这些代码表达非常简洁,但遇到更复杂情况的时候,熟知它们还是非常必要的。
你可以做的一件事是在你的Python文件或控制台中添加下面的方法来帮助即将到来的代码示例:
>>> def print_rows():... for row in sheet.iter_rows(values_only=True):... print(row)
只需调用print_rows(),就能轻松打印出所有的电子表格值。
电子表格的基本操作
在进入更高级的主题之前,最好先了解如何管理电子表格中最简单的元素。
添加和更新单元格值
你已经学会了如何像这样的电子表格添加值:
sheet["A1"] = "value"
其实还有一种方法可以做到这一点:先选择一个单元格,然后改变其值。
>>> cell = sheet["A1"]>>> cell'Sheet'.A1>>>> cell.value'hello'>>> cell.value = "hey">>> cell.value'hey'
只有在调用workbook.save()后,新的值才会存储到电子表格中。
openpyxl会在添加值时创建一个单元格,前提是如果该单元格之前不存在。
>>> # Before, our spreadsheet has only 1 row>>> print_rows()('hello', 'world!')>>> # Try adding a value to row 10>>> sheet["B10"] = "test">>> print_rows()('hello', 'world!')(None, None)(None, None)(None, None)(None, None)(None, None)(None, None)(None, None)(None, None)(None, 'test')
当你试图向单元格B10中添加一个值时,你最终会得到一个有10行的元组,只是为了让你能得到那个测试值。
管理行和列
在操作电子表格时,最常见的事情之一就是添加或删除行和列。openpyxl软件包允许你通过使用以下方法以一种非常直接的方式来完成这些操作:
.insert_rows()
.delete_rows()
.insert_cols()
.delete_cols()
以下这些方法中的每一个都可以接收两个参数:
idx
数量
再用我们基本的hello_world.xlsx例子,让我们看看这些方法是如何工作的。
>>> print_rows()('hello', 'world!')>>> # Insert a column before the existing column 1 ("A")>>> sheet.insert_cols(idx=1)>>> print_rows()(None, 'hello', 'world!')>>> # Insert 5 columns between column 2 ("B") and 3 ("C")>>> sheet.insert_cols(idx=3, amount=5)>>> print_rows()(None, 'hello', None, None, None, None, None, 'world!')>>> # Delete the created columns>>> sheet.delete_cols(idx=3, amount=5)>>> sheet.delete_cols(idx=1)>>> print_rows()('hello', 'world!')>>> # Insert a new row in the beginning>>> sheet.insert_rows(idx=1)>>> print_rows()(None, None)('hello', 'world!')>>> # Insert 3 new rows in the beginning>>> sheet.insert_rows(idx=1, amount=3)>>> print_rows()(None, None)(None, None)(None, None)(None, None)('hello', 'world!')>>> # Delete the first 4 rows>>> sheet.delete_rows(idx=1, amount=4)>>> print_rows()('hello', 'world!')
你需要唯一需要记住的是,当插入新数据(行或列)时,插入发生在idx参数之前。如果你执行insert_rows(1),它会在现有的第一行之前插入一条新行。
对于列来说也是一样:当你调用insert_cols(2)时,它会在已经存在的第二列(B)之前插入一个新的列。
但是,当删除行或列时,.delete_...会从作为参数传递的索引开始删除数据。
例如,当执行delete_rows(2)时,它删除第2行,而当执行delete_cols(3)时,它删除第三列(C)。
管理工作表格
工作表管理也是你需要了解的东西之一,尽管它可能是你不经常使用的东西。
如果你回顾一下本教程中的代码示例,你会注意到下面这段反复出现的代码。
sheet = workbook.active
这是选择电子表格中默认工作表的方法。不过,如果你打开的电子表格有多张表,那么你总是可以像这样选择一个特定的表。
>>> # Let's say you have two sheets: "Products" and "Company Sales">>> workbook.sheetnames['Products', 'Company Sales']>>> # You can select a sheet using its title>>> products_sheet = workbook["Products"]>>> sales_sheet = workbook["Company Sales"]
你也可以很容易地改变一个表的标题:
>>> workbook.sheetnames['Products', 'Company Sales']>>> products_sheet = workbook["Products"]>>> products_sheet.title = "New Products">>> workbook.sheetnames['New Products', 'Company Sales']
如果你想创建或删除工作表,那么你也可以通过.create_sheet()和.remove()来实现:
>>> workbook.sheetnames['Products', 'Company Sales']>>> operations_sheet = workbook.create_sheet("Operations")>>> workbook.sheetnames['Products', 'Company Sales', 'Operations']>>> # You can also define the position to create the sheet at>>> hr_sheet = workbook.create_sheet("HR", 0)>>> workbook.sheetnames['HR', 'Products', 'Company Sales', 'Operations']>>> # To remove them, just pass the sheet as an argument to the .remove()>>> workbook.remove(operations_sheet)>>> workbook.sheetnames['HR', 'Products', 'Company Sales']>>> workbook.remove(hr_sheet)>>> workbook.sheetnames['Products', 'Company Sales']
你还可以用copy_worksheet()来复制一个工作表:
>>> workbook.sheetnames['Products', 'Company Sales']>>> products_sheet = workbook["Products"]>>> workbook.copy_worksheet(products_sheet)"Products Copy">>>> workbook.sheetnames['Products', 'Company Sales', 'Products Copy']
如果保存上述代码后打开电子表格,你会发现工作表Products Copy与工作表Products其实是重复的。
冻结行和列
在处理大型电子表格时,你可能想做的事情是冻结一些行或列,这样当你向右或向下滚动时,它们仍然可见。
冻结数据可以让你关注重要的行或列,无论你在电子表格中滚动到哪里。
同样,openpyxl 也有办法通过使用工作表 freeze_panes 属性来实现这一目的。对于这个例子,回到我们的sample.xlsx电子表格,并尝试做以下操作:
>>> workbook = load_workbook(filename="sample.xlsx")>>> sheet = workbook.active>>> sheet.freeze_panes = "C2">>> workbook.save("sample_frozen.xlsx")
如果你在你最喜欢的电子表格编辑器中打开sample_frozen.xlsx电子表格,你会注意到第1行以及A和B列都被冻结了,无论你在电子表格中的哪个位置导航,这部分都是可见的。
这个功能很方便,可以将标题保持在视线范围内,这样你就可以随时知道每列代表什么。下面在是编辑器中的样子:
请注意,你已经到了电子表格的最后,然而,你既能看到第1行,又能看到A和B列。
添加过滤器
你可以使用 openpyxl 为你的电子表格添加过滤器和分类。然而,当你打开电子表格时,数据不会根据这些分类和过滤器重新排列。
这似乎是一个很无用的功能,但当你以编程方式创建一个电子表格,并将被别人发送和使用时,至少创建过滤器并允许人们在之后使用它还是不错的。
下面的代码是一个例子,说明如何在我们现有的sample.xlsx电子表格中添加一些过滤器。
>>> # Check the used spreadsheet space using the attribute "dimensions">>> sheet.dimensions'A1:O100'>>> sheet.auto_filter.ref = "A1:O100">>> workbook.save(filename="sample_with_filters.xlsx")
现在,当您在编辑器中打开电子表格时,您应该可以看到创建的过滤器。
如果你知道你要应用过滤器的电子表格的哪个部分,你就不必使用 sheet.dimensions
今天介绍了以下创建电子表格的基本操作,下一篇我们会继续深入了解如何添加公式,添加样式,进行条件格式化,添加图片,添加漂亮的图表,以及如何转换Python类到Excel电子表格。