xlwings结合dataframe数据的写入
一、代码
- import xlwings as xw
- import pandas as pd
- xl_path=r'***'
- df_path=r'***'
- df=pd.read_excel(df_path)
- app=xw.App(visible=False,add_book=False)
- #不弹出提示窗
- app.display_alerts=False
- load_wb=app.books.open(xl_path)
- load_ws=load_wb.sheets["sheetname"]
- #清除sheet内的所有数据
- load_ws.clear()
- #将dataframe转成列表写入
- load_ws.range('A1').expand('table').value = df.values.tolist()
- load_wb.save()
- load_wb.close()
- app.quit()
二、改进封装代码
- import xlwings as xw
- import pandas as pd
- import numpy as np
- class PathError(BaseException):
- def __init__(self, error):
- self.error = error
- class WriteError(BaseException):
- def __init__(self, error):
- self.error = error
- # 判断元素是否为数字
- def is_number(s):
- try:
- if np.isnan(s) or s == False or s == True:
- return False
- except Exception:
- pass
- try:
- # 判断是否为浮点数
- float(s)
- return True
- except Exception:
- pass
- try:
- import unicodedata # 处理ASCii码的包
- # 把一个表示数字的字符串转换为浮点数返回的函数
- unicodedata.numeric(s)
- return True
- except (TypeError, ValueError):
- pass
- return False
- class ExcelMerge(object):
- def __init__(self):
- self.app = xw.App(visible=False, add_book=False)
- self.app.display_alerts = False
- self.load_wb = None
- self.load_ws = None
- self.data_list = []
- def merge(self, master_path=None, retinue_path=None, sheet=0):
- if not master_path or not retinue_path:
- raise PathError("文件地址不能为空")
- self.data_list = self.read_df(master_path)
- self.data_list.extend(self.read_df(retinue_path))
- self.data_list = pd.DataFrame(self.data_list)
- try:
- self.load_wb = self.app.books.open(master_path)
- self.load_ws = self.load_wb.sheets[sheet]
- self.load_ws.range('A2').expand('table').value = self.data_list
- except Exception as e:
- raise WriteError("excel写入错误:{}".format(e))
- finally:
- self.load_wb.save()
- self.load_wb.close()
- self.app.quit()
- def read_df(self, path):
- df = pd.read_excel(path)
- col_list = []
- # 以下代码是解决纯数字过长导致写入excel后几位变0
- for column in df:
- for v in df[column]:
- if is_number(v):
- if len(str(v)) > 12:
- col_list.append(column)
- break
- if col_list:
- for c in col_list:
- df[c] = df[c].map(lambda x: "'" + str(x) if not pd.isnull(x) else "")
- return df.values.tolist()
- em=ExcelMerge()
- if __name__ == '__main__':
- # 合并2个excel,一个主表,一个从表
- master_path="****"
- retinue_path="****"
- em.merge()
xlwings结合dataframe数据的写入的更多相关文章
- 将DataFrame数据如何写入到Hive表中
1.将DataFrame数据如何写入到Hive表中?2.通过那个API实现创建spark临时表?3.如何将DataFrame数据写入hive指定数据表的分区中? 从spark1.2 到spark1.3 ...
- spark 将dataframe数据写入Hive分区表
从spark1.2 到spark1.3,spark SQL中的SchemaRDD变为了DataFrame,DataFrame相对于SchemaRDD有了较大改变,同时提供了更多好用且方便的API.Da ...
- 将pandas的DataFrame数据写入MySQL数据库 + sqlalchemy
将pandas的DataFrame数据写入MySQL数据库 + sqlalchemy import pandas as pd from sqlalchemy import create_engine ...
- DataTable数据批量写入数据库三种方法比较
DataTable数据批量写入数据库三种方法比较 标签: it 分类: C#1) insert循环插入:2) sqldataadapter.update(dataset,tablename); ...
- 在DataFrame数据表里面提取需要的行
在DataFrame数据表里面提取需要的行 代码功能: 在DataFrame表格中使用loc(),得到我们想要的行,然后根据某一列元素的值进行排序 此代码中还展示了为DataFrame添加列,即直接n ...
- mongo-spark-读取不同的库数据和写入不同的库中
mongo-spark-读取不同的库数据和写入不同的库中 package com.example.app import com.mongodb.spark.config.{ReadConfig, Wr ...
- 批量插入数据, 将DataTable里的数据批量写入数据库的方法
大量数据导入操作, 也就是直接将DataTable里的内容写入到数据库 通用方法: 拼接Insert语句, 好土鳖 1. MS Sql Server: 使用SqlBulkCopy 2. MySql ...
- Python3 Pandas的DataFrame数据的增、删、改、查
Python3 Pandas的DataFrame数据的增.删.改.查 一.DataFrame数据准备 增.删.改.查的方法有很多很多种,这里只展示出常用的几种. 参数inplace默认为False,只 ...
- Pandas DataFrame数据的增、删、改、查
Pandas DataFrame数据的增.删.改.查 https://blog.csdn.net/zhangchuang601/article/details/79583551 #删除列 df_2 = ...
随机推荐
- 工厂方法配置bean
1:静态工厂方法配置bean 1):对象 package com.spring.helloworld; public class Car { private String name; private ...
- Python基础教程(006)--Python的特点
前言 了解Python背景,明白Python在目前社会中的标准库是有成千上万的Python爱好者共同维护的. 知识点 Python是完全面相对象的语言 函数,模块,数字,字符串都是对象,在Python ...
- 【C#技术】一篇文章搞掂:Infragistics组件库
工具栏 // 按钮不可按 tool.SharedProps.Enabled = false; Grid // Grid中记录时间 // 建议SQL Server中使用字符字段(没有深入测试,只是字符字 ...
- flask中app.py: error: invalid choice: 'insert'........的问题
在flask中,分为两种操作方式,url指向函数或者终端指向函数,最终目的就是让函数执行,触发方式不同.终端执行更加安全, 另外如果在终端执行的时候出现 : 就是说明 insert 没有在@ mana ...
- Linux虚拟机网络连接的三种方式
Bridge桥接模式.NAT模式.Host-only仅主机模式: 桥接模式:虚拟机使用真实网卡进行通信,配置简单:只要和真实计算机在同一个网段内,就可以直接通信:局域网内如果有其他计算机,也可以进行访 ...
- PHP-文件和目录操作
目录操作 创建目录:mkdir(目录地址, 权限, 是否递归创建 = false); 删除目录:rmdir(目录地址);(仅仅可以删除空目录,不支持递归删除) 移动(改名):rename(旧地址, 新 ...
- 微信小程序,获取二维码
微信小程序,获取二维码 找到一篇很实用的博客,他已经写得很详细了,自己也懒得写,亲测有效 参考网址
- Git 设置和取消代理(SOCKS5代理)
设置代理 git config --global http.proxy 'socks5://127.0.0.1:1080' git config --global https.proxy 'socks ...
- promise基础用法
/** * Created by liyinghao on 2016/11/6. */ const fs = require('fs'); /* * 新建一个Promise对象,Promise就是一个 ...
- 部署项目问题(maven打包jar不对应,导致启动时一直找不到某个类)
项目是springboot+maven 打包用maven的插件package 下面是打包后的目录结构 project-1.0 和project-1.0.tar.gz是一样的 区别就是一个是压缩包 ...