【python 让繁琐工作自动化】第13章 处理 Excel 电子表格 (2)


Automate the Boring Stuff with Python: Practical Programming for Total Beginners (2nd Edition)
Copyright © 2020 by Al Sweigart.


13.6 设置单元格的字体样式

使用 openpyxl.styles 模块的 Font() 函数自定义单元格中的字体样式:

>>> import openpyxl
>>> from openpyxl.styles import Font
>>> wb = openpyxl.Workbook()
>>> sheet = wb['Sheet']
>>> italic24Font = Font(size=24, italic=True) # Create a font.
>>> sheet['A1'].font = italic24Font # Apply the font to A1.
>>> sheet['A1'] = 'Hello, world!'
>>> wb.save('styles.xlsx')

字体对象

要设置 font 属性,需要将关键字实参传递给 Font()

表13-2:Font 对象的关键字参数

关键字参数数据类型描述
nameString字体名称,例如 “Calibri” 或 “Times New Roman”
sizeInteger字体的点大小
boldBooleanTrue 用于粗体
italicBooleanTrue 用于斜体字

可以调用 Font() 创建一个 Font 对象并将该 Font 对象存储在变量中。然后将该变量分配给 Cell 对象的 font 属性。

>>> import openpyxl
>>> from openpyxl.styles import Font
>>> wb = openpyxl.Workbook()
>>> sheet = wb['Sheet']

>>> fontObj1 = Font(name='Times New Roman', bold=True)
>>> sheet['A1'].font = fontObj1
>>> sheet['A1'] = 'Bold Times New Roman'

>>> fontObj2 = Font(size=24, italic=True)
>>> sheet['B3'].font = fontObj2
>>> sheet['B3'] = '24 pt Italic'

>>> wb.save('styles.xlsx')

13.7 公式

>>> import openpyxl
>>> wb = openpyxl.Workbook()
>>> sheet = wb.active
>>> sheet['A1'] = 200
>>> sheet['A2'] = 300
>>> sheet['A3'] = '=SUM(A1:A2)' # Set the formula.
>>> wb.save('writeFormula.xlsx')

13.8 调整行和列

设置行高和列宽

Worksheet 对象具有控制行高和列宽的 row_dimensionscolumn_dimensions 属性。

>>> import openpyxl
>>> wb = openpyxl.Workbook()
>>> sheet = wb.active
>>> sheet['A1'] = 'Tall row'
>>> sheet['B2'] = 'Wide column'
>>> # Set the height and width:
>>> sheet.row_dimensions[1].height = 70
>>> sheet.column_dimensions['B'].width = 20
>>> wb.save('dimensions.xlsx')

合并与取消合并单元格

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

>>> import openpyxl
>>> wb = openpyxl.Workbook()
>>> sheet = wb.active
>>> sheet.merge_cells('A1:D3') # Merge all these cells.
>>> sheet['A1'] = 'Twelve cells merged together.'
>>> sheet.merge_cells('C5:D5') # Merge these two cells.
>>> sheet['C5'] = 'Two merged cells.'
>>> wb.save('merged.xlsx')

要取消合并单元格,调用 unmerge_cells() 工作表方法。

>>> import openpyxl
>>> wb = openpyxl.load_workbook('merged.xlsx')
>>> sheet = wb.active
>>> sheet.unmerge_cells('A1:D3') # Split these cells up.
>>> sheet.unmerge_cells('C5:D5')
>>> wb.save('merged.xlsx')

冷冻窗格

对于过大而无法一次显示的电子表格,“冻结”屏幕上的几行顶部或最左侧的列会很有帮助。例如,冻结的列标题或行标题在用户滚动电子表格时始终对用户可见。这些称为冻结窗格 (freeze panes)。
在 OpenPyXL 中,每个 Worksheet 对象都有一个 Frozen_panes 属性,可以将其设置为 Cell 对象或单元格坐标的字符串。注意,此单元格上方的所有行和左侧的所有列将被冻结,但是单元格本身的行和列将不会被冻结。

表13-3:冻结窗格示例

freeze_panes 设置冻结的行和列
sheet.freeze_panes = 'A2'第 1 行
sheet.freeze_panes = 'B1'第 A 列
sheet.freeze_panes = 'C2'第 1 行和第 A - B 列
sheet.freeze_panes = 'A1'sheet.freeze_panes = None没有冻结窗格
>>> import openpyxl
>>> wb = openpyxl.load_workbook('produceSales.xlsx')
>>> sheet = wb.active
>>> sheet.freeze_panes = 'A2' # Freeze the rows above A2.
>>> wb.save('freezeExample.xlsx')

