You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django import-export导出的XLSX表格底部添加合计行?

给Django import-export导出的XLSX添加total_price合计行

要实现这个需求,你需要自定义XLSX导出类,通过重写方法累计汇总值并在表格末尾插入合计行,具体步骤如下:

1. 自定义Xlsx导出类

继承默认的Xlsx类,在导出过程中累计total_price的总和,最后添加合计行:

from import_export.formats.base_formats import Xlsx
from openpyxl.utils import get_column_letter

class CustomXlsxExport(Xlsx):
    def __init__(self):
        super().__init__()
        self.total_price_sum = 0  # 初始化合计值
        self.total_price_col_idx = None  # 记录total_price列的索引

    def write_header(self, worksheet, fields):
        # 写入表头时,定位total_price列的位置
        super().write_header(worksheet, fields)
        for idx, field in enumerate(fields):
            if field.column_name == 'total_price':
                self.total_price_col_idx = idx
                break

    def write_row(self, worksheet, row, row_idx):
        # 写入数据行时,累计total_price的值
        super().write_row(worksheet, row, row_idx)
        # 跳过表头行(row_idx从0开始,表头为第0行)
        if row_idx > 0 and self.total_price_col_idx is not None:
            price_value = row[self.total_price_col_idx]
            if isinstance(price_value, (int, float)):
                self.total_price_sum += price_value

    def write_data(self, worksheet, dataset, headers):
        # 先写入所有数据行
        super().write_data(worksheet, dataset, headers)
        # 计算合计行的位置(数据总行数 + 1,表头占1行)
        total_row_idx = len(dataset) + 1
        # 在第一列写入"合计"文本
        worksheet.cell(row=total_row_idx + 1, column=1, value="合计")
        # 在total_price列写入汇总值
        if self.total_price_col_idx is not None:
            col_num = self.total_price_col_idx + 1  # openpyxl列索引从1开始
            worksheet.cell(row=total_row_idx + 1, column=col_num, value=self.total_price_sum)
            # 可选:给合计值设置加粗样式
            worksheet.cell(row=total_row_idx + 1, column=col_num).font = worksheet.cell(row=2, column=col_num).font.copy(bold=True)

2. 修改资源类

在你的CERequestResource中指定使用自定义导出类:

from import_export import resources, fields
from .models import CERequest

class CERequestResource(resources.ModelResource):
    related_component__service = fields.Field(attribute='related_component__service')
    related_product__title = fields.Field(attribute='related_product__title')
    related_component__component_name = fields.Field(attribute='related_component__component_name')
    related_component__task_description = fields.Field(attribute='related_component__task_description')
    related_component__position = fields.Field(attribute='related_component__position')
    number_of_units = fields.Field(attribute='number_of_units', column_name='# of Units')
    related_component__margin = fields.Field(attribute='related_component__margin')
    total_price = fields.Field(attribute="total_price")
    
    model = CERequest
    fields = ('id', 'related_component', 'related_product', 'number_of_units', 'total_price', 'margin')
    
    # 指定自定义导出类
    export_class = CustomXlsxExport

注意事项

  • 确保total_price字段导出的值是数字类型,如果是字符串格式,需要在Field中通过widget做类型转换。
  • 代码依赖openpyxl,Django import-export导出XLSX默认已依赖该库,无需额外安装。
  • 若需要调整合计行的样式(比如背景色、字体大小),可在write_data方法中添加更多openpyxl样式配置。

内容的提问来源于stack exchange,提问作者Adrian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 07:24:19