Python编程快速上手——让繁琐工作自动化第十二章测试题

Python编程快速上手——让繁琐工作自动化(第12章)

12.13.1 乘法表

题目

  • 创建程序multiplicationTable.py, 从命令行接受数字N,
  • 在一个Excel电子表格中创建N*N的乘法表。
  • 例如如果这样执行程序:

py multiplicationTable.py 6


它应该创建一个图12-11所示的电子表格。

Python编程快速上手——让繁琐工作自动化第十二章测试题_第1张图片

图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')

测试

Python编程快速上手——让繁琐工作自动化第十二章测试题_第2张图片

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

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')

测试

Python编程快速上手——让繁琐工作自动化第十二章测试题_第3张图片

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

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')

测试

Python编程快速上手——让繁琐工作自动化第十二章测试题_第4张图片

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

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')

测试

Python编程快速上手——让繁琐工作自动化第十二章测试题_第5张图片

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

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()

测试

Python编程快速上手——让繁琐工作自动化第十二章测试题_第6张图片

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

拓展

新版的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’

你可能感兴趣的:(python,python,excel)