我是靠谱客的博主 快乐电话,最近开发中收集的这篇文章主要介绍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 写等号(=)开头的数据问题发现  问题分析:初步尝试:分析源码:最终方案:所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部