如何在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
相关产品推荐
相关产品推荐