13.9 图表

OpenPyXL 支持使用工作表单元格中的数据创建条形图,折线图,散点图和饼图。要制作图表,需要执行以下操作:

  1. 从单元格的矩形选区中创建 Reference 对象。
  2. 通过传入 Reference 对象来创建 Series 对象。
  3. 创建一个 Chart 对象。
  4. 将 Series 对象添加到 Chart 对象。
  5. 将 Chart 对象添加到 Worksheet 对象,可以选择指定哪个单元格应该在图表的左上角。

Reference 对象需要一些解释。可以通过调用 openpyxl.chart.Reference() 函数并传递三个参数来创建 Reference 对象:

  • 包含图表数据的工作表对象。
  • 两个整数的元组,表示包含图表数据的单元格的矩形选区的左上角单元格:元组中的第一个整数是行,第二个是列。注意,第一行是1,而不是0。
  • 两个整数的元组,表示包含图表数据的单元格的矩形选区的右下角单元格:元组中的第一个整数是行,第二个是列。
>>> import openpyxl
>>> wb = openpyxl.Workbook()
>>> sheet = wb.active
>>> for i in range(1, 11): # create some data in column A
...     sheet['A' + str(i)] = i
...
>>> refObj = openpyxl.chart.Reference(sheet, min_col=1, min_row=1, max_col=1, max_row=10)
>>> seriesObj = openpyxl.chart.Series(refObj, title='First series')

>>> chartObj = openpyxl.chart.BarChart()	# create a bar chart (条形图)
>>> chartObj.title = 'My Chart'
>>> chartObj.append(seriesObj)

>>> sheet.add_chart(chartObj, 'C5')
>>> wb.save('sampleChart.xlsx')

这将产生一个插入图表的电子表格。

openpyxl.chart.BarChart():创建一个条形图。
openpyxl.charts.LineChart():创建一个折线图。
openpyxl.chart.ScatterChart():创建一个散点图。
openpyxl.chart.PieChart():创建一个饼图。


13.10 实践项目

乘法表制作工具

创建一个程序 multiplicationTable.py,该程序从命令行获取数字 N,并在 Excel 电子表格中创建 N×N 乘法表。
例如,当运行 py multiplicationTable.py 6 时,应该创建一个电子表格如下:

乘法表
第 1 行和 A 列应用于标签,并且应为粗体。

#! python3
# multiplicationTable.py - creates an N×N multiplication table in an Excel spreadsheet.

import sys, openpyxl

if len(sys.argv) < 2:
    print('Usage: python multiplicationTable.py [number] - pass the number N, create NxN multiplication table')
    sys.exit()
N = int(sys.argv[1])      # first command line arg is the number N

wb = openpyxl.Workbook() # Create a blank workbook.
sheet = wb.active

boldFont = Font(bold=True) # Create a font.

# Row 1 and column A should be used for labels and should be in bold.
for i in range(2, N+2):
	sheet['A'+str(i)] = i - 1	# A 列数据
	sheet['A'+str(i)].font = boldFont # Apply the font to A1.
	sheet.cell(row=1, column=i).value = i - 1	# 第 1 行数据
	sheet.cell(row=1, column=i).font = boldFont

for r in range(2, N+2):
	for c in range(2, N+2):
		a = sheet.cell(row=1, column=c).value
		b = sheet.cell(row=r, column=1).value
		sheet.cell(row=r, column=c).value = a * b

wb.save('multiplicationTable.xlsx') # Save the workbook.

空白行插入工具

创建一个程序 blankRowInserter.py,该程序将两个整数和一个文件名字符串作为命令行参数。第一个整数为 N,第二个整数为 M。从第 N 行开始,程序应在电子表格中插入 M 个空白行。
例如,运行 python blankRowInserter.py 3 2 myProduce.xlsx 后,电子表格更改内容如下:

插入空白行
可以通过阅读电子表格的内容来编写此程序。然后,在写出新的电子表格时,使用 for 循环复制前 N 行。对于剩余的行,将 M 添加到输出电子表格中的行号。

#! python3
# blankRowInserter.py - Starting at row N, the program insert M blank rows into the spreadsheet.

import sys, openpyxl

