если значение не в self._dict: TypeError: unhashable тип: 'StyleProxy' в python - PullRequest
0 голосов
/ 07 сентября 2018

Я использую приведенный ниже код для обновления файла excel (.xlsm) и копирования некоторых значений из него в некоторые другие позиции в том же файле. Здесь я использую две функции для копирования и вставки необходимого диапазона ячеек из одной позиции в другой и хотите скопировать ячейки с полным шрифтом и границей

мой код выглядит как

wb=load_workbook('Excel.xlsm',read_only=False,keep_vba=True)
ws=wb['K0 Reg Patch Util']
def copyRange(startCol,startRow,endCol,endRow,sheet):
    rangeSelected=[]
    fontSelected=[]
    borderSelected=[]
    for i in range(startRow,endRow+1,1):
       rowSelected=[]
       font=[]
       border=[]
       for j in range(startCol,endCol+1,1):
           rowSelected.append(sheet.cell(row=i,column=j).value)
           font.append(sheet.cell(row=i,column=j).font)
           border.append(sheet.cell(row=i,column=j).border)
           rangeSelected.append(rowSelected)
           fontSelected.append(font)
           borderSelected.append(border)
           return rangeSelected,fontSelected,borderSelected
def pasteRange(startCol,startRow,endCol,endRow,sheet,copiedData,fontData,borderData):
countRow=0
  for i in range(startRow,endRow+1,1):
      countCol=0
      for j in range(startCol,endCol+1,1):
          sheet.cell(row=i,column=j).value=copiedData[countRow][countCol]
          sheet.cell(row=i,column=j).font=fontData[countRow][countCol]
          sheet.cell(row=i,column=j).value=borderData[countRow][countCol]
          countCol+=1
      countRow+=1
      copiedData=[]
      fontData=[]
      borderData=[]
copiedData,fontData,borderData=copyRange(2,56,4,66,ws)
startC=ws.max_column+1
endC=startC+2
startR=3
endR=13
pasteRange(startC,startR,endC,endR,ws,copiedData,fontData,borderData)
wb.save('Excel.xlsm')

После этого, когда я запускаю программу, я получаю сообщение об ошибке -

Файл "ReadExcel.py", строка 91, в
pasteRange (startC, startR, ENDC, EndR, WS, copiedData, fontData, borderData)
Файл "ReadExcel.py", строка 73, в pasteRange
sheet.cell (строка = я, колонка = J) .font = fontData [countRow] [countCol]
Файл> "/nfs/sc/proj/skx/skx_val356/rsingh/Patch_Proj/Patch_Project_Files/GUI/VGUI/venv/lib/python3.6/site-packages/openpyxl/styles/styleable.py", строка 24, в __set__
setattr (instance._style, self.key, coll.add (value))
Файл "/ nfs / sc / proj / skx / skx_val356 / rsingh / Patch_Proj / Patch_Project_Files /GUI/VGUI/venv/lib/python3.6/site-packages/openpyxl/utils/indexed_list.py", строка 48, в добавлении
self.append (значение)
Файл "/nfs/sc/proj/skx/skx_val356/rsingh/Patch_Proj/Patch_Project_Files/GUI/VGUI/venv/lib/python3.6/site-packages/openpyxl/utils/indexed_list.py", строка 43, в приложении

если значение не в self._dict:
TypeError: unhashable тип: 'StyleProxy'

Может кто-нибудь указать мне, как убрать эту ошибку и какую ошибку я делаю. Я даже добавил хеш-функцию в proxy.py, как было предложено в некотором посте. Пожалуйста, устраните эту ошибку

1 Ответ

0 голосов
/ 10 сентября 2018

Вопрос: как убрать эту ошибку и какую ошибку я делаю

Вы должны copy атрибуты стиля.
Добавьте и замените следующие строки:

from copy import copy
...
font.append(copy(sheet.cell(row=i, column=j).font))
...
border.append(copy(sheet.cell(row=i, column=j).border))

Второй .value=borderData... - это опечатка, это следует читать:

sheet.cell(row=i,column=j).border=borderData[countRow][countCol]

Вероятно, вы получите следующее сообщение об ошибке:

IndexError: индекс списка вне диапазона

Поскольку ваши списки ...Data не имеют того размера, который используется в pasteRange.
Причина, эта строка имеет неправильный отступ:

return rangeSelected, fontSelected, borderSelected

Вы вернетесь после первого цикла в цикле for!


Подумайте о том, чтобы перестроить ваш код на более простой подход. Вместо первого копирования всех данных в список списка , скопируйте direct из cell в cell.

...