利用xlrd模块在Django项目中实现Excel文件导入
2018-12-11 本文已影响1人
零_WYF
在项目接近尾声的时候,经常会需要将客户的一些数据资料导入到项目中进行测试或者实际使用,大量的数据当然不可能通过手动的方式输入,这个时候就需要将数据通过Excel文件导入到项目中。具体实现方式如下:
1.引入xlrd模块
import xlrd
2.从前端获取Excel文件数据对象
excel_file = request.FILES.get('excel_file','')
3.读取Excel文件数据对象
常用的Excel文件有 .xlsx 和 .xls两种,.xls文件读取时需要设置formatting_info=True
data = xlrd.open_workbook(filename=None, file_contents=excel_file.read()) # xlsx文件
data = xlrd.open_workbook(filename=None, file_contents=excel_file.read(), formatting_info=True) # xls文件
4.获取Excel中每张表(sheets)的数据内容
get_sheets_mg() # 获取表中每一行的数据
def get_sheets_mg(data, num): # data:Excel数据对象,num要读取的表
table = data.sheets()[num] # 打开第一张表
nrows = table.nrows # 获取表的行数
ncole = table.ncols # 获取列数
all_list = []
for i in range(nrows): # 循环逐行打印
one_list = []
for j in range(ncole):
cell_value = table.row_values(i)[j]
if (cell_value is None or cell_value == ''):
cell_value = (get_merged_cells_value(table, i, j))
one_list.append(cell_value)
all_list.append(one_list)
del (all_list[0]) # 删除标题 如果Excel文件中第一行是标题可删除掉,如果没有就不需要这行代码
return all_list
仅仅获取Excel表中的每一行数据是满足不了实际需求的,因为Excel中经常会有合并单元格的情况出现,因此还要处理合并单元格情况的函数。
get_merged_cells() # 获取所有合并的单元格信息 sheet.merged_cells
def get_merged_cells(sheet):
"""
获取所有的合并单元格,格式如下:
[(4, 5, 2, 4), (5, 6, 2, 4), (1, 4, 3, 4)]
(4, 5, 2, 4) 的含义为:行 从下标4开始,到下标5(不包含) 列 从下标2开始,到下标4(不包含),为合并单元格
:param sheet:
:return:
"""
return sheet.merged_cells
get_merged_cells_value() # 获取被合并单元格中的信息
def get_merged_cells_value(sheet, row_index, col_index):
"""
先判断给定的单元格,是否属于合并单元格;
如果是合并单元格,就返回合并单元格的内容
:return:
"""
merged = get_merged_cells(sheet)
# print(merged,"==hebing==")
for (rlow, rhigh, clow, chigh) in merged:
if (row_index >= rlow and row_index < rhigh):
if (col_index >= clow and col_index < chigh):
cell_value = sheet.cell_value(rlow, clow)
# print('该单元格[%d,%d]属于合并单元格,值为[%s]' % (row_index, col_index, cell_value))
return cell_value
break
return None
5.将获取的数据循环导入数据库中
all_list_1 = get_sheets_mg(data, 0)
i = 0
while i < len(all_list_1):
.... # 保存省略
i++