概述
开发中使用的ide是pycharm
如果根据自己需求对一些功能进行修改, 建议使用源码安装xadmin
这篇是我自己在开发中的思路方法, 有些地方比较死板笨拙, 没想到什么好的方法, 如果有好的建议, 请多多指点一下
xadmin自带的导出模块中有xlsx
, xls
, csv
, xml
, json
这几种格式, 但是我这里有个需求是需要导出world
, 所以需要自己增加此功能, 也就需要对xadmin
源码进行调整增加
首先看原测试页面中导出功能:
按照标签名, 全局查找到有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
选项:
但是现在只是添加了这个选项名, 还并没有实际实现导出功能
继续往类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功能所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复