当前位置: 首页 > news >正文

使用python在不改变原有excel的格式下,修改指定单元格格式

需求

有一个账单,需要生成一个副本,但是需要将交易员列隐藏,不能改变原有的格式
xlsx的文件容易实现,使用openpyxl实现
xls的文件使用xlrd+xlutil实现
参考了https://segmentfault.com/q/1010000008270267

class GenCopyReport(object):"""生成账单备份,删除交易员列"""def __init__(self, filename, broker_code) -> None:self.filename = filenameself.broker_code = broker_codeself.file_type = filename.split(".")[-1]def remove_col(self, content, sheet_name, col_name, skiprows):"""删除指定sheet页指定列:param content: 二进制文件:param sheet_name: sheet 页名:param col_name: 列名:param skiprows: 列名所在行:raises ValueError: 异常:return: bytes | None"""# 判断文件格式是 .xls 还是 .xlsxif self.file_type == "xls":# 处理 .xls 文件return self.remove_col_xls(content, sheet_name, col_name, skiprows)elif self.file_type == "xlsx":# 处理 .xlsx 文件return self.remove_col_xlsx(content, sheet_name, col_name, skiprows)else:raise ValueError("Unsupported file format")def copy2(self, wb):w = XLWTWriter()process(XLRDReader(wb, 'unknown.xls'), w)return w.output[0][1], w.style_listdef remove_col_xls(self, content, sheet_name, col_name, skiprows):"""支持xls后缀的处理方法:param content: 二进制:param sheet_name: sheet页名:param col_name: 列名:param skiprows: 列名所在行号:return: bytes | None"""# 打开 Excel 文件,保留格式信息workbook = open_workbook(file_contents=content, formatting_info=True, on_demand=True)# 选择指定的 sheetsheet = workbook.sheet_by_name(sheet_name)# 找到需要删除的列索引for col_idx in range(sheet.ncols):if sheet.cell_value(skiprows-1, col_idx) == col_name:trader_col = col_idxbreakelse:trader_col = None# 如果找到了需要删除的列,则删除该列if trader_col is not None:# 创建一个可编辑的 workbook 副本,并保留原文件的格式属性wb, s = self.copy2(workbook)wbs = wb.get_sheet(sheet_name)# styles = s[sheet.cell_xf_index(row_idx, trader_col)]# 删除指定列for row_idx in range(sheet.nrows):if row_idx == skiprows-1:wbs.write(row_idx, trader_col, "备注", s[sheet.cell_xf_index(row_idx, trader_col)])else:wbs.write(row_idx, trader_col, '', s[sheet.cell_xf_index(row_idx, trader_col)])# 保存修改后的 Excel 文件output_buffer = io.BytesIO()wb.save(output_buffer)return output_buffer.getvalue()else:return Nonedef remove_col_xlsx(self, content, sheet_name, col_name, skiprows):"""支持xlsx后缀的处理方法:param content: 二进制:param sheet_name: sheet页:param col_name: 列名:param skiprows: 列名所在行:return: bytes | None   如果没找到指定列,则返回None"""# 从文件内容打开 Excel 工作簿input_buffer = io.BytesIO(content)wb = load_workbook(filename=input_buffer)# 选择指定的 sheetws = wb[sheet_name]# 找到需要删除的列索引for col_idx, cell in enumerate(ws[skiprows], start=1):if cell.value == col_name:breakelse:return None# 删除指定列for row in range(1, ws.max_row + 1):cell = ws.cell(row=row, column=col_idx)if cell.coordinate in ws.merged_cells:# 如果是合并单元格,则跳过continueif row == skiprows:cell.value = "备注"else:cell.value = ""# ws.cell(row=row, column=col_idx, value="")# 将修改后的工作簿保存到二进制 buffer 中output_buffer = io.BytesIO()wb.save(output_buffer)return output_buffer.getvalue()

相关文章:

  • Android10 修改设备名称
  • 【C#】中IndexOf的用法
  • 【EMC专题】ESD抑制器简要介绍
  • 《数据结构(C语言版)第二版》第六章-图(6.4 图的存储结构——6.4.1 邻接矩阵)
  • Java基础之字面值常量
  • html+css+js网页设计 大一电商6个页面 带js 有轮播图,增删改查等功能
  • 【Qt】QWidget的windowTitle属性
  • Linux信号控制进程种类、内存查看和NICE优先级
  • 在CentOS 7 上安装和配置 uwsgi 详细教程
  • Secure Coding in C and C ++ (三)关于语法与指针的感悟
  • gitlab实现CI/CD自动化部署
  • Kafka 的 ISR 机制
  • 并查集..
  • 智启万象|挖掘广告变现潜力,保障支付安全便捷
  • 集成高精度16bit模数转换ADC电路的两通道测量高精度电容调理芯片 - MDC02
  • 11111111
  • CAP 一致性协议及应用解析
  • css属性的继承、初识值、计算值、当前值、应用值
  • echarts的各种常用效果展示
  • Facebook AccountKit 接入的坑点
  • gulp 教程
  • input实现文字超出省略号功能
  • PermissionScope Swift4 兼容问题
  • Redis 中的布隆过滤器
  • vuex 笔记整理
  • 类orAPI - 收藏集 - 掘金
  • 前端临床手札——文件上传
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • C# - 为值类型重定义相等性
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 交换综合实验一
  • ​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
  • ​iOS安全加固方法及实现
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (003)SlickEdit Unity的补全
  • (2024)docker-compose实战 (8)部署LAMP项目(最终版)
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (pojstep1.1.2)2654(直叙式模拟)
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (翻译)terry crowley: 写给程序员
  • (利用IDEA+Maven)定制属于自己的jar包
  • (七)Flink Watermark
  • (三)终结任务
  • (十二)Flink Table API
  • (未解决)macOS matplotlib 中文是方框
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (转)原始图像数据和PDF中的图像数据
  • .apk文件,IIS不支持下载解决
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .net 4.0发布后不能正常显示图片问题
  • .NET 8.0 中有哪些新的变化?
  • .NET CORE 第一节 创建基本的 asp.net core