python - 在xlsxwriter中定义系列时出现TypeError 'buffer size mismatch'错误

标签 python excel xlsxwriter

我正在尝试使用 xlsxwriter 和 pandas 数据以编程方式在 xlsx 文件中创建图表。 写入单元格非常成功,但是当我尝试为散点图定义数据系列时,我收到类型错误“缓冲区大小不匹配”,我相当确定我定义的范围是可以接受的。

示例代码:

headers = DataFrame([[-0.398,2],[-0.201,2],[-0.001,20]],columns=['Bias','Sensitivity'])
dfs = [DataFrame([[3998.28253,2.056],[3997.31816,1.978],[3996.35379,1.932],[3995.38942,1.746],[3994.42504,1.478]]),
       DataFrame([[3998.28253,2.056],[3997.31816,1.978],[3996.35379,1.932],[3995.38942,1.746],[3994.42504,1.478]]),
       DataFrame([[3998.28253,2.056],[3997.31816,1.978],[3996.35379,1.932],[3995.38942,1.746],[3994.42504,1.478]])]
       # Repeated DataFrames here for convenience

outxls = os.path.join(os.path.dirname(toplevelname),p+'.xlsx')

workbook = xlsxwriter.Workbook(outxls)
worksheet = workbook.add_worksheet('Sheet1')

worksheet.write(0, 0, 'Bias')
worksheet.write(1, 0, 'Sensitivity')

chart = workbook.add_chart({'type': 'scatter'})
for i, h in enumerate(headers.index):
    worksheet.write_number(0, 2*i+2, headers['Bias'][h], )
    worksheet.write_number(1, 2*i+2, headers['Sensitivity'][h])
    for r, row in dfs[h].iterrows():
        for c, col in enumerate(row):
            worksheet.write_number(r+2, 2*i+c+1, row[c])

    l = len(dfs[h])
    chart.add_series({
            'name': headers['Bias'][h],
            'categories': ['Sheet1', 3, 1, l, 1],
            'values': ['Sheet1', 3, 2, l, 2],
        })
worksheet.insert_chart('B3', chart)

workbook.close()

完整错误信息:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-5-56283fee8773> in <module>()
     52                 'name': headers['Bias'][h],
     53                 'categories': ['Sheet1', 3, 1, l, 1],
---> 54                 'values': ['Sheet1', 3, 2, l, 2],
     55             })
     56     worksheet.insert_chart('B3', chart)

/Users/megablanc/Library/Python/2.7/lib/python/site-packages/xlsxwriter/chart.pyc in add_series(self, options)
    134         # Switch name and name_formula parameters if required.
    135         name, name_formula = self._process_names(options.get('name'),
--> 136                                                  options.get('name_formula'))
    137 
    138         # Get an id for the data equivalent to the range formula.

/Users/megablanc/Library/Python/2.7/lib/python/site-packages/xlsxwriter/chart.pyc in _process_names(self, name, name_formula)
    788                 name_formula = quote_sheetname(name[0]) + '!' + cell
    789                 name = ''
--> 790             elif re.match(r'^=?[^!]+!\$?[A-Z]+\$?[0-9]+', name):
    791                 # Name looks like a formula, use it to set name_formula.
    792                 name_formula = name

/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.pyc in match(pattern, string, flags)
    135     """Try to apply the pattern at the start of the string, returning
    136     a match object, or None if no match was found."""
--> 137     return _compile(pattern, flags).match(string)
    138 
    139 def search(pattern, string, flags=0):

TypeError: buffer size mismatch

最佳答案

问题是 nameheaders['Bias'][h] 不是字符串,在传递给函数时引发 TypeError。

由于数据类型是 numpy.float64 这会引发不寻常的 buffer size mismatch 错误,因此该错误比应有的更令人困惑。

函数参数分布在多行的事实也使问题看起来像是 values 参数而不是 name 参数。

关于python - 在xlsxwriter中定义系列时出现TypeError 'buffer size mismatch'错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30386478/

相关文章:

python - 提取大字符串的部分

vba - 如何创建公式以对动态范围求和?我就是无法做出正确的语法

VBA UDF 使用动态数组查找多列条件匹配

python-3.x - 如何在fastapi中从内存中返回xlsx文件?

python - 在 Python 中使用 MultiIndex 和 to_excel 时如何使 index=False 或删除第一列

python - 排序字典并创建一个字符串

python - 打印待办事项 : comments from a text file in Python

excel - 将不同工作簿中的数据复制并粘贴到多个单元格

python - 如何在 xlsxwriter 中将值放置在堆积条形图之外

python - 如何用另一个numpy数组填充numpy数组