if len(sys.argv) < 4:
    print('Usage: python blankRowInserter.py [N] [M] [filename] - Starting at row N, the program insert M blank rows into the spreadsheet.')
    sys.exit()
N = int(sys.argv[1])
M = int(sys.argv[2])
filename = sys.argv[3]

wbRead = openpyxl.load_workbook(filename)
sheetRead = wbRead.active

wbWrite = openpyxl.Workbook() # Create a blank workbook.
sheetWrite = wbWrite.active

for r in range(1,N):
	for c in range(1, sheetRead.max_column+1):
		sheetWrite.cell(row=r, column=c).value = sheetRead.cell(row=r, column=c).value

for r in range(N, sheetRead.max_row+1):
	for c in range(1, sheetRead.max_column+1):
		sheetWrite.cell(row=r+M, column=c).value = sheetRead.cell(row=r, colum=c).value

wbWrite.save('insertBlankRow.xlsx')

电子表格单元格反转工具

编写一个程序,反转电子表格中单元格的行和列。例如,第5行第3列的值将在第3行第5列。对电子表格中的所有单元格执行此操作。
可以使用嵌套的 for 循环来编写该程序,以将电子表格的数据读取到 list 数据结构列表中。
对于第 x 列和第 y 行的单元格,此数据结构具有 sheetData[x][y]。然后,在写出新的电子表格时,将sheetData[y][x] 用于 x 列和 y 行的单元格。

#! python3
# spreadsheetCellInverter.py - Invert the row and column of the cells in the spreadsheet.

import sys, openpyxl

if len(sys.argv) < 2:
	print('Usage: python spreadsheetCellInverter.py [filename] - the .xlsx filename.')
filename = sys.argv[1]

wbRead = openpyxl.load_workbook(filename)
sheetRead = wbRead.active

wbWrite = openpyxl.Workbook()
sheetWrite = wbWrite.active

for r in range(1, sheetRead.max_row+1):
	for c in range(1, sheetRead.max_column+1):
		sheetWrite.cell(row=c, column=r).value = sheetRead.cell(row=r, column=c).value
		
wbWrite.save('invertCell.xlsx')

文本文件到电子表格

编写程序,读取多个文本文件的内容,然后将这些内容插入电子表格中,每行写入一行文本。第一个文本文件的行写入A列的单元格中,第二个文本文件的行写入B列的单元格中,依此类推。
使用 readlines() File 对象方法返回字符串列表,文件中的每一行一个字符串。对于第一个文件,将第一行输出到第1列第1行,第二行应写入第1列第2行,依此类推。下一个使用 readlines() 读取的文件将被写入第2列,下一个文件将被写入第3列,依此类推。

#! python3
# textFilesToSpreadsheet.py - Read in the contents of several text files and insert those contents into a spreadsheet, with one line of text per row.

import os, openpyxl

wb = openpyxl.Workbook()
sheet = wb.active

colNum = 1
for txtFilename in os.listdir('.'):
	if not txtFilename.endswith('.txt'):
		continue	# skip non-txt files
	
	txtFile = open(txtFilename)
	rowNum = 1
	for line in txtFile.readlines()
		sheet.cell(row=rowNum, column=colNum).value = line.strip() # clear '\n' at the end of the string
		rowNum += 1
	txtFile.close()
	colNum += 1

wb.save('textFilesToSpreadsheet.xlsx')

电子表格到文本文件

编写一个程序,执行与上一个程序顺序相反的任务:该程序应打开电子表格,并将A列的单元格写入一个文本文件,将B列的单元格写入另一个文本文件,依此类推。

#! python3
# spreadsheetToTextFiles.py - Open a spreadsheet and write the cells of column A into one text file, the cells of column B into another text file, and so on.

import os, openpyxl

wb = openpyxl.load_workbook('your_spreadsheet.xlsx')
sheet = wb.active

os.makedirs('textFiles', exist_ok=True)

for c in range(1, sheet.max_column+1):
	fileName = str(c) + ".txt"
	txtFile = open(os.path.join('textFiles', fileName), 'w')
	for r in range(1, sheet.max_row+1):
		data = sheet.cell(row=r, column=c).value + '\n'
		txtFile.write(data)
	txtFile.close()

【python 让繁琐工作自动化】目录
【python 让繁琐工作自动化】第13章 处理 Excel 电子表格 (1)
https://automatetheboringstuff.com/2e/chapter13/

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值