excel 从非空的行获取值XLSXWRITER(python)

osh3o9ms  于 2023-05-30  发布在  Python
关注(0)|答案(1)|浏览(189)

我想合并第2列(带有“description”)和第1列(带有“name”):要合并的行数相同,但当使用merge_range时,我在列2中得到了空值。
这是我的代码。

my_list = [
            {'field1': [
                {'name': 'value1', 'description': ""
                 },
                {'name': 'value1', 'description': "this is descr..."
                 },
                {'name': 'value1', 'description': ""
                 },

            ]
             },
        ]
        row = 206
        for record in my_list:
            row_mem = row
            for rec in record['field1']:
                sheet.write(row, 2, rec['description'])
                row += 1
            sheet.merge_range(row_mem, 1, row - 1, 1, rec['name'])

结果:

sheet.write(row, 2, rec['description'])替换为

sheet.merge_range(row_mem, 2, row - 1, 2, rec['description'])

我得到了这个结果:

但我想这样展示:

如何合并列2并在合并时获得非空值。
有什么需要帮忙的吗?谢谢。

o2rvlv0m

o2rvlv0m1#

代码示例中的缩进无效,我假设row = 206for record in my_list:行应该与my_list=具有相同的缩进,for record ...下面的行保留与该行相同的缩进。
你的代码,因为它是;对于'description'列,要保留的值在第二个单元格中,因此合并的3个单元格是空字符串,字符串值,空字符串。在通常情况下,当合并单元格时,左上角的单元格坐标和值被保留,其他单元格中的任何值都将丢失。* 因此,如果合并这3个单元格,则结果是具有空字符串 * 的单元格。
但是,您的代码不会按原样合并单元格,从说明文本中,这是通过替换

sheet.write(row, 2, rec['description'])

sheet.merge_range(row_mem, 2, row - 1, 2, rec['description'])

因为这意味着你在每个循环中合并描述列,我希望这会给予你一个warning,因为你试图在第一个循环中合并一个单元格,然后在第二个循环中合并两个单元格,空字符串&字符串值。因此,如上所述,单元格将合并,保留左上角的值,这是空字符串
不知道你的最终目标是什么,但我认为最好像'name'单元格一样,把你想要的单元格和值合并在一起。
这个循环可能不是必需的,但是假设列表mylist中有几个字段,那么像这样的东西可能是更好的选择。
为了清楚起见,我在my_list中添加了第二个字段,称为field2,原始字段称为field1。我使用了范围计数来跟踪行。范围在206处开始,并且对于要合并的三行以3为步长。范围的最大值是任意数字。它不需要特定,只要足够大以包含所使用的行,my_list循环将控制循环何时结束。

range(206, 1000, 3)

在第一个循环周期的row is set to 206namedescription被写入合并单元格的基础上的行和设置列1和2。在第二个循环周期row is now 209和下一个字段被写入合并单元格的基础上,行和设置列1和2。
请参见示例屏幕截图。

import xlsxwriter

book = xlsxwriter.Workbook('foo.xlsx')
sheet = book.add_worksheet('Sheet1')

my_list = [
            {'field1': [
                {'name': 'value1', 'description': "this is descr1..."},
            ]},
            {'field2': [
                {'name': 'value2', 'description': "this is descr2..."},
            ]}
]

### Use zip to combine range count with the field data 
for (row, field) in zip(range(206, 1000, 3), my_list):
    for fname, values in field.items():
        sheet.merge_range(row, 1, row+2, 1, values[0]['name'])
        sheet.merge_range(row, 2, row+2, 2, values[0]['description'])

book.close()

给定示例的输出

如果您只有一个字段要添加,那么请删除循环,只使用sheet.merge_range行。

相关问题