如何读取xls的颜色并按照一连一致颜色进行分组?

代码 代码 1680 人阅读 | 0 人回复

<
近来碰上一个需供,需求给物流行业的Excel婚配派收费,详细完好需供较为庞大。此中触及的一个费事面能够拿出去给大家讲讲。
那些物流定单表中,经由过程持续不异的色彩标识属于开票派收,其实不像数据库有零丁的字段标识表记标帜。明天我们的完成目的是读与持续不异的色彩,标识表记标帜统一个分组编号。
经由过程openpyxl读与xlsx格局的色彩比力简朴没有做演示了,读者也能够思索先将xls格局先转换为xlsx格局再读与色彩。不外我明天演示的是利用xlrd库间接读与xls格局的Excel表,从而剖析出色彩,并阐发能否是持续不异的色彩,给一个独一的分组编号。
举个例子,关于以下Excel表:
114015cr2rixooh234rirh.png

那4个色彩持续不异的的单位格,标识表记标帜为统一个编号。
起首我们读与那个Excel表:
  1. import xlrd
  2. # 翻开Excel,为了读与款式疑息需求指定formatting_info=True
  3. book = xlrd.open_workbook("test.xls", formatting_info=True)
  4. # 获得第一张sheet
  5. sheet = book.sheets()[0]
  6. sheet
复造代码
  1. [/code] 起首我们先尝试读与第一个有色彩的单位格:
  2. [code]cell = sheet.cell(2, 1)
  3. print(cell.value, cell.xf_index)
复造代码
  1. KSTD152 77
复造代码
曾经胜利读与到详细的值战对应的款式索引。
**那末假如按照索引获得色彩值呢?**这时候需求利用齐局色彩界说表:
  1. colour_index = book.xf_list[cell.xf_index].background.pattern_colour_index
  2. book.colour_map[colour_index]
复造代码
  1. (255, 102, 0)
复造代码
将以上历程启拆起去,再测试一下读与另外一个开票的色彩:
  1. def get_cell_color(cell):
  2.     colour_index = book.xf_list[cell.xf_index].background.pattern_colour_index
  3.     return book.colour_map[colour_index]
  4. get_cell_color(sheet.cell(8, 1))
复造代码
  1. (204, 204, 255)
复造代码
那阐明我们曾经能够提掏出指订单元格的色彩值了。
**怎样批量读与数据?**利用get_rows天生器最简朴:
  1. import pandas as pd
  2. rows = sheet.get_rows()
  3. header = [cell.value for cell in next(rows)]
  4. data = []
  5. for row in rows:
  6.     data.append([cell.value for cell in row])
  7. df = pd.DataFrame(data, columns=header)
  8. df.head(20)
复造代码
114015ikqzovzup0n64bod.png

基于以上代码,上面我们批量读与全部Excel的数据,并按照色彩值付与一个开票编号:
  1. import pandas as pd
  2. rows = sheet.get_rows()
  3. header = [cell.value for cell in next(rows)]
  4. header.append("开票编号")
  5. data = []
  6. last_color = None
  7. num = 0
  8. for row in rows:
  9.     t = [cell.value for cell in row]
  10.     color = get_cell_color(row[1])
  11.     if color and color != (255, 255, 255):
  12.         if color != last_color:
  13.             num += 1
  14.         t.append(num)
  15.     else:
  16.         t.append(pd.NA)
  17.     last_color = color
  18.     data.append(t)
  19. df = pd.DataFrame(data, columns=header)
  20. df.head(20)
复造代码
能够看到曾经准确的给持续不异的色彩挨上了不异的编号:
114016kkgsk77eboo7xkzw.png

如许我们便处理了那个成绩。完好代码以下:
  1. import pandas as pd
  2. import xlrd
  3. def get_cell_color(cell):
  4.     colour_index = book.xf_list[cell.xf_index].background.pattern_colour_index
  5.     return book.colour_map[colour_index]
  6. # 翻开Excel,为了读与款式疑息需求指定formatting_info=True
  7. book = xlrd.open_workbook("test.xls", formatting_info=True)
  8. # 获得第一张sheet
  9. sheet = book.sheets()[0]
  10. rows = sheet.get_rows()
  11. header = [cell.value for cell in next(rows)]
  12. header.append("开票编号")
  13. data = []
  14. last_color = None
  15. num = 0
  16. for row in rows:
  17.     t = [cell.value for cell in row]
  18.     color = get_cell_color(row[1])
  19.     if color and color != (255, 255, 255):
  20.         if color != last_color:
  21.             num += 1
  22.         t.append(num)
  23.     else:
  24.         t.append(pd.NA)
  25.     last_color = color
  26.     data.append(t)
  27. df = pd.DataFrame(data, columns=header)
  28. df
复造代码
年夜天然的搬运工  滥觞https://blog.csdn.net/as604049322/article/details/120027068
免责声明:假如进犯了您的权益,请联络站少,我们会实时删除侵权内乱容,感谢协作!
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,按照目前互联网开放的原则,我们将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话,请您发送邮箱:Cdnjson@163.com提供相关证明,我们将积极配合您!
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。
回复 关闭延时

使用道具 举报

 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则