python操作excel

背景

在平常的工作中,我们经常要操作excel;但这不是程序猿的思维,程序员应该把excel当成程序可以操作的数据。

读写excel

对excel的操作主要是读取和写入操作,分别介绍下

读取数据

  1. 读取excel中的所有sheet

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    import xlrd

    def get_all_sheets_names(self):
    """
    读取excel里所有的sheet
    """
    self.sheet_names = dict()
    idx = 0
    rd = xlrd.open_workbook(self.excel_r_path)
    for one_name in rd.sheet_names():
    self.sheet_names[one_name] = idx
    idx += 1

    if DEBUG_SWITCH == 1:
    for key, value in self.sheet_names.items():
    print key, value
    return
  2. 读取其中一个sheet中的数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    def read_one_excel_data(self, index):
    """
    读取一个excel中的数据
    """
    one_sheet = self.rd.sheet_by_index(index)
    # 行数& 列数
    rows = one_sheet.nrows
    columns = one_sheet.ncols

    for i in range(rows):
    one_list = []
    for j in range(columns):
    one_elem = one_sheet.cell(i, j).value.encode('utf-8')
    one_list.append(one_elem)
    self.data.append(one_list)

    if DEBUG_SWITCH == 1:
    for row in self.data:
    for dt in row:
    print dt,
    print

写入数据

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
def set_style(self, name, height, bold = False):
"""
初始化样式, 字体等
"""
style = xlwt.XFStyle() # 初始化样式
font = xlwt.Font() # 为样式创建字体
font.name = name # 'Times New Roman'
font.bold = bold
font.color_index = 4
font.height = height
style.font = font
return style

def write_excel_sheet(self, sheet_name):
"""
写excel
"""
self.wt = self.wt_excel.add_sheet(sheet_name, cell_overwrite_ok = True)
write_data = [('a1', 'a2', 'a3'), ('b1', 'b2', 'b3'), ('c1', 'c2', 'c3')]
heads = ['a', 'b', 'c']

#写第几行
line_num = 0

#write head
for i in range(len(heads)):
self.wt.write(line_num, i, heads[i], self.set_style('Times New Roman', 220, True))
line_num += 1

#write cont
for elem in write_data:
for i in range(len(elem)):
self.wt.write(line_num, i, elem[i], self.set_style('Times New Roman', 220))
line_num += 1

self.wt_excel.save(self.excel_w_path)
return

做成web版本

只需要将数据加载起来,通过web框架展现出来

  1. 上传 & 展现

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <form action="" enctype='multipart/form-data' method='POST'>
    <input type="file" name="file">
    <input type="submit" value="上传">
    </form>

    {% if data_row_num %}
    <table class="table table-bordered table-hover">
    <tbody>
    {% for i in range(data_row_num) %}
    <tr>
    {% for j in range(col_num) %}
    <td>
    {{ data_csv[i][j] }}
    </td>
    {% endfor %}
    </tr>
    {% endfor %}
    </tbody>
    </table>
    {% endif %}
  2. 下载

    1
    2
    3
    4
    5
    <form action="" enctype='multipart/form-data' method='POST'>
    <input type="file" name="file">
    <input type="submit" value="upload", name="upload">
    <input type="submit" value="download", name="download">
    </form>

服务端

1
2
3
4
5
6
7
if request.form.get('upload') == 'upload':
pass
elif request.form.get('download') == 'download':
path = os.getcwd()
#写入数据到chg.xls
write_excel(path + '/chg.xls', data)
return send_from_directory(path, 'chg.xls', as_attachment = True)

总结

我们既能操纵excel里的数据进行快速分析,也能通过网页的方式查看excel中的数据;更进一步,我们可以让用户提交处理数据的逻辑,将逻辑传递到后台,定制化数据输出

------ 本文结束 ------
k