浏览量: 251 次浏览

Python对excel文件处理

2020年2月24日 0 作者 Nie Hen

通常会遇到excel中的数据处理,除了用matlab还可以用Python的库
excel处理 使用库openpyxl ,xlrd ,xlwt
enter description here
xlw写xlsx文件只支持六万多行。openpyxl可以支持一百多万行的。

使用xlrd读取excel文件

直接讲 excel文件读取到一个list中这样就会导致刚开始加载的时候会很慢。
如果文件很大的时候,初始化时间会很长。
打开文件

data = xlrd.open_workbook(‘excel.xls’)

获取工作表

table = data.sheets()[0] #通过索引顺序获取
table = data.sheet_by_index(0) #通过索引顺序获取
table = data.sheet_by_name(u’Sheet1′)#通过名称获取

获取整行和整列的值 ,获取行数和列数

table.row_values(i)
table.col_values(i)
nrows = table.nrows
ncols = table.ncols
row行 col为列

获取数据

table.col_values(0) # 第一列数据
table.row_values(1) # 第二行的数据 返回值为list
#从单元格获取数据
cell_A1 = table.cell(0,0).value # 单元格A1的数据
cell_C4 = table.cell(2,3).value.ctype # C4 的数据类型

使用xlwt写数据

新建工作薄

book = xlwt.Workbook() # 新建工作簿
sheet = book.add_sheet(‘Test’) # 添加工作页

写入

sheet.write(1,1,’A’) # 第二行第二列写入A

格式

style = xlwt.XFStyle() # 新建样式
font = xlwt.Font() #新建字体
font.name = ‘Times New Roman’
font.bold = True
style.font = font # 将style的字体设置为font
table.write(0,0,’Test’,style)

参考链接
参考链接:

保存

book.save(filename_or_stream=’excel_test.xls’)

追加写如excel xlwt xlrd一起使用

导入库

import xlwt,xlrd
from xlutils.copy import copy

联系

data = xlrd.open_workbook(‘excel_test.xls’,formatting_info=True)
excel = copy(wb=data) # 完成xlrd对象向xlwt对象转换

其他就可以使用两个库的库函数

使用openpyxl操作

这个库功能比较强大 综合以上两个库的功能。
打开文件

wb = openpyxl.load_workbook(‘excel_test.xlsx’)

根据索引 获取到第一个表

ws = wb.worksheets[0]

获取表的信息

nrows = ws.max_row # 获得行数
ncolumns = ws.max_column # 获得行数

插入行列

ws.insert_rows(1,3) # 从第一行开始插入三行 原本第一行到了第四行
ws.insert_cols(1,3) # 从第一列开始插入三列 原本第一列到了第四列

填充内容

ws.cell(1, 1).value = ’00’ # A1 单元格被填充为00

参考链接

小项目

excel中记录时间连续的检测值,但是有部分时间没有连续需要补上去。
比如 2017/12/18 13:44:20.000. 下一个应该是加1s,如果没有按照每s进行下去,就需要找出来断点的地方,并补上去。

import xlrd
import xlwt
import time
import datetime
# from xlutils.copy import copy 只能处理6万多条数据
from openpyxl import load_workbook

time1 = time.time()
file = 'newfile.xlsx'

def read_data():

    data = xlrd.open_workbook(file)
    #excel = copy(data)
    table = data.sheets()[0] #通过索引顺序获取

    raw_time = table.col_values(0) # 获取列
    raw_day = []
    last_s =0
    last_m = 0

    for i,tim in enumerate(raw_time[1:-1]):
        full_time = tim.split(' ')

        #int_day = int(full_time[0][-2:])  # 获取天

        int_s = int(full_time[1][-7:-5])   #获取秒
        int_m = int(full_time[1][-10:-8])
        #int_h = int(full_time[1][-13:-11])

        if (int_s - last_s != 1 ) and (int_s != 0 and last_s != 59): # 比较s的变化

            #new_list = []
            new_list2 = []
            #list_time.append(new_list)
            new_list2.append(i)
            new_list2.append(raw_time[i])
            new_list2.append(tim)

            raw_day.append(new_list2)
        elif ((int_s == 0 and last_s == 59) and (int_m -last_m !=1 )) or ((int_s != 0 and last_s != 59) and int_m != last_m ): # 找出s变化的特殊情况.
            new_list2 = []

            new_list2.append(i)
            new_list2.append(raw_time[i])
            new_list2.append(tim)
            raw_day.append(new_list2)

        last_s = int_s
        last_m = int_m
    #print(raw_day)
    print('程序运行时间',time.time()-time1)
    return raw_day
def write_in(raw_data):
    sum_line = 0
    wb = load_workbook(file)
    # Select First Worksheet
    ws = wb.worksheets[0]
    for de_data in raw_data[1:]:
        #index = de_data[0]+1
        #sum_line  = de_data[0] +sum_line
        print(de_data[1:])
        startTime= datetime.datetime.strptime(de_data[1][:-5],"%Y/%m/%d %H:%M:%S")  # 初始时间
        endTime = datetime.datetime.strptime(de_data[2][:-5],"%Y/%m/%d %H:%M:%S")   # 结束时间

        chazhi = (endTime-startTime).seconds-1

        print(chazhi)
        if chazhi >10000 :
            print('差值太大')
            continue
        ws.insert_rows(de_data[0]+2+sum_line,chazhi)

        for i in range(chazhi):
            i = i+1
            str_time = str((startTime + datetime.timedelta(seconds=i))).replace('-', '/')
            ws.cell(de_data[0]+1+sum_line+i, 1).value = str(str_time + '.000.')
            #print(str_time +'.000.')

        sum_line = sum_line + chazhi
        wb.save(file)
if __name__ == "__main__" :
    raw_data = read_data()
    print(raw_data)
    write_in(raw_data)
    #print((datetime.datetime.now() + datetime.timedelta(minutes=5)).strftime('%Y-%m-%d %H:%M'))