自定义Excel导出功能

例:

def export_data_to_excel(conf, header_only=False, filter_dict=None, plus_sites=False):
    from django.http import HttpResponse
    import xlwt

    date_style = xlwt.XFStyle()
    date_style.num_format_str = 'yyyy-mm-dd'

    def check_conf(c):
        obj = get_class(c)
        for field_name in c["attributes"].keys():
            if not hasattr(obj, field_name):
                print "{} has no attr '{}', please check.".format(c["class_name"], field_name)
                return False
        return True

    def write_head(c, s):
        header = c.get("header", [])
        for h in range(len(header)):
            s.write(0, h, header[h])
        if plus_sites:
            from excel_export_conf import SiteExportConfig
            for site_col, name in SiteExportConfig:
                s.write(0, site_col, name)

    if not check_conf(conf):
        return HttpResponse(STRING_IMPORT_CONFIGURATION_ERROR)

    if not filter_dict:
        filter_dict = {}

    excel = xlwt.Workbook(encoding='utf8')
    sheet = excel.add_sheet(conf.get("sheet_name", "sheet"))
    write_head(conf, sheet)

    if not header_only:
        if type(filter_dict) == django.db.models.query_utils.Q:
            objects = get_class(conf).objects.filter(filter_dict)
        else:
            objects = get_class(conf).objects.filter(**filter_dict)
        len_d = len(objects)
        for i in range(1, len_d+1):
            s_data = objects[i - 1]
            for k, v in conf["attributes"].items():
                field = s_data._meta.get_field(k)
                choices = field.__dict__["choices"]
                if choices:
                    for key, value in choices:
                        if key == s_data.__getattribute__(k):
                            sheet.write(i, v, value)
                elif type(field) == DateField:
                    sheet.write(i, v, s_data.__getattribute__(k), date_style)
                else:
                    sheet.write(i, v, s_data.__getattribute__(k))
            if plus_sites:
                from excel_export_conf import SiteExportConfig
                from Release.models import ReleaseItemWithSite
                for site_col, name in SiteExportConfig:
                    site_value = get_site_choices(name)
                    if site_value:
                        sites = ReleaseItemWithSite.objects.filter(site_name=site_value, product_id=s_data.id)
                        if sites:
                            sheet.write(i, site_col, sites[0].contract_end_date, date_style)

    response = HttpResponse(content_type='application/msexcel')
    response['Content-Disposition'] = 'attachment; filename=%s.xls'%conf.get("excel_name", "excel")
    excel.save(response)
    return response
FinanceBuyAndSoldRecord = {
    "module_name": "Finance.models",
    "class_name": "FinanceBuyAndSoldRecord",
    "excel_name": "投入产出比",
    "sheet_name": "投入产出比",
    "header": ["片单类型",
               "采购合同编号",
               "合作单位(买)",
               "采购片单名称",
               "采购合同金额",
               "集数",
               "单价",
               "授权开始日期",
               "授权截止日期",
               "销售合同编号",
               "合作单位(卖)",
               "销售合同金额",
               "集数",
               "单价",
               "授权开始日期",
               "授权截止日期",
               ],
    "attributes": {
        "type": 0,             # 类型
        "buy_contract_id": 1,           # 采购合同编号
        "buy_company": 2,           # 合作单位(买)
        "name": 3,          # 采购片单名称
        "buy_price": 4,       # 采购合同金额
        "buy_series": 5,  # 集数
        "buy_unit_price": 6,     # 单价
        "buy_authorized_date_start": 7,        # 授权开始日期
        "buy_authorized_date_end": 8,      # 授权截止日期
        "sold_contract_id": 9,       # 销售合同编号
        "sold_company": 10,  # 合作单位(卖)
        "sold_price": 11,          # 销售合同金额
        "sold_series": 12,         # 集数
        "sold_unit_price": 13,         # 单价
        "sold_authorized_date_start": 14,         # 授权开始日期
        "sold_authorized_date_end": 15,         # 授权截止日期
    },
}
# 导出投入产出比
def input_output_export_static(request):
    try:
        params = request.POST if request.method == 'POST' else request.GET
        filters = get_input_output_filters(params)
        return export_data_to_excel(FinanceBuyAndSoldRecord, header_only=False, filter_dict=filters)
    except Exception as e:
        return render(request, 'error.html', locals())

猜你喜欢

转载自blog.csdn.net/qq_42336556/article/details/85259681