版权声明:转载请告知征得同意。 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,小工具完成,结束。