xlwt write: неожиданный тип данных - PullRequest
0 голосов
/ 23 октября 2018

У меня снова проблема с записью значений в книге Excel.Я понял, как использовать оба xlrd + xlwt для своих целей, но, поскольку я изменил код для преобразования значений и исключений даты-времени с некодированными строками, он больше не работает.

Traceback (most recent call last):
  File "D:\rs_al\IdeaProjects\ExcelToSQL\PyXLSSQL\XLS_xlutils.py", line 96, in <module>
    Excel.xls_wrk(filename)
  File "D:\rs_al\IdeaProjects\ExcelToSQL\PyXLSSQL\XLS_xlutils.py", line 89, in xls_wrk
    ws.write(row_idx,col_idx, val)
  File "C:\Python\lib\site-packages\xlwt\Worksheet.py", line 1088, in write
    self.row(r).write(c, label, style)
  File "C:\Python\lib\site-packages\xlwt\Row.py", line 254, in write
    raise Exception("Unexpected data type %r" % type(label))
Exception: Unexpected data type <class 'xlrd.sheet.Cell'>

Я проверил все ячейкитипы, есть только строка Unicode типа 1, тип 2 с плавающей запятой и тип 3 с плавающей запятой.Когда я печатаю значения, все в порядке.

Код:

import ftfy
import xlrd
import xlwt
from xlrd import open_workbook




class Excel:
    #convertin to xlsx for working with openpyxl
    def xls_wrk (filename):
        #XLRD
        rb = open_workbook('abbcards.xls')
        rs = rb.sheet_by_index(0)
        rows = rs.nrows
        cols = rs.ncols
        wb = xlwt.Workbook()
        ws = wb.add_sheet('Part1')

        #iterate and prepare format for SQL db tables
        for row_idx in range (0,rows):
            for col_idx in range (0,cols):
                cell= rs.cell(row_idx, col_idx)
                ctp_in = cell.ctype
                cval = cell.value



                #Input string value "whitespace" in empty cells
                if (ctp_in == xlrd.XL_CELL_EMPTY):
                    ctp_in = xlrd.XL_CELL_TEXT
                    cval = " "
                elif (ctp_in == xlrd.XL_CELL_ERROR):
                    ctp_in = xlrd.XL_CELL_TEXT
                    cval=" "

                #Fixing date
                elif (ctp_in == xlrd.XL_CELL_DATE):

                    #Manual fixing negative value
                    if (cval==-693594):
                        ctp_in=xlrd.XL_CELL_DATE
                        cval = rs.cell(row_idx, col_idx-7)
                    else:
                        ctp_in=xlrd.XL_CELL_DATE

                        cval=xlrd.xldate.xldate_as_datetime(cval, rb.datemode)

                #fixing negative values

                elif (ctp_in == xlrd.XL_CELL_NUMBER and cval < 0):
                    cval= 0

                #Fixinig broking UTF-8 as 1252 letters with package ftfy

                elif (ctp_in == xlrd.XL_CELL_TEXT):

                    #Broken UTF-8 that ftfy package can't fix. Manual fix

                    #CarPlate from "abbcardds"
                    if(cval=="Р869СЗ197"):
                        #ctp_in=xlrd.XL_CELL_TEXT
                        cval = "Р869СЗ197"
                    elif (cval=="H613Ð'Y"):
                        #ctp_in=xlrd.XL_CELL_TEXT
                        cval="H613BY" #important. Car plate number is in Latin
                    elif (cval=="Ð'509СÐ'777"):
                        #ctp_in=xlrd.XL_CELL_TEXT
                        cval="В509СВ177"
                    elif (cval=="Ð'674СС199"):
                        #ctp_in=xlrd.XL_CELL_TEXT
                        cval="В674СС199"
                    elif (cval=="T357KО777"):
                        #ctp_in=xlrd.XL_CELL_TEXT
                        cval = "T357KО777"
                    elif (cval =="Ð'010СС199"):
                        #=xlrd.XL_CELL_TEXT
                        cval="В010СС199"
                    elif (cval=="E174СР777"):
                        #ctp_in=xlrd.XL_CELL_TEXT
                        cval = "E174СР777"
                    else:
                        #ctp_in=xlrd.XL_CELL_TEXT
                        cval=ftfy.fix_text(cval)
                #print(cval)

                ws.write(row_idx,col_idx, cval)
          wb.save('text.xls')

1 Ответ

0 голосов
/ 23 октября 2018

Решено

  1. печать (row_idx, col_idx, ячейка, тип (cell.value), cell.ctype) как сказано Torxed

  2. проверьте класс, потому что мой был классом ячейки.Вместо того, чтобы ставить только значение cval = rs.cell(row_idx, col_idx-7), я взял cell ().

...