07-04 xlutils的使用 - 图1


导语

xlrd和xlwt模块主要是针对excel表格的读取和写入,但是一些操作和处理数据的操作还是需要根据xlutils这个模块来实现。

1、拷贝原文件

  1. import xlrd
  2. from xlutils.copy import copy
  3. workbook = xlrd.open_workbook('test.xlsx') # 打开工作薄
  4. new_workbook = copy(workbook) # 将获取的xlrd文件对象,拷贝为xlwt对象
  5. new_workbook.save('new_test.xlsx') # 保存工作薄

2、拷贝前获取原工作薄的信息

  1. workbook = xlrd.open_workbook('test.xlsx') # 打开工作簿
  2. sheets = workbook.sheet_names() # 获取工作簿中的所有工作表名字,形成列表元素
  3. worksheet = workbook.sheet_by_name(sheets[0]) # 通过sheets[0]工作表名称获取工作簿中所有工作表中的的第一个工作表
  4. rows_old = worksheet.nrows # 获取第一个工作表中已存在的数据的行数
  5. print(sheets, sheets[0], worksheet, worksheet.nrows)

3、拷贝后获取新工作薄的信息

  1. workbook = xlrd.open_workbook('test.xlsx') # 打开工作簿
  2. new_workbook = copy(workbook) # 将xlrd对象拷贝转化为xlwt对象
  3. new_worksheet = new_workbook.get_sheet(0) # 获取转化后工作簿中的第一个工作表对象
  4. print(new_worksheet, new_workbook, new_worksheet.name) # 有时间整理下工作表对象的方法,工作表可以.name

4、拷贝后直接修改文件内容

  1. # 打开想要更改的excel文件
  2. old_excel = xlrd.open_workbook('test.xlsx', formatting_info=True)
  3. # 将操作文件对象拷贝,变成可写的workbook对象
  4. new_excel = copy(old_excel)
  5. # 获得第一个sheet的对象
  6. ws = new_excel.get_sheet(0)
  7. # 写入数据
  8. ws.write(0, 0, '第一行,第一列')
  9. ws.write(0, 1, '第一行,第二列')
  10. ws.write(0, 2, '第一行,第三列')
  11. ws.write(1, 0, '第二行,第一列')
  12. ws.write(1, 1, '第二行,第二列')
  13. ws.write(1, 2, '第二行,第三列')
  14. # 另存为excel文件,并将文件命名,可以重新命名,应该也可以覆盖掉
  15. new_excel.save('new_test_1.xlsx')

07-04 xlutils的使用 - 图2

5、获取所有单元格索引坐标

  1. workbook = xlrd.open_workbook('test.xlsx') # 打开工作簿
  2. Data_sheet = workbook.sheets()[0]
  3. row1 = Data_sheet.row_values(0) # 取出第一行
  4. dic_col_s = {str(i): row1[i] for i in
  5. range(0, len(row1))} # 将第一行的每个元素加个序数标记,标记列表索引,让列表索引和标题对应,由标题则可以从字典获取列号,即列表索引+1,这里需要的是索引
  6. col2 = Data_sheet.col_values(0) # 取出第一列,
  7. dic_row_s = {str(i): col2[i] for i in
  8. range(0, len(col2))} # 将第一列的每个元素加个序数标记,标记为第一列的列表索引。让名字和列表索引对应,就可以在字典中由名字得行号,即列表索引+1。这里需要的是这个索引
  9. mtitle = "gender" # 需要修改哪个标题
  10. mname = "tank" # 需要修改哪个人的
  11. rindex = "".join([i for i in dic_row_s if dic_row_s[i] == mname]) # 获取要修改的标题所在行的索引
  12. cindex = "".join([i for i in dic_col_s if dic_col_s[i] == mtitle]) # 获取要修改的那个人所在的列索引
  13. print(f"rindex:{rindex},cindex:{cindex}")
  14. ---------------------------------执行结果-------------------------------------
  15. {'0': 'name', '1': 'class', '2': 'cid', '3': 'gender'}
  16. {'0': 'name', '1': 'sean', '2': 'tank', '3': 'jason'}
  17. rindex:2,cindex:3

6、修改单元格内元素

  1. rindex = list(rindex)
  2. rindex = "".join(rindex)
  3. rindex = int(rindex)
  4. cindex = list(cindex)
  5. cindex = "".join(cindex)
  6. cindex = int(cindex)
  7. # 打开想要更改的excel文件
  8. old_excel = xlrd.open_workbook('test.xlsx', formatting_info=True)
  9. # 将操作文件对象拷贝,变成可写的workbook对象
  10. new_excel = copy(old_excel)
  11. # 获得第一个sheet的对象
  12. ws = new_excel.get_sheet(0)
  13. # 写入数据
  14. ws.write(rindex, cindex, 'dsb') # 修改第3行第4列
  15. # 另存为excel文件,并将文件命名,可以重新命名,应该也可以覆盖掉
  16. new_excel.save('new_test_2.xlsx')

