273 lines
12 KiB
Python
273 lines
12 KiB
Python
# -*- coding: UTF-8 -*-
|
||
# @File: operation_Xlsx.py
|
||
# @Description: excle的基本操作
|
||
# @Author: WenQing
|
||
# @Date: 2021-08-26 11:15:08
|
||
import os
|
||
import xlrd, xlwt
|
||
import pandas as pd
|
||
from xlutils.copy import copy
|
||
import openpyxl
|
||
from base_framework.base_config.current_pth import env_choose_path
|
||
from base_framework.public_tools.read_config import ReadConfig
|
||
|
||
|
||
class ExcelApi:
|
||
def __init__(self):
|
||
self.p_here = os.path.dirname(os.path.abspath(__file__))
|
||
self.c_team = ReadConfig(env_choose_path).get_value(sections='run_evn_name', options='current_team')
|
||
self.up_file_path = os.path.abspath(os.path.join(self.p_here, '../../{}/library/UpFile/'.format(self.c_team)))
|
||
|
||
def excel_create_excel_file(self, file_name, file_dict_data=None, file_path=None):
|
||
"""
|
||
功能:按列将数据写入excel文件,没有文件时就新建文件
|
||
Args:
|
||
file_name: 文件名
|
||
file_dict_data: 文件内容,字典类型,格式:{'title1':[], 'title2':[],..... 'titleN':[],}
|
||
file_path: 文件路径,没有时默认放在小组目录下的UpFile文件夹中
|
||
Returns:
|
||
"""
|
||
if not file_path:
|
||
full_path = self.up_file_path + os.sep + file_name
|
||
else:
|
||
full_path = file_path + os.sep + file_name
|
||
if not file_dict_data:
|
||
file_dict_data = {}
|
||
df = pd.DataFrame(file_dict_data)
|
||
# 将 DataFrame 的数据保存到 Excel 文件中
|
||
df.to_excel(full_path, index=False)
|
||
|
||
def excel_create_file_by_column(self, file_name, file_dict_data=None, file_path=None):
|
||
"""
|
||
功能:按列将数据写入excel文件,没有文件时就新建文件
|
||
Args:
|
||
file_name: 文件名
|
||
file_dict_data: 文件内容,字典类型,格式:{'title1':[], 'title2':[],..... 'titleN':[],}
|
||
file_path: 文件路径,没有时默认放在小组目录下的UpFile文件夹中
|
||
Returns:
|
||
"""
|
||
if not file_path:
|
||
full_path = self.up_file_path + os.sep + file_name
|
||
else:
|
||
full_path = file_path + os.sep + file_name
|
||
if not file_dict_data:
|
||
file_dict_data = {}
|
||
df = pd.DataFrame(file_dict_data)
|
||
# 将 DataFrame 的数据保存到 Excel 文件中
|
||
df.to_excel(full_path, index=False)
|
||
|
||
def excel_write_file_by_line(self, file_name, line_data=None, file_path=None, w_type='new'):
|
||
"""
|
||
功能:按行将数据写入excel文件,没有文件时就新建文件
|
||
Args:
|
||
file_name: 文件名
|
||
line_data: 文件内容,列表类型,格式:[[字段1,字段2],[字段1,字段2]]
|
||
file_path: 文件路径,没有时默认放在小组目录下的UpFile文件夹中
|
||
w_type: 写入类型:new-重写,append-追加
|
||
"""
|
||
if not file_path:
|
||
full_path = self.up_file_path + os.sep + file_name
|
||
else:
|
||
full_path = file_path + os.sep + file_name
|
||
if w_type == 'new':
|
||
self.write_xlsx(path=full_path, sheet_name="Sheet1", value=line_data)
|
||
elif w_type == 'append':
|
||
self.append_xlsx(path=full_path, value=line_data)
|
||
else:
|
||
raise Exception("目前仅支持new和append两种模式,而当前传入的是;{}".format(w_type))
|
||
|
||
def excel_replace_cell_value(self, file_name, replace_dict, sheet_name=None, skip_first_row=True):
|
||
"""
|
||
功能:替换excel文件中的指定单元格的值
|
||
Args:
|
||
file_name: 文件名,如果文件不在UpFile文件夹中,需要传入完整路径
|
||
sheet_name: 工作表名称,默认为全部工作表
|
||
replace_dict: 替换的数据,字典类型,格式:{'old_txt_1': 'new_txt_1', 'old_txt_2': 'new_txt_2',..... }
|
||
skip_first_row: 是否跳过第一行,默认跳过,用于第一行是标题的情况
|
||
Returns:
|
||
"""
|
||
if "/" not in file_name: # 如果没有路径,就默认在UpFile文件夹中
|
||
file_name = self.up_file_path + os.sep + file_name
|
||
# 读取指定工作表的数据
|
||
wb = openpyxl.load_workbook(file_name)
|
||
# 遍历所有要替换的数据
|
||
for old_text, new_text in replace_dict.items():
|
||
# 遍历所有工作表
|
||
for sheet in wb.worksheets:
|
||
# 遍历工作表中的所有行和列
|
||
for row in sheet.iter_rows():
|
||
if skip_first_row: # 跳过第一行
|
||
skip_first_row = False
|
||
continue
|
||
for cell in row:
|
||
if cell.value == old_text:
|
||
cell.value = new_text
|
||
wb.save(file_name)
|
||
|
||
def excel_read_columns(self, file_name, sheet_name, column_names):
|
||
"""
|
||
功能:按列读取excel文件的数据
|
||
Args:
|
||
file_name: 文件名,如果文件不在UpFile文件夹中,需要传入完整路径
|
||
sheet_name: 工作表名称
|
||
column_names: 列名列表,格式:['title1', 'title2',..... 'titleN']
|
||
Returns:
|
||
返回指定列的数据,格式为:[[字段1,字段2],[字段1,字段2]]
|
||
"""
|
||
if "/" not in file_name: # 如果没有路径,就默认在UpFile文件夹中
|
||
file_name = self.up_file_path + os.sep + file_name
|
||
# 读取指定工作表的数据
|
||
df = pd.read_excel(file_name, sheet_name=sheet_name)
|
||
|
||
# 检查指定列是否存在
|
||
missing_columns = [col for col in column_names if col not in df.columns]
|
||
if missing_columns:
|
||
raise ValueError(f"Columns {missing_columns} do not exist in the sheet '{sheet_name}'.")
|
||
|
||
# 返回指定列的数据
|
||
return df[column_names].values.tolist()
|
||
|
||
def read_asDict(self, path):
|
||
"""
|
||
| 功能说明: | 读取excle,输出字典格式|
|
||
| 传入参数: | 读取文件路径 |
|
||
| 返回数据: | 表头字段作为key,单元格值作为value |
|
||
| 作者信息: | 作者 文青 | 修改时间 |
|
||
举例说明:
|
||
"""
|
||
self.table = pd.read_excel(path)
|
||
data = []
|
||
for i in self.table.index.values:
|
||
data_dict = self.table.loc[i].to_dict()
|
||
data.append(data_dict)
|
||
return data
|
||
|
||
def read_asList(self, path, sheetname=None):
|
||
"""
|
||
| 功能说明: | 读取excle和sheetname,输出列表格式|
|
||
| 传入参数: | 读取excle和sheetname |
|
||
| 返回数据: | 列表[] |
|
||
| 作者信息: | 作者 文青 | 修改时间 |
|
||
举例说明:
|
||
"""
|
||
wb = openpyxl.load_workbook(path)
|
||
if not sheetname:
|
||
sheets = wb.sheetnames
|
||
sheetname = sheets[0]
|
||
ws = wb[sheetname]
|
||
rows = ws.rows
|
||
columns = ws.columns
|
||
data = []
|
||
for row in rows:
|
||
line = [col.value for col in row]
|
||
data.append(line)
|
||
return data
|
||
|
||
def read_xls_txt(self, path):
|
||
"""
|
||
| 功能说明: | 读取excle的第一列放在一个列表中|
|
||
| 传入参数: | 读取excle路径 |
|
||
| 返回数据: | 列表[] |
|
||
| 作者信息: | 作者 文青 | 修改时间 |
|
||
举例说明:
|
||
"""
|
||
data = pd.read_excel(path, header=None)
|
||
data_list = []
|
||
nrows = data.shape[0]
|
||
for irow in range(nrows):
|
||
data_list.append(data.iloc[irow, 0])
|
||
string = ''
|
||
for i in range(len(data_list)):
|
||
string += data_list[i] + ','
|
||
return string
|
||
|
||
def write_xls(self, value, sheetname, path):
|
||
"""
|
||
| 功能说明: | 创建一个xls的文件并且写入数据 |
|
||
| 传入参数: | value:传入列表,格式:[[字段1,字段2],[字段1,字段2],[字段1,字段2],[字段1,字段2]] |
|
||
|sheetname:sheet名称 |
|
||
|path:写入文件路径 |
|
||
| 返回数据: | |
|
||
| 作者信息: | 作者 文青 | 修改时间 |
|
||
举例说明:
|
||
"""
|
||
index = len(value) # 获取需要写入数据的行数
|
||
workbook = xlwt.Workbook() # 新建一个工作簿
|
||
sheet = workbook.add_sheet(sheetname=sheetname) # 在工作簿中新建一个sheetname的表格
|
||
for i in range(0, index):
|
||
for j in range(0, len(value[i])):
|
||
sheet.write(i, j, value[i][j])
|
||
workbook.save(path)
|
||
# return "写入成功!"
|
||
|
||
def append_xls(self, value, path):
|
||
"""
|
||
| 功能说明: | 对xls文件第一个sheet内容进行追加 |
|
||
| 传入参数: | value:传入列表,格式:[[字段1,字段2],[字段1,字段2],[字段1,字段2],[字段1,字段2]] |
|
||
|path:写入文件路径 |
|
||
| 返回数据: | |
|
||
| 作者信息: | 作者 文青 | 修改时间 |
|
||
举例说明:
|
||
"""
|
||
index = len(value) # 获取需要写入数据的行数
|
||
workbook = xlrd.open_workbook(path) # 打开工作簿
|
||
sheets = workbook.sheet_names() # 获取所有表格
|
||
worksheet = workbook.sheet_by_name(sheets[0]) # 获取所有表格中的第一个表格
|
||
rows_old = worksheet.nrows # 获取表格的总行数
|
||
new_workbook = copy(workbook) # 把原文件复制一份
|
||
new_worksheet = new_workbook.get_sheet(0) # 获取副本第一个表格
|
||
for i in range(0, index):
|
||
for j in range(0, len(value[i])):
|
||
new_worksheet.write(i + rows_old, j, value[i][j])
|
||
new_workbook.save(path)
|
||
# return "追加成功!!"
|
||
|
||
def write_xlsx(self, path, sheet_name, value):
|
||
"""
|
||
| 功能说明: | 创建一个xls的文件并且写入数据 |
|
||
| 传入参数: | value:传入列表,格式:[[字段1,字段2],[字段1,字段2],[字段1,字段2],[字段1,字段2]] |
|
||
|sheetname:sheet名称 |
|
||
|path:写入文件路径 |
|
||
| 返回数据: | |
|
||
| 作者信息: | 作者 文青 | 修改时间 |
|
||
举例说明:
|
||
"""
|
||
index = len(value)
|
||
workbook = openpyxl.Workbook()
|
||
sheet = workbook.active
|
||
sheet.title = sheet_name
|
||
for i in range(0, index):
|
||
for j in range(0, len(value[i])):
|
||
sheet.cell(row=i + 1, column=j + 1, value=str(value[i][j]))
|
||
workbook.save(path)
|
||
return "写入成功!!"
|
||
|
||
def append_xlsx(self, path, value):
|
||
"""
|
||
| 功能说明: | 对xls文件第一个sheet内容进行追加 |
|
||
| 传入参数: | value:传入列表,格式:[[字段1,字段2],[字段1,字段2],[字段1,字段2],[字段1,字段2]] |
|
||
|path:写入文件路径 |
|
||
| 返回数据: | |
|
||
| 作者信息: | 作者 文青 | 修改时间 |
|
||
举例说明:
|
||
"""
|
||
data = openpyxl.load_workbook(path)
|
||
sheets = data.sheetnames
|
||
table = data[sheets[0]]
|
||
for i in value:
|
||
table.append(i)
|
||
data.save(path)
|
||
return "追加成功!!"
|
||
|
||
|
||
if __name__ == '__main__':
|
||
ea = ExcelApi()
|
||
f_data = {"教师ID": [1, 2, 3, 4],
|
||
"教师姓名": [11, 22, 33, 44],
|
||
"课程ID": [111, 222, 333, 444],
|
||
"课程名称": [1111, 2222, 3333, 4444],
|
||
"更新类型(1.新增;0.删除,填写数字)": [0, 1, 0, 1]
|
||
}
|
||
ea.excel_create_excel_file(file_name="测试大盘A标签.xlsx", file_dict_data=f_data)
|
||
|