可实现"导入导出Excel"的Django小应用

####前言

小编实现了一个“可实现导入导出Excel的Django小应用”。这篇文档是学习记录,请亲们帮我指正!

小应用的GitHub网址如下:
https://github.com/chenergy1991/P_QQ_Management

####文章主要结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1 功能简介
2 开发环境搭建
3 开发要点
3.1 建立项目
3.2 建立应用
3.3 处理模型层
3.3.1 配置项目INSTALLED_APPS
3.3.2 模型定义
3.3.3 生成数据移植文件
3.3.4 移植到数据库
3.4 使用管理界面
3.5 添加Excel导入功能
3.6 添加Excel导出功能
3.7 在其他电脑使用该Django小应用
4 小总结
5 一些参考资料

####1.功能简介

可实现"导入导出Excel"的Django小应用(以下简称“小应用”)具有如下功能点:

  1. 可对装有QQ用户信息的Excel进行使用Python脚本导入;
  2. 可对QQ用户信息进行人工录入;
  3. 可对QQ用户信息库进行数据库操作;
  4. 可对装有QQ用户信息的Excel进行程序导出

该版本的主要工作流如图所示。

####2.开发环境搭建

我选用的开发环境如下:

1
2
3
操作系统:Windows Server 2008 R2 Datacenter
Python版本:Python 2.7.13
IDE:JetBrains PyCharm 2018.3.1

在进行开发环境搭建时,主要要进行以下两个步骤:

  1. 安装Python环境
  2. 安装PyCharm

####3.开发要点

本节的主要内容为:

  1. 3.1-3.4小节介绍为“小应用”加入“QQ用户信息”的管理模块,使得用户可以运用Django框架的自带管理界面对“QQ用户信息”进行“增删改查”
  2. 3.5小节介绍为“小应用”加入”导入Excel功能”,使得用户可以将“满足格式要求的,包含QQ用户信息的Excel”导入“QQ用户信息库”;
  3. 3.6小节介绍为“小应用”加入”导出Excel功能”,使得用户可以运用Django框架的自带管理界面对QQ用户信息进行“Excel(CSV)导出”。

#####3.1建立项目

在PyCharm的File/New Project新建Django项目,如图所示。

比如我建了一个名为P_QQ_Management的项目。

#####3.2建立应用

每个Django项目可以包含多个Django应用。为了建立应用,可以使用PyCharm的Tools/Run manage.py Task...,如图所示。

比如说,我们想要创建一个名为QQUser的应用,在这个终端执行命令startapp QQUser,如图所示。

我们可以发现一个名为QQUser的应用在根目录生成了。

#####3.3处理模型层

设计模型可分为以下4个步骤:

  1. 配置项目INSTALLED_APPS
  2. 模型定义
  3. 生成数据移植文件
  4. 移植到数据库

######3.3.1 配置项目INSTALLED_APPS

要在P_QQ_Management项目中的setting.py中告诉Django需要安装应用app的模型,方法是打开
P_QQ_Management/settings.py文件,找到其中的INSTALLED_APPS数组,在其中添加应用的名称QQUser,如图所示。

######3.3.2 模型定义

打开P_QQ_Management/QQUser/models.py文件,在其中新建一个模型类QQUser用来定义“QQ用户信息”,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models
USER_TYPE_CHOICE = (
('黑名单', '黑名单'),
('白名单', '白名单'),
('未归档', '未归档'),
)

class QQUser(models.Model):
QQ = models.CharField("QQ号", max_length=15)
NickName = models.CharField("QQ昵称", max_length=30)
UserType = models.CharField("用户类型", choices=USER_TYPE_CHOICE, default=USER_TYPE_CHOICE[2], max_length=50)

class Meta:
verbose_name = u'QQ管理表'
verbose_name_plural = u"QQ管理表"

用户的模型对应着这么一张Excel表,如图所示。

######3.3.3 生成数据移植文件

为了生成数据库移植文件,使用PyCharm的Tools/Run manage.py Task...,接着运行命令makemigrations,如图所示。

######3.3.4 移植到数据库

在模型的修改过程中可以随时调用makemigrations生成中间移植文件。而当需要使移植文件生效、生成真实的数据库schema时,则需要调用manage.py的migrate命令是修改同步到数据库中。为此,使用PyCharm的Tools/Run manage.py Task...,接着运行命令migrate,如图所示。

此时,我们可以发现Django已经依据QQUser/models.py里定义的模型帮我们建好了数据表。

在模型设计好后,可对之进行数据库的“增删改查”操作,而使用Django的管理界面实现这一目标将会很便捷。

#####3.4使用管理界面

Django管理界面是一个通过简单配置就可以实现数据模型后台的Web控制台。管理界面通常给系统管理员使用,以完成元数据的输入、删除、查询等工作。

首先需要将管理界面需要管理的模型类添加到P_QQ_Management/QQUser/admin.py文件中,代码如下:

1
2
3
4
5
6
7
8
9
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.contrib import admin
from .models import QQUser

class QQUserExcelToolAdmin(admin.ModelAdmin):
list_display = ('QQ','NickName','UserType')
search_fields = ('QQ','NickName','UserType')
admin.site.register(QQUser, QQUserExcelToolAdmin)

在第一次使用管理员界面之前,需要通过manage.py工具的createsuperuser命令建立管理员用户,在命令运行的过程中按照提示输入管理员的用户名、邮箱地址、密码。如图所示。

此时,我们可以启动Django网站,并访问默认的管理员界面,如图所示。

