Python Excel来做矩阵

版权声明:转载请告知征得同意。 https://blog.csdn.net/qq_42731466/article/details/82261516

天天matlab来,matlab去,python没有个想matlab一样的表格,输数据非常不方便,就写一个python和excel对接的方式,语法已经写进去了,都设了缺省值,自行修改吧。

山寨matlab一下

读取Excel

filename输入文件名。sheet名默认可选,_pos为始末位置,返回值默认为矩阵
    将末尾包含在内,注意Excel格子为空时对矩阵的填充0
    filename    缺省。
    _sheet      缺省。
    _pos        缺省,默认读取整个_sheet含有数据的部分作为矩阵,空位处补位0
    _return     缺省,返回值默认为矩阵,可选'list',将返回二维列表。
    _empty      缺省,读取excel时,若表格为空,则补0
    _err_return 缺省,读取异常时,自动补0
    _zip        缺省,默认去除无用维度
    _T          缺省,默认不转置

写入Excel

矩阵写入Excel
filename输入文件名。sheet名默认可选

.

然后需要说明一下,
不读取字符串,用异常处理成_err_return,默认0
表格为空的时候,处理成_empty,默认0
参数_pos为空的时候,默认读取所有数据
从Excel到矩阵很迅速,一行代码,然后再用numpy进行修饰即可。
不废话了,一个小工具自己贴了自己用吧,其他想要的功能就自己再写吧。

from openpyxl import load_workbook,Workbook
import numpy
import re
import os
import sys
import numpy as np

def fun_Excelout(_mat,filename='out.xlsx',_sheet='output'):

    '''
    矩阵写入Excel
    filename输入文件名。sheet名默认可选
    ''' 
    try:
        rows = _mat.shape[0]            #读取矩阵维度
    except:
        rows = 1
    try:
        ranks = _mat.shape[1]
    except:
        ranks = 1
    print('矩阵已经输入')
    print('维度:' + str(rows) + ' X ' + str(ranks))
    def fun_excelout2(_mat,rows,ranks,filename):
        bol = os.path.exists(filename)
        if os.path.exists(filename) == True:
            print('文件已存在,退出')
            sys.exit(0)
        workbook0 = Workbook()
        workbook0.create_sheet(_sheet)
        sheet = workbook0[_sheet]

        if rows == 1 or ranks == 1:      #一维矩阵单独处理逐行输出
            if rows == 1:
                _list = numpy.ndarray.tolist(_mat[0])
                sheet.append(_list)
            elif ranks == 1:
                _list = []
                for row in range(rows):
                    _list = [_mat[row]]
                    sheet.append(_list)
                workbook0.save(filename)
                print('保存完毕')
                return 1
        else:
            for row in range(rows):                     
                _list = numpy.ndarray.tolist(_mat[row])                  
                sheet.append(_list)
        workbook0.save(filename)
        print('保存完毕')
    fun_excelout2(_mat,rows,ranks,filename)

def fun_Excelin(filename = 'output.xlsx',_sheet = 'input',_pos = ['A1','C3'],_return ='mat',_empty = 0,_zip = None,_T = None,_err_return=0):
    '''
    读取Excel
    filename输入文件名。sheet名默认可选,_pos为始末位置,返回值默认为矩阵
        将末尾包含在内,注意Excel格子为空时对矩阵的填充0
        filename    缺省。
        _sheet      缺省。
        _pos        缺省,默认读取整个_sheet含有数据的部分作为矩阵,空位处补位0
        _return     缺省,返回值默认为矩阵,可选'list',将返回二维列表。
        _empty      缺省,读取excel时,若表格为空,则补0
        _err_return 缺省,读取异常时,自动补0
        _zip        缺省,默认去除无用维度
        _T          缺省,默认不转置
    ''' 
    if os.path.exists(filename) == False:
        print('文件不存在,退出')
        sys.exit(0)
    workbook1 = load_workbook(filename)
    sheet = workbook1[_sheet]
    max_row = sheet.max_row
    max_column = sheet.max_column
    def posget(row,rank):
        lett0 = []  #存放拆分的字符
        lett1 = []
        _st_letter = re.findall(r'[A-Z]+',row)
        _st_num = re.findall(r'[0-9]+',row)
        _la_letter = re.findall(r'[A-Z]+',rank)
        _la_num = re.findall(r'[0-9]+',rank)
        for lett in _st_letter[0]:
            lett0.append(lett)
            mul = len(lett0)        #注意这个计算
            st_val = 0
            count = 0
            for alp in lett0:
                val = ord(alp) - 64
                st_val += val*(26**count)
                count += 1
        for lett in _la_letter[0]:
            lett1.append(lett)
            mul = len(lett1)        #同上
            la_val = 0
            count = 0
            for alp in lett1:
                val = ord(alp) - 64
                la_val += val*(26**count)
                count += 1
        st_num = int(_st_num[0])
        la_num = int(_la_num[0])
        return [(st_val,st_num),(la_val,la_num)]
    if _pos == ['A1','C3']:
        _pos = [(1,1),(sheet.max_column,sheet.max_row)]   #初始位置未被修改时,取得表格的全部信息    
    else:
        _pos = posget(_pos[0],_pos[1])

    #10进制向26进制转化,化为字母
    def chrchange(num):
        _doc = 26   #进制
        _temp = []
        while num!=0:
            num_temp = num%_doc
            num = int(num/_doc)     #b为余数
            _temp.append(num_temp)
        _lett = []
        _list_lett = _temp[::-1]    
        end_num = len(_list_lett)
        for num1 in range(1,end_num):   #退位
            if _list_lett[num1] == 0:
                _list_lett[num1] = 26
                _list_lett[num1-1] -= 1
        while _list_lett[0] == 0:
            _list_lett.pop(0)
        for lette in _list_lett:
            _chr = chr(lette+64)
            _lett.append(_chr)
        _string = ''
        for let in _lett:
            _string += let
        return _string

    start_x = _pos[0][0]
    start_y = _pos[0][1]
    end_x = _pos[1][0]
    end_y = _pos[1][1]
    _x = abs(end_x - start_x)
    _y = abs(end_y - start_y)
    mat = np.zeros((_y+1,_x+1))
    for _row in range(start_y,end_y+1):  
        for _rank in range(start_x,end_x+1):
            exc_rank = chrchange(_rank)
            try:
                if sheet[exc_rank + str(_row)].value == None:
                    mat[_row-start_y,_rank-start_x] = _empty    #默认补充为0,可扩展,读取字符时候也补充0
                else:
                    mat[_row-start_y,_rank-start_x] = sheet[exc_rank + str(_row)].value
            except:
                mat[_row-start_y,_rank-start_x] = _err_return

    #去除矩阵的多余维度
    if _zip == True:
        print('不好意思我还没写,自己写算法吧')

    #转置
    if _T == True:
        matt = mat.transpose()

    #读取结果以list返回
    if _return == 'list':
        mat_change = numpy.ndarray.tolist(mat)
        return mat_change
    matt = mat
    return matt

最后举个栗子

from fun_excel import fun_Excelout,fun_Excelin
import numpy
# _mat = numpy.random.rand(200,200)
# fun_Excelout(_mat,filename='2.xlsx')
mat1 = fun_Excelin(filename='工作簿1.xlsx',_sheet='Sheet1')
print(mat1)

这里写图片描述
这里写图片描述

OK,小工具完成,结束。

猜你喜欢

转载自blog.csdn.net/qq_42731466/article/details/82261516
今日推荐