最近公司有个新的需求:上传一个excel文件,需要对文件进行检测,把错误的记录标红并且记录错误原因!
1.首先上传文件此时没有对文件内容进行检查。
2.保存,此时对文件内容进行检查,用pandas库读取excel文件,进行遍历把有问题的字段记录到数据库中。
3.下载excel,下载的文件中需要标红字段有问题的记录并且记录错误原因!(需要使用到xlrd、xlwt、xlutils库)
3.1:首先我们拿到上传的excel的二进制数据,然后使用xlrd库对二进制数据进行读取,(因为涉及到excel内容的修改所以需要用到xlwt和xlutils库,因为xlrd只能读取excel不能进行修改),然后使用xlutils对xlrd读取的数据进行copy,后面再就对copy之后的对象进行标红操作即可!
3.2:对excel错误记录字体标红需要用到xlwt库,(xlwt.Font()方法生成一个font对象,然后对font对象进行操作)。
3.3:一切操作完成后需要把修改后数据输出成二进制数据,使用到io.BytesIO()方法。
修改excel标红错误记录伪代码如下:
err_rows = access.get_upload(None, uploadid, channel).sErrorData
f = BytesIO() # create a file-like object
f1 = BytesIO() # 接受更改格式后的数据流
book = xlrd.open_workbook(file_contents=data)
err_dic = {}
err_rows = eval(err_rows) if err_rows else []
# styleBlueBkg = xlwt.easyxf('pattern: pattern solid, fore_colour red;') # 红色
ro = book.sheets()[0] # 读取表单0
wb = copy(book) # 利用xlutils.copy下的copy函数复制
ws = wb.get_sheet(0) # 获取表单0
for i in range(ro.nrows):
if i == 0 or i == 1:
continue
if ro.cell(i, 1).value and ro.cell(i,1).ctype == 3:
value = xlrd.xldate.xldate_as_datetime(ro.cell(i, 1).value, 0).__format__("%Y-%m-%d")
ws.write(i, 1, value)
wb.save(f)
ff = f.getvalue()
for err_row in err_rows:
err_dic.update(err_row)
if len(err_dic) == 0:
return ff
book = xlrd.open_workbook(file_contents=ff) # 读取修改格式后的数据
ro = book.sheets()[0] # 读取表单0
wb = copy(book) # 利用xlutils.copy下的copy函数复制
ws = wb.get_sheet(0) # 获取表单0
font = xlwt.Font()
font.colour_index = 10 # 指定红色字体
style = xlwt.XFStyle()
style.font = font
for key, value in err_dic.items():
for i in range(4):
values = ro.cell(key + 1, i).value
ws.write(key+1, i, values, style)
ws.write(key+1, 4, value, style)
wb.save(f1)
return f1.getvalue()
参考链接:读取excel单元格中返回内容的类型
在excel中输出多种颜色字体
如有不对的地方希望大家多多指教!