This action will force synchronization from mktime/python-learn, which will overwrite any changes that you have made since you forked the repository, and can not be recovered!!!
Synchronous operation will process in the background and will refresh the page when finishing processing. Please be patient.
import xlrdimport openpyxlfrom xlutils.copy import copyimport osfrom decimal import Decimalclass XLSHelper:def __init__(self, fpath=None):self.read_fpath = fpathself.read_book = Noneself.read_sheet = Noneself.write_path = fpathself.write_book = Noneself.write_sheet = Nonedef __del__(self):del self.read_bookdel self.read_sheetdel self.write_bookdel self.write_sheetdef load_excel(self, fpath):self.read_fpath = fpathself.read_book = xlrd.open_workbook(self.read_fpath, formatting_info=True)self.write_book = copy(self.read_book)return selfdef load_sheet(self, index):if not self.read_book:raise ValueError("先调用load_excel")self.read_sheet = self.read_book.sheets()[index]self.write_sheet = self.write_book.get_sheet(index)return selfdef get_sheet_count(self):return len(self.read_book.sheets())def set_write_path(self, fpath):self.write_path = fpathreturn selfdef get_cell_value(self, row, column):if not self.read_sheet:raise ValueError('先调用load_sheet')return self.read_sheet.cell_value(row, column)#如果小数位只有1位 则把第二位小数的0删除, etc: 0.10 --> 0.1# thanks to: https://www.cnblogs.com/feifeifeisir/p/15246080.htmldef _remove_exponent(self, num):return num.to_integral() if num == num.to_integral() else num.normalize()def get_rows_values(self):row_count = self.read_sheet.nrowscol_count = self.read_sheet.ncolsrows_data = []for row in range(row_count):row_data = []for col in range(col_count):cell = self.read_sheet.cell(row, col)value = cell.valuectype = cell.ctype# 针对number特殊处理if ctype == xlrd.XL_CELL_NUMBER:# print(type(value), value, str(value))value = str(self._remove_exponent(Decimal(value).quantize(Decimal('.01'), rounding = 'ROUND_HALF_UP')))# print(value)row_data.append(value)rows_data.append(row_data)return rows_data# rows_data = []# for i in range(row_count):# row_data = self.read_sheet.row_values(i)# rows_data.append(row_data)# return rows_datadef write_cell_value(self, row, col, value):if not self.write_sheet:raise ValueError('请先逐次调用load_excel,load_sheet')self.write_sheet.write(row, col, value)self.write_book.save(self.write_path)return selfclass XLSXHelper:def __init__(self, fpath=None):self.read_fpath = fpathself.read_book = Noneself.read_sheet = Noneself.write_fpath = fpathdef __del__(self):del self.read_bookdel self.read_sheetdef load_excel(self, fpath):self.read_fpath = fpathself.read_book = openpyxl.load_workbook(self.read_fpath)return selfdef load_sheet(self, index):if not self.read_book:raise ValueError("先调用load_excel")self.read_sheet = self.read_book.worksheets[index]return selfdef get_sheet_count(self):return len(self.read_book.worksheets)def set_write_path(self, fpath):self.write_fpath = fpathreturn selfdef get_cell_value(self, row, column):if not self.read_sheet:raise ValueError('先调用load_sheet')return self.read_sheet.cell(row=row+1, column=column+1).valuedef get_rows_values(self):rows = [row for row in self.read_sheet.rows]rows_raw = []for row in rows:row_raw = []for cell in row:value = cell.valuerow_raw.append(value)rows_raw.append(row_raw)return rows_rawdef write_cell_value(self, row, col, value):self.read_sheet.cell(row+1, col+1).value = valueself.read_book.save(self.write_fpath)return selfclass ExcelHelper:def __init__(self):self.instance = Nonedef load_excel(self, fpath):"""根据文件格式初始化excel instance"""if not os.path.exists(fpath):raise ValueError('excel文件不存在')if fpath.endswith('.xls'):self.instance = XLSHelper(fpath)elif fpath.endswith('.xlsx'):self.instance = XLSXHelper(fpath)else:raise ValueError('文件格式不正确')self.instance.load_excel(fpath)return selfdef load_sheet(self, index):"""载入sheet"""if not self.instance:raise ValueError('先调用load_excel')self.instance.load_sheet(index)return selfdef get_sheet_count(self):""" 计算表格有多少个sheet"""if not self.instance:raise ValueError('先调用load_excel')return self.instance.get_sheet_count()def set_write_path(self, fpath):""" 设定输出excel文件路径,如果不设置,则追加在读取的excel文件内"""self.instance.set_write_path(fpath)return selfdef get_cell_value(self, row, column):""" 获取某个单元格的值"""if not self.instance:raise ValueError('先调用load_excel')return self.instance.get_cell_value(row, column)def get_rows_values(self):""" 获取整个sheet的内容,格式为二维数据example:[[1, 2, 3],[1, 2, 3],[1, 2, 3],...]"""return self.instance.get_rows_values()def write_cell_value(self, row, col, value):""" 往某个单元格写入内容"""self.instance.write_cell_value(row, col, value)return self
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。