由于学校里面经常需要统计各类的学生信息,每次统计的时候都要上交Excel表格,但是面对众多的Excel表格,想要找到某个确切的信息却又不是那么容易,因而当下次需要某些学生信息时,又要再去找班长统计,这无疑找成了很多信息冗余和步骤的繁琐,于是我便想写一个Python脚本把Excel的数据导入到数据库中,方便以后的查找。

由于数据量不是那么大,而且不考虑安全性的话,轻量级的sqlite数据库是个很不错的选择。选择python写脚本的原因是因为python的第三方的操作excel的库比较完善,可以省下很多coding时间。

一个示例的excel表格如下:
Excel表格示例

首先需要考虑的是Excel中有哪些数据,由于并不是所有数据都需要导入的,e.g.图中的序号就不需要导入数据库。

需要导入的excel有如下:

example

脚本如下:

#!/usr/bin/env python
#-*- coding: utf-8 -*-
### Author: Jonathan Li<jonathan.swjtu@gmail.com> ###
import xlrd
import sqlite3
import xdrlib,sys
import os
 
def main():
sqlfile = "yoinfo.db"
con = sqlite3.connect(sqlfile)
c = con.cursor()
createsql = """create table yoinfo(
class integer,
stunum integer,
name text,
major text,
field text,
gender text,
boss text)"""
c.execute(createsql)
#需要批量导入的excel的目录中的文件列表
listfile = os.listdir("/home/li/Documents/stuinfo")
for file in listfile:
#依次导入每个excel文件的数据
edata = xlrd.open_workbook(os.path.join('/home/li/Documents/stuinfo',file))
#使用excel的第一个sheet
table = edata.sheets()[0]
nrow = table.nrows
n = 1
while n < nrow:
rowdata = table.row_values(n)
#删除第一列的序号
del rowdata[0]
n = n + 1
c.execute('insert into yoinfo values (?,?,?,?,?,?,?)', rowdata)
con.commit()
c.close()
 
if __name__=="__main__":
main() 

NOTE:

如果需要在android中使用该数据库,还需要在数据库中添加一个叫做android_metadata的表,命令行添加方式如下:

CREATE TABLE "android_metadata" ("locale" TEXT DEFAULT 'en_US');
INSERT INTO "android_metadata" VALUES ('en_US')

同时,还需要将其他每个表中的primary id改成_id,以便Android知道如何绑定表中的id字段。

example

Using your own SQLite database in Android applications