使用 Python 处理 Excel

上周五晚,看时间已经快十点了,我打算整理整理回寝室。突然有个学姐来5401,问这里几点关门。我一边整理书包一边和她说,你可以等天亮回去,反正没人管。她突然说,马上就要毕业了,还有和数学系一起的开放实验没有结题,能不能陪她通宵,顺便教她用一下 Excel,她需要清洗一下数据。作为一个死宅,说实话,学姐这种邀请很难接受。我和她说,你先把文件给我吧,我明天想想办法。第二天她把临海劳动节那几天的共享单车的数据发给了我,然后我们就再也没有联系了,现在回想起来,啊,那真是令人愉快的时光。全剧终。

简单读取

对于 Excel 文件的读取,主要依靠的是 xlrd 这个库。代码示例:
import xlrd

xlsx = xlrd.open_workbook('5.1.xlsx')
table = xlsx.sheet_by_index(0)

time = xlrd.xldate_as_tuple(table.row(1)[2].value, 1)

print(time)

简单写入

对于 Excel 文件的写入,主要依靠的是 xlwt 这个库。Xlwt 模块有一个bug:所用样式过多的话,之后的数据将使用不了样式。因此除非必要,更推荐使用xlsxwriter。代码示例:
import xlwt

new_workbook = xlwt.Workbook()
worksheet = new_workbook.add_sheet('Sheet1')
worksheet.write(0, 0, 'header!')

new_workbook.save('test.xls')

实战:将表A的内容写入表B

这里主要使用的是一种循环读取写入的方法,这种方法可以用来过滤数据,比较实用。代码示例:
import xlrd,xlsxwriter

xlsx = xlrd.open_workbook('5.1.xlsx')
new_workbook = xlsxwriter.Workbook('output.xlsx')
worksheet = new_workbook.add_worksheet()
table = xlsx.sheet_by_index(0)

for i in range(0,table.nrows):
    for j in range(0,table.ncols): 
        print(table.cell_value(i, j))
        worksheet.write(i, j, table.cell_value(i, j))

new_workbook.close()

为表格添加样式

为表格添加样式主要使用的是 Xlutils 这个库,具体操作可以查看官方文档,这里举一个最简单的范例。
from xlutils.copy import copy
import xlrd
import xlwt

tem_excel = xlrd.open_workbook('D:/source.xls', formatting_info=True)
tem_sheet = tem_excel.sheet_by_index(0)

new_excel = copy(tem_excel)
new_sheet = new_excel.get_sheet(0)

style = xlwt.XFStyle()

font = xlwt.Font()
font.name = '微软雅黑'
font.bold = True
font.height = 360
style.font = font

borders = xlwt.Borders()
borders.top = xlwt.Borders.THIN
borders.bottom = xlwt.Borders.THIN
borders.left = xlwt.Borders.THIN
borders.right = xlwt.Borders.THIN
style.borders = borders

alignment = xlwt.Alignment()
alignment.horz = xlwt.Alignment.HORZ_CENTER
alignment.vert = xlwt.Alignment.VERT_CENTER
style.alignment = alignment

new_sheet.write(2, 1, 12, style)
new_sheet.write(3, 1, 18, style)
new_sheet.write(4, 1, 19, style)
new_sheet.write(5, 1, 15, style)

new_excel.save('D:/source.xls')

参考资料

评论