7、(改)函数:读取单元格索引,修改单元格内元素

  1. fpath = 'test.xlsx'
  2. mname = "sean"
  3. mtitle = "hobby"
  4. modifycontent = "read"
  5. def recindex(path, mname, mtitle):
  6. '''
  7. 定位单元格,返回单元格行列索引供modify_cell函数使用
  8. :param path: Excel文件路径
  9. :param mname: 要修改的名字
  10. :param mtitile: 要修改的标题
  11. :return: 单元格的行列索引号。rindex:行,cindex:列索引
  12. '''
  13. workbook = xlrd.open_workbook(path)
  14. Data_sheet = workbook.sheets()[0]
  15. row1 = Data_sheet.row_values(0)
  16. dic_col_s = {str(i): row1[i] for i in range(0, len(row1))}
  17. col2 = Data_sheet.col_values(0)
  18. dic_row_s = {str(i): col2[i] for i in range(0, len(col2))}
  19. rindex = "".join([i for i in dic_row_s if dic_row_s[i] == mname])
  20. cindex = "".join([i for i in dic_col_s if dic_col_s[i] == mtitle])
  21. rindex = int("".join(list(rindex)))
  22. cindex = int("".join(list(cindex)))
  23. return rindex, cindex
  24. def modify_cell(path, rindex, cindex, modifycontent):
  25. """
  26. 修改文件指定单元格内容,由recindex函数返回值获取rindex和cindex参数
  27. :param path: 要修改的Excel文件路径
  28. :param rindex:recindex返回值元组第一个元素,行索引
  29. :param cindex:recindex返回值元组第二个元素,列索引
  30. :param modifycontent: 要修改的单元格新的内容
  31. :return:
  32. """
  33. old_excel = xlrd.open_workbook(path, formatting_info=True)
  34. new_excel = copy(old_excel)
  35. ws = new_excel.get_sheet(0)
  36. ws.write(rindex, cindex, modifycontent)
  37. new_excel.save(path)
  38. val = recindex(fpath, mname, mtitle)
  39. modify_cell(fpath, val[0], val[1], modifycontent)

8、(增)函数:添加多条数据

  1. fpath = 'test.xlsx'
  2. valueli = [["oscar", "4", "4", "male", "搓衣板"],
  3. ["kiven", "5", "5", "male", "腰子汤"], ]
  4. def write_excel_xls_append(path, value):
  5. index = len(value) # 获取需要写入数据的行数
  6. workbook = xlrd.open_workbook(path) # 打开工作簿
  7. sheets = workbook.sheet_names() # 获取工作簿中的所有表格
  8. worksheet = workbook.sheet_by_name(sheets[0]) # 获取工作簿中所有表格中的的第一个表格
  9. rows_old = worksheet.nrows # 获取表格中已存在的数据的行数
  10. new_workbook = copy(workbook) # 将xlrd对象拷贝转化为xlwt对象
  11. new_worksheet = new_workbook.get_sheet(0) # 获取转化后工作簿中的第一个表格
  12. for i in range(0, index):
  13. for j in range(0, len(value[i])):
  14. new_worksheet.write(i + rows_old, j, value[i][j]) # 追加写入数据,注意是从i+rows_old行开始写入
  15. new_workbook.save(path) # 保存工作簿
  16. print("xls/xlsx格式表格【追加】写入数据成功!")
  17. write_excel_xls_append(fpath, valueli)

07-04 xlutils的使用 - 图3

9、(查1)函数:以制表符分割,显示每行数据

  1. fpath = "test.xlsx"
  2. def read_excel_xls(path):
  3. workbook = xlrd.open_workbook(path) # 打开工作簿
  4. sheets = workbook.sheet_names() # 获取工作簿中的所有表格
  5. worksheet = workbook.sheet_by_name(sheets[0]) # 获取工作簿中所有表格中的的第一个表格
  6. for i in range(0, worksheet.nrows):
  7. for j in range(0, worksheet.ncols):
  8. print(worksheet.cell_value(i, j), "\t", end="") # 逐行逐列读取数据#分隔符加空格实现对其点的
  9. print()
  10. read_excel_xls(fpath)

07-04 xlutils的使用 - 图4

10、(查2)函数:

  1. fpath = "test.xlsx"
  2. def read_excel_xls(path):
  3. """
  4. 打印所有行的内容,每行内容以列表形式展示
  5. :param path: 要查看的Excel文件路径
  6. """
  7. workbook = xlrd.open_workbook(path) # 打开工作簿
  8. sheets = workbook.sheet_names() # 获取工作簿中的所有表格
  9. worksheet = workbook.sheet_by_name(sheets[0]) # 获取工作簿中所有表格中的的第一个表格
  10. rows = worksheet.row_values(0)
  11. for i in range(0, worksheet.nrows):
  12. rows = worksheet.row_values(i) # 逐行逐列读取数据#分隔符加空格实现对其点的
  13. print(rows)
  14. read_excel_xls(fpath)

07-04 xlutils的使用 - 图5