接着,我们可以借由该管理后台对数据库进行增删改查了,如图所示。

为小程序加入“QQ用户信息”的管理模块的部分介绍完毕。接下来将介绍如何为小程序添加Excel信息导入功能。

#####3.5 添加Excel导入功能

为了将Excel里的QQ用户信息导入数据库,编写如下python脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#-*-coding:utf-8 -*-
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "P_QQ_Management.settings")
import django
django.setup()

from QQUser.models import QQUser
import xlrd

def import_qq_excel():
try:
# 数据源:test-file.xls
data = xlrd.open_workbook("test-file.xls")
# 第一章工作表
table = data.sheets()[0]
nrows = table.nrows
print("开始将QQ信息导入数据库!")
for i in range(1, nrows):
item = table.row_values(i)
# QQ号:位于工作表第1列
QQ = str(int(item[0]))
print(QQ)
# 昵称:位于工作表第2列
NickName = item[1]
# 用户类别::位于工作表第3列
UserType = item[2]
# 创建QQUser对象
qqUser = QQUser(QQ = QQ, NickName = NickName, UserType = UserType)
# 将QQUser对象保存到数据库中
qqUser.save()
print("QQ信息导入成功")
except Exception as e:
print(str(e))

if __name__ == '__main__':
import_qq_excel()

在PyCharm执行这段脚本时,(使用鼠标右键点击代码编辑区,在弹出的菜单中点击Run 'import_qq_excel'),如图所示。

系统会提示No module named xlrd,缺少“xlrd”这个模块。

为了运行这段脚本,可以使用pip命令安装xlrd这个模块,如图所示。

继续在PyCharm中执行这段脚本时,即可将Excel导入数据库,如图所示。

在Django的管理平台中可以发现,Excel被存入数据库中了,如图所示。

#####3.6 添加Excel导出功能

为了使得用户可以对“QQ用户信息”进行“Excel(CSV)导出”,可以仿造博客《Django admin后台导出Excel表格》进行编码和配置,所实现出的效果如图所示。

我的做法如下:

(1)编写csvutil.py,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# -*- coding: utf-8 -*-
import csv, codecs
from django.http import HttpResponse
import sys
reload(sys)
sys.setdefaultencoding('utf8')

def export_as_csv_action(description='Export selected objects as CSV file', fields=None, exclude = None, header = True):
def export_as_csv(modeladmin, request, queryset):
opts = modeladmin.model._meta
if not fields:
field_names = [field for field in opts]
else:
field_names = fields

response = HttpResponse(content_type='text/csv')
response.write(codecs.BOM_UTF8)
response['Content-Disposition'] = 'attachment; filename={}.csv'.format(opts.verbose_name.encode('utf-8'))
writer = csv.writer(response)
if header:
cn_field_names = ['QQ', '昵称', '用户类别']

writer.writerow(cn_field_names)
for obj in queryset:
#row = [getattr(obj, field)() if callable(getattr(obj, field)) else getattr(obj, field) for field in field_names]
#新增处理功能,比如处理时间的显示格式
row = []
for field in field_names:
value = getattr(obj, field).encode("utf8")
# if (field == 'publishing_time'):
# value = str(value)
# if isinstance(value, datetime.datetime):
# value = value.strftime('%y-%m-%d')
row.append(value)
writer.writerow(row)
return response
export_as_csv.short_description = description
return export_as_csv

(2)在admin.py中导入QQUser.csvutil的函数export_as_csv_action,修改后的admin.py的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.contrib import admin
from .models import QQUser
# 导入函数export_as_csv_action
from QQUser.csvutil import export_as_csv_action


class QQUserExcelToolAdmin(admin.ModelAdmin):
list_display = ('QQ','NickName','UserType')
search_fields = ('QQ','NickName','UserType')
# 添加函数export_as_csv_action,自定义action
actions = [export_as_csv_action('导出表格',fields=['QQ', 'NickName', 'UserType'])]
# 注册后台显示相应model信息:
admin.site.register(QQUser, QQUserExcelToolAdmin)

注:如果遇到“Django导出excel中文乱码解决方案”的问题,可以参照博客《Django导出excel中文乱码解决方案》。

#####3.7 在其他电脑使用该Django小应用

为了在其他电脑使用该Django小应用,可以采用以下方式:

(1)将当前电脑下的Django小应用进行打包,生成P_QQ_Management.zip,如图所示。

(2)到目标电脑解压“P_QQ_Management.zip”,如图所示。

(3)使用PyCharm的File/Open打开该工程,如图所示。

(4)使用PyCharm的“File/Settings…”为该工程设置“Project Interpreter”,如图所示。

(5)使用PyCharm的Terminal如下执行脚本:

1
D:\P_QQ_Management>python manage.py migrate

执行结果如图所示。

注:在执行这个命令的时候,可能会遇到“NameError: name ‘reload’ is not defined 问题”,此时可以参阅博客:https://blog.csdn.net/github_35160620/article/details/52206868。

(6)在PyCharm中启动P_QQ_Management项目,如图所示。

####4.小总结

  • “Python”(中文翻译“蟒蛇”)名副其实,在处理一些小问题时,显得“简单粗暴”;
  • “Django”的ORM(Object Relational Mapping,对象关系映射)做得比较高效;
  • Django默认使用的数据库为“SQLite”,对于小型工程,可以直接使用之,省去部分环境配置。我们也可以为Django项目应用“MySQL”数据库,参考链接已放在文末的“一些参考资料”。

####5.一些参考资料