我是靠谱客的博主 拉长火,最近开发中收集的这篇文章主要介绍django2.0+xadmin2.0 导出选项增加导出WORD功能,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

开发中使用的ide是pycharm
如果根据自己需求对一些功能进行修改, 建议使用源码安装xadmin

这篇是我自己在开发中的思路方法, 有些地方比较死板笨拙, 没想到什么好的方法, 如果有好的建议, 请多多指点一下

xadmin自带的导出模块中有xlsx, xls, csv, xml, json 这几种格式, 但是我这里有个需求是需要导出world, 所以需要自己增加此功能, 也就需要对xadmin源码进行调整增加

首先看原测试页面中导出功能:
原始导出中没有	WORD
按照标签名, 全局查找到有xlsx(随便查找哪一个)的地方, 发现有此参数的地方并不多, 找到xadmin源码路径下)的文件xadmin/plugins/export.py有两个地方含有xlsx:

# 第40行
# 根据类名可以判断, 这里是导出栏选项
class ExportMenuPlugin(BaseAdminPlugin):
    list_export = ('xlsx', 'xls', 'csv', 'xml', 'json')
    export_names = {'xlsx': 'Excel 2007', 'xls': 'Excel', 'csv': 'CSV',
                    'xml': 'XML', 'json': 'JSON'}

# 第60行
# 这一个类则是选中导出类型后对应的方法
class ExportPlugin(BaseAdminPlugin):
    export_mimes = {'xlsx': 'application/vnd.ms-excel',
                    'xls': 'application/vnd.ms-excel', 'csv': 'text/csv',
                    'xml': 'application/xhtml+xml', 'json': 'application/json',
                    } 

这两个地方都按照原格式要加上我需要的WORD:

class ExportMenuPlugin(BaseAdminPlugin):
    # fixme 导出栏增加 docx
    list_export = ('xlsx', 'xls', 'csv', 'xml', 'json', 'docx')
    export_names = {'xlsx': 'Excel 2007', 'xls': 'Excel', 'csv': 'CSV',
                    'xml': 'XML', 'json': 'JSON', 'docx': 'WORD'}

class ExportPlugin(BaseAdminPlugin):

    export_mimes = {'xlsx': 'application/vnd.ms-excel',
                    'xls': 'application/vnd.ms-excel', 'csv': 'text/csv',
                    'xml': 'application/xhtml+xml', 'json': 'application/json',
                    'docx': 'application/word'}

保存刷新, 可以看到测试页面导出选项栏上已经有了WORD选项:
导出栏WORD选项
但是现在只是添加了这个选项名, 还并没有实际实现导出功能
继续往类ExportPlugin下面看, 会发现诸如一些get_xlsx_export,get_xml_export等方法,这些就是导出保存xls,xml等格式的具体实现, 所以在类ExportPlugin下面随便一个位置, 按照其他方法类似的格式 (我是在方法get_xlsx_export后面, 第173行) 添加上自己的方法get_docx_export及处理逻辑:
注意:这里方法名不能随便取, 必须要保持get_xxx_export的格式xadmin才能正确执行程序, 这里的xxx就是上面选项栏填写的参数, 我这里填的是docx, 所以方法名是get_docx_export

# xadmin/plugins/export.py
# 处理docx格式文件,需要用到python-docx包, 所以需要pip install python-docx, 并在顶部导入docx
from docx import Document
from docx.oxml.ns import qn
from docx.shared import Inches, Pt

"""
...
"""

class ExportPlugin(BaseAdminPlugin):

    export_mimes = {'xlsx': 'application/vnd.ms-excel',
                    'xls': 'application/vnd.ms-excel', 'csv': 'text/csv',
                    'xml': 'application/xhtml+xml', 'json': 'application/json',
                    'docx': 'application/word'}  # fixme
    
	"""
	....
	"""

	# 第135行
    def get_xls_export(self, context):
        datas = self._get_datas(context)
        output = io.BytesIO()
        export_header = (
            self.request.GET.get('export_xls_header', 'off') == 'on')

        model_name = self.opts.verbose_name
        """
        ...
        """

	# 第173行, 这是我添加的自己的处理docx的方法及逻辑
	def get_docx_export(self, context):
        datas = self._get_datas(context)
        output = io.BytesIO()
        # model_name是仿照上面get_xls_export添加的参数, 但是我自己并没用到
        # model_name = self.opts.verbose_name

        file = Document()
        # 因为我这里对导出内容并没有多少要求, 所以word样式处理的比较简单
        file.styles['Normal'].font.name = u'微软雅黑'
        file.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'微软雅黑')
        file.styles['Normal'].font.size = Pt(10)
        # file.add_paragraph().paragraph_format.space_before = Pt(10)
        head = datas[0]
        # 这里取datas[1:]的原因是datas第一列数据是表头,而我不需要导出,所以直接舍去表头
        for rowx, row in enumerate(datas[1:]):
            # print(rowx, row)
            for colx, value in enumerate(row):
                if head[colx] == '是否违法':
                    is_standard = ''
                    if value:
                        is_standard = '是'
                    else:
                        is_standard = '否'
                    file.add_paragraph('%s: %s' % (head[colx], is_standard))
                elif head[colx] == '支付截图':
                    file.add_paragraph('支付截图: ')
                    imgs = list(JsqBasic.objects.filter(name=row[0]).values('image'))
                    if imgs[0]['image']:
                        file.add_picture('%s/%s' % (settings.MEDIA_ROOT, imgs[0]['image']), width=Inches(1.5))  # 数字越大,图片越大
                elif head[colx] == '访问截图':
                    file.add_paragraph('访问截图: ')
                    imgs = VisitImg.objects.filter(name=row[0]).values('image')
                    if imgs:
                        for img in imgs:
                            file.add_picture('%s/%s' % (settings.MEDIA_ROOT, img['image']), width=Inches(1.25))
                else:
                    file.add_paragraph('%s: %s' % (head[colx], value))
        file.save(output)
        return output.getvalue()

保存刷新测试页面, 选择数据导出word保存成功, 大功告成

最后

以上就是拉长火为你收集整理的django2.0+xadmin2.0 导出选项增加导出WORD功能的全部内容,希望文章能够帮你解决django2.0+xadmin2.0 导出选项增加导出WORD功能所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(67)

评论列表共有 0 条评论

立即
投稿
返回
顶部