Python编程快速上手——让繁琐工作自动化(第12章)
12.13.1 乘法表
题目
- 创建程序multiplicationTable.py, 从命令行接受数字N,
- 在一个Excel电子表格中创建N*N的乘法表。
- 例如如果这样执行程序:
py multiplicationTable.py 6
它应该创建一个图12-11所示的电子表格。
分析
- 调用sys.arge()函数获取N
- 行列写入1~N
- 调动sheet.cell(row = i, column = j).value = sheet.cell(row = i, column = 1).value * \
sheet.cell(row = 1, column = j).value - wb.save()
代码
import sys, openpyxl
from openpyxl.styles import Font
Num = int(sys.argv[1])
wb = openpyxl.Workbook()
sheet = wb['Sheet']
#加粗字体
boldFont = Font(bold=True)
#字体+数值
for i in range(1, Num+1):
sheet.cell(row = i+1, column = 1).font = boldFont
sheet.cell(row = i+1, column = 1).value = i
#字体+数值
for j in range(1, Num+1):
sheet.cell(row = 1, column = j+1).font = boldFont
sheet.cell(row = 1, column = j+1).value = j
#目标单元格值 = 最左单元格值 * 最上单元格值
for i in range(2, Num+2):
for j in range(2, Num+2):
sheet.cell(row = i, column = j).value = \
sheet.cell(row = i, column = 1).value * \
sheet.cell(row = 1, column = j).value
wb.save('12311.xlsx')
测试
12.13.2空行插入程序
题目
- 创建一个程序blankRowInserter.py, 它接受两个整数和一个文件名字符串作为命令行参数。
- 我们将第一个整数称为N,第二个整数称为M.程序应该从第N行开始,在电子表格中插入M个空行。
- 例如,如果这样执行程序:
python blankRowInserter.py 3 2 myProduce .xIsx
分析
- sys.argv[1]表示行号,sys.argv[2]表示行数,sys.argv[3]表示打开的源列表
- 打开argv[3]的表,找到对应行
- get_column_letter得到字母+数字的坐标
- 使用sheet.merge.cells()进行合并
代码
import sys, openpyxl
from openpyxl.utils import get_column_letter
#获取行号以及行数
lineRow, numRow = int(sys.argv[1]), int(sys.argv[2])
#打开源工作表,得到最大行、列
wbSour = openpyxl.load_workbook(sys.argv[3])
sheetSour = wbSour['Sheet']
maxRowSour,maxColumnSour = sheetSour.max_row, sheetSour.max_column
#打开目标工作表,使用get_column_letter得到要合并范围
wbAim = openpyxl.Workbook()
sheetAim = wbAim['Sheet']
numFirst = get_column_letter(1) + str(lineRow)
numLast = get_column_letter(maxColumnSour) + str(lineRow+numRow-1)
#行号前照抄,行号+行数来跳行
for i in range(1, maxRowSour + 1):
for j in range(1, maxColumnSour + 1):
if i < lineRow:
sheetAim.cell(row=i, column=j).value = sheetSour.cell(row=i, column=j).value
else:
sheetAim.cell(row=i+numRow, column=j).value = sheetSour.cell(row=i, column=j).value
#将numFirst:+numLast的范围合并
sheetAim.merge_cells(''+numFirst+':'+numLast+'')
wbAim.save('text12311.xlsx')
测试
12.13.3电子表格单元格翻转程序
题目
- 编写一个程序,翻转电子表格中行和列的单元格。
- 例如,第5行第3列的值将出现在第3行第5列(反之亦然)。
- 这应该针对电子表格中所有单元格进行。
分析
- 获取源表的最大列值
- 使用max_column和sheet.columns[i]组合得到每一列的单元值
- 将x,y坐标替换成y,x坐标位
代码
import openpyxl
wbSour = openpyxl.load_workbook('text12311.xlsx')
sheetSour = wbSour['Sheet']
maxColumn = sheetSour.max_column
wbAim = openpyxl.Workbook()
sheetAim = wbAim['Sheet']
#计算核心
for i in range(maxColumn):
#定位坐标,因为j不是int型数据
n = 1
#利用整列读取,获得一列的数值
for j in list(sheetSour.columns)[i]:
#将x,y坐标替换成y,x坐标位
sheetAim.cell(row=i+1, column=n).value = j.value
n += 1
wbAim.save('text212311.xlsx')
测试
12.13.4文本文件到电子表格
题目
- 编写一个程序,读入几个文本文件的内容(可以自己创造这些文本文件),并将这些内容插入一个电子表格,每行写入一行文本。
- 第一个文本文件中的行将写入列A中的单元格,第二个文本文件中的行将写入列B中的单元格,以此类推。
分析
- 创建excel表,两个测试txt文件
- 使用file.readlines()方法得到文本每行的值
- 将读取到的字符串写入excel表格中
代码
import openpyxl
#嫌麻烦就没写遍历整个文件夹来获取txt文件名
#嫌麻烦就没写正则表达式筛选txt文件
listTxt = [open(r'.\121341.txt'), open(r'.\121342.txt')]
wb = openpyxl.Workbook()
sheet = wb['Sheet']
#已知有两个txt
for i in range(2):
#获得当前文本有多少行
readLineTxt = listTxt[i].readlines()
#将行写入excel表格中
for j in range(len(readLineTxt)):
sheet.cell(row=j+1, column=i+1).value = readLineTxt[j]
listTxt[i].close()
wb.save('text12134.xlsx')
测试
12.13.5电子表格到文本文件
题目
- 编写一个程序,执行前一个程序相反的任务。
- 该程序应该打开一个电子表格,将列A中的单元格写入一个文本文件,将列B中的单元格写入另一个文本文件,以此类推。
分析
- 读取excel表格,有多少列就生成多少个txt文件
- 将excel的单元格写入对应列号的txt文件中
- 保存txt文件
代码
import openpyxl
wb = openpyxl.load_workbook('text12134.xlsx')
sheet = wb['Sheet']
maxColumn = sheet.max_column
for i in range(maxColumn):
txtFile = open('.\\'+ str(i+1) +'.txt', 'w')
#利用整列读取,获得一列的数值
for j in list(sheet.columns)[i]:
txtFile.write(str(j.value))
txtFile.close()
测试
拓展
新版的openpyxl有很多函数重写了,在这列出书上和新版的差异:
- wb .get_sheet_by_name(‘Sheet’) => wb [‘Sheet’]
- sheet.get_highest_row() => sheet.max_row
- sheet.get_highest_column() => sheet.max_column
- from openpyxl.cell import get_column_letter, column_index_from_string =>
from openpyxl.utils import get_column_letter, column_index_from_string - for cellObj in sheet.columns[0] => for cellObj in list(sheet.columns)[0]
使用openpyxl来处理excel表格时,要注意:
- 使用sheet.cell(row=i, column=j).value 时要注意row和column的第一行/第一列 是 1,不是
0。 - 使用list(sheet.columns)[n]时,首位是0,不是
1。
- 使用A1格式的赋值:sheet[‘A1’] = ‘hello’
- 使用row=1, column=1格式的赋值:sheet.cell(row=1, column=1).value = ‘hello’