我是靠谱客的博主 快乐电话,最近开发中收集的这篇文章主要介绍openpyxl 写等号(=)开头的数据问题发现 问题分析:初步尝试:分析源码:最终方案:,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
问题发现
今天在使用openpyxl 导出表格时,发现部分数据在导出时不见了(以下为复现测试代码)。
def excel(request):
wb = openpyxl.Workbook()
ws = wb.active
ws.cell(1, 1).value = "= ‘sadfin11f#^%2sdfld http" #给第一行第一列写入值
ws.cell(2, 1).value = "http"
ws.cell(3, 1).value = "=http"
sio = BytesIO()
wb.save(sio) # excel生成的对象保存
sio.seek(0)
response = HttpResponse(content_type="application/octet-stream")
response["Content-Disposition"] = 'attachment; filename={0}'.format("file_name.xlsx")
response["Access-Control-Expose-Headers"] = "Content-Disposition" # 为了使前端获取到Content-Disposition属性
response["Access-Control-Expose-Headers"] = "Content-Disposition"
response.write(sio.getvalue())
return response
问题分析:
检查发现,在Excel单元格中填值,以=(等号)开头的数据将会被当作公式,而公式存在错误,将会被清空或者报错,那么如果我们刚好就有以等号开头的的数据,该如何处理呢?
初步尝试:
最开始直接在Excel中操作,将单元格格式改为文本,再输入值,这样即使有等号,也会当作文本处理。
但是在通过openpyxl实现时发现,单元格格式是改变了,但是里面的值还是识别为公式,导致数据错误。
ws.cell(1, 1).number_format = '@' #将第一行第一列单元格格式改为文本格式
ws.cell(2, 1).number_format = '@'
ws.cell(3, 1).number_format = '@'
ws.cell(1, 1).value = "= ‘sadfin11f#^%2sdfld http"
ws.cell(2, 1).value = "http"
ws.cell(3, 1).value = "=http"
分析源码:
查看openpyxl给单元格赋值的源码,发现其中有一段数据类型判断的代码,源码如下:
t = type(value)
try:
dt = _TYPES[t]
except KeyError:
dt = get_type(t, value)
if dt is None and value is not None:
raise ValueError("Cannot convert {0!r} to Excel".format(value))
if dt:
self.data_type = dt
if dt == 'd':
if not is_date_format(self.number_format):
self.number_format = get_time_format(t)
elif dt == "s":
value = self.check_string(value)
if len(value) > 1 and value.startswith("="):
self.data_type = 'f'
elif value in ERROR_CODES:
self.data_type = 'e'
在最后一段代码可以看到,但数据长度大于1,且以等号开头,该数据类型被定义为f(function),所以即使单元格格式为文本,但数据格式还是为公式,导致数据错误。
最终方案:
搞清楚了问题根源,问题就好解决了,将单元格值的数据类型改为s(string)即可,代码如下。
ws.cell(1, 1).value = "= ‘sadfin11f#^%2sdfld http"
ws.cell(2, 1).value = "http"
ws.cell(3, 1).value = "=http"
ws.cell(1, 1).data_type = "s"
ws.cell(2, 1).data_type = "s"
ws.cell(3, 1).data_type = "s"
ps:笔者为python小萌新,上述如有问题,欢迎批评指正
最后
以上就是快乐电话为你收集整理的openpyxl 写等号(=)开头的数据问题发现 问题分析:初步尝试:分析源码:最终方案:的全部内容,希望文章能够帮你解决openpyxl 写等号(=)开头的数据问题发现 问题分析:初步尝试:分析源码:最终方案:所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复