基于xlrd的Excel处理

导入模块

1
import xlrd

打开文件

1
x1 = xlrd.open_workbook("data.xlsx")

获取sheet

  • 获取所有sheet名字:x1.sheet_names()
  • 获取sheet数量:x1.nsheets
  • 获取所有sheet对象:x1.sheets()
  • 通过sheet名查找:x1.sheet_by_name(“test”)
  • 通过索引查找:x1.sheet_by_index(3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# -*- coding:utf-8 -*-

import xlrd
import os

filename = "demo.xlsx"
file_path = os.path.join(os.getcwd(), filename)


# 1、打开文件
x1 = xlrd.open_workbook(file_path)

# 2、获取sheet对象
print('sheet_names:', x1.sheet_names()) # 获取所有sheet名字
print('sheet_number:', x1.nsheets) # 获取sheet数量
print('sheet_object:', x1.sheets()) # 获取所有sheet对象
print('By_name:', x1.sheet_by_name("test1")) # 通过sheet名查找,找不到会报错
print('By_index:', x1.sheet_by_index(2)) # 通过索引查找,找不到会报错

输出结果:

1
2
3
4
5
sheet_names: ['test1', 'test2', 'test3']
sheet_number: 3
sheet_object: [<xlrd.sheet.Sheet object at 0x000002A7690BA700>, <xlrd.sheet.Sheet object at 0x000002A76909E400>, <xlrd.sheet.Sheet object at 0x000002A76909E5B0>]
By_name: <xlrd.sheet.Sheet object at 0x000002A7690BA700>
By_index: <xlrd.sheet.Sheet object at 0x000002A76909E5B0>

获取sheet的汇总数据:

  • 获取sheet名:sheet1.name
  • 获取总行数:sheet1.nrows
  • 获取总列数:sheet1.ncols
1
2
3
4
sheet1 = x1.sheet_by_name("test1")
print("sheet name:", sheet1.name)
print("row num:", sheet1.nrows)
print("col num:", sheet1.ncols)

输出:

1
2
3
sheet name: test1
row num: 4
col num: 3

单元格批量读取:

1
2
3
4
5
6
7
数据类型:
空:0
字符串:1
数字:2
日期:3
布尔:4
error:5

a)行操作:

  • sheet1.row_values(0) # 获取第一行所有内容,合并单元格,首行显示值,其它为空。
  • sheet1.row(0)    # 获取单元格值类型和内容
  • sheet1.row_types(0) # 获取单元格数据类型
1
2
3
4
5
6
7
8
print(sheet1.row_values(0))
print(sheet1.row(0))
print(sheet1.row_types(0))
print(sheet1.row_values(1))
print(sheet1.row(1))
print(sheet1.row_types(1))
print(type(sheet1.row_types(1)))
print(list(sheet1.row_types(1)))

输出:

1
2
3
4
5
6
7
8
['商品名称', '商品价格', '销量']
[text:'商品名称', text:'商品价格', text:'销量']
array('B', [1, 1, 1])
['衬衫', 66.0, 0.0]
[text:'衬衫', number:66.0, number:0.0]
array('B', [1, 2, 2])
<class 'array.array'>
[1, 2, 2]

b) 表操作

  • sheet1.row_values(0, 6, 10) # 取第1行,第6~10列(不含第10列)

  • sheet1.col_values(0, 0, 5) # 取第1列,第0~5行(不含第5行)

  • sheet1.row_slice(2, 0, 2) # 获取单元格值类型和内容

    1
    2
    3
    sheet1.row_slice(2, 0, 2)
    获取第三行,第0和第1列的值类型和内容
    [text:'衬衫', number:66.0]
  • sheet1.row_types(1, 0, 2) # 获取单元格数据类型

    1
    2
    3
    sheet1.row_types(1, 0, 2) 
    获取第二行,第0和第1列的值类型
    array('B', [1, 2]) # [1,2] 分别代表上面的字符串和数字

特定单元格读取:

a) 获取单元格值:

  • sheet1.cell_value(1, 2) # 获取第二行,第三列的数据
  • sheet1.cell(1, 2).value # 获取第二行,第三列的数据
  • sheet1.row(1)[2].value # 获取第二行,第三列的数据

b) 获取单元格类型:

  • sheet1.cell(1, 2).ctype # 获取第二行,第三列的数据类型
  • sheet1.cell_type(1, 2) # 获取第二行,第三列的数据类型
  • sheet1.row(1)[2].ctype # 获取第二行,第三列的数据类型

(0,0)转换A1:

  • xlrd.cellname(0, 0) # (0,0)转换成A1

  • xlrd.cellnameabs(0, 0) # (0,0)转换成$A$1

  • xlrd.colname(30) # 把列由数字转换为字母表示

    1
    2
    3
    4
    5
    6
    7
    print(xlrd.cellname(0, 0))
    print(xlrd.cellnameabs(0, 0))
    print(xlrd.colname(30))
    输出:
    A1
    $A$1
    AE

读取demo

1
2
3
4
5
6
7
8
9
# xls_file是文件对象
wb = xlrd.open_workbook(file_contents=xls_file.read())
table = wb.sheets()[0]


for row in range(1, table.nrows):
values = table.row_values(row)
index = row + 1 # 第几行
info = values[0] if values[0] else ""

导出demo

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
headers = [
'【商品名称】', "【价格】", "【销量】",
]

# 创建一个workbook 设置编码
ws = xlwt.Workbook(encoding='utf-8')
# 创建一个worksheet
sheet = ws.add_sheet("销量统计表")
# 初始化样式
style = xlwt.XFStyle()
# 为样式创建字体
font = xlwt.Font()
# 黑体
font.bold = True
# 下划线
font.underline = True
# 斜体字
font.italic = True
# 设定样式
style.font = font
for i in range(len(headers)):
sheet.write(0, i, headers[i], style)

row = 1
for obj in qs:
sheet.write(row, 0, obj.name)
sheet.write(row, 1, obj.price)
sheet.write(row, 2, obj.count)

row += 1
sio = StringIO.StringIO()
ws.save(sio)
sio.seek(0)
response = StreamingHttpResponse([line for line in sio.readlines()],
content_type='application/vnd.ms-excel')
response['Content-Disposition'] = 'attachment; filename=商品详情.xls'
return response
如果觉得写的还行,赞助瓶脉动~
0%