python用win32com处理excel表格
python用openpyxl操作excel
python⽤openpyxl操作excelpython操作excel⽅法1)⾃⾝有Win32 COM操作office但讲不清楚,可能不⽀持夸平台,linux是否能⽤不清楚,其他有专业处理模块,如下2)xlrd:(读excel)表,xlrd读⼤表效率⾼于openpyxl3)xlwt:(写excel)表,xlrd和xlwt对版本上兼容不太好,很多新版excel有问题。
新版excel处理:openpyxl(可读写excel表)专门处理Excel2007及以上版本产⽣的xlsx⽂件,xls和xlsx之间转换容易注意:如果⽂字编码是“gb2312” 读取后就会显⽰乱码,请先转成Unicode安装openpyxl1)下载openpyxl模块:https:///pypi/openpyxl2)解压到指定⽂件⽬录:tar -xzvf openpyxl.tar.gz3)进⼊⽬录,找到setup.py⽂件,执⾏命令:python setup.py install如果报错No module named setuptools 就使⽤命令“easy_install openpyxl”,easy_install for win32,会⾃动安装setuptools。
这⾥注意,如果不能⾃动安装,基本上python的模块都通过命令 python 模块名.py install 来安装,如果setuptools模块没有,直接去官⽹下载,然后前⾯命令安装就可以了4)处理图⽚还需要安装pillow(PIL)To be able to include images (jpeg, png, bmp,...) into an openpyxl file, you will also need the “pillow” library that can be installed with:pip install pillowpthon学习资料python 学习⼩组/group/show/368/page/4官⽹:https:///pypi/openpyxlhttp://openpyxl.readthedocs.io/en/default/good:/suofiya2008/article/details/6284208/zzukun/article/details/49946147/topics/0/501/501962.htmlopenpyxl的使⽤openpyxl定义多种数据格式最重要的三种:NULL空值:对应于python中的None,表⽰这个cell⾥⾯没有数据。
python中openpyxl和xlsxwriter对Excel的操作方法
python中openpyxl和xlsxwriter对Excel的操作⽅法前⼏天,项⽬中有个⼩需求:提供Excel的上传下载功能,使⽤模块:openpyxl和xlsxwriter,这⾥简单记录⼀下。
1.简介Python中操作Excel的库⾮常多,为开发者提供了多种选择,如:xlrd、xlwt、xlutils、xlwings、pandas、win32com、openpyxl、xlsxwriter等等。
其中:前三个⼀般混合使⽤,对Excel读写操作,适合旧版Excel,仅⽀持 xls ⽂件;win32com库功能丰富,性能强⼤,适⽤于Windows;xlwings稍次于前者,但同样功能丰富;pandas适合处理⼤量数据;xlsxwriter适合⼤量数据的写操作,⽀持图⽚/表格/图表/筛选/格式/公式等;openpyxl读写均可,简单易⽤,功能⼴泛,可插⼊图表等,类似前者。
以下主要描述⼀下后两种(openpyxl、xlsxwriter)的简单使⽤2.Excel库的使⽤2.1.⽬标2.2.openpyxl的使⽤2.2.1.安装pip install openpyxl2.2.2.写⼊Excelimport osfrom openpyxl import Workbookfrom openpyxl.styles import Alignment, Font, colors, PatternFillfrom openpyxl.utils import get_column_letterFILE_PATH = os.path.join(os.path.dirname(__file__), 'files/')def write_test():wb = Workbook()filename = FILE_PATH + '/openpyxl_test.xlsx'# 活动sheetws1 = wb.activews1.title = "Test-1"# 列表追加for row in range(1, 10):ws1.append(range(9))# 创建sheetws2 = wb.create_sheet(title="Test-2")# 合并单元格ws2.merge_cells('F5:I5')# 拆分# ws2.unmerge_cells('F5:I5')# 单元赋值ws2['F5'] = 'hello world'# 居中ws2['F5'].alignment = Alignment(horizontal='center', vertical='center')# sheet标签颜⾊ws2.sheet_properties.tabColor = '1072BA'# 字体样式bold_itatic_12_font = Font(name='仿宋', size=12, italic=True, color=BLUE, bold=True)ws2['F5'].font = bold_itatic_12_font# 背景颜⾊bg_color = PatternFill('solid', fgColor='1874CD')ws2['F5'].fill = bg_color# ⾏⾼列宽ws2.row_dimensions[5].height = 40 # 第 5 ⾏ws2.column_dimensions['F'].width = 30 # F 列ws3 = wb.create_sheet(title="Test-3")for row in range(10, 20):for col in range(10, 20):ws3.cell(column=col, row=row, value="0}".format(get_column_letter(col)))print(ws3['S10'].value)# 保存wb.save(filename)2.2.3.读取Excelfrom openpyxl import load_workbookdef read_test(filename):wb = load_workbook(filename)print('取得所有⼯作表的表名 :')print(wb.sheetnames, '\n')print('取得某张⼯作表 :')# sheet = wb['Sheet1']# sheet = wb.worksheets[0]sheet = wb[wb.sheetnames[0]]print(type(sheet))print('表名: ' + sheet.title, '\n')print('取得活动⼯作表 :')active_sheet = wb.activeprint('表名: ' + active_sheet.title, '\n')print('获取⼯作表的⼤⼩:')print('总⾏数: ' + str(active_sheet.max_row))print('总列数: ' + str(active_sheet.max_column))print('\n获取单元格数据:')for row in range(sheet.max_row):for col in range(sheet.max_column):print(f"第 {row + 1} ⾏ {col + 1} 列:", sheet.cell(row=row + 1, column=col + 1).value) print('\n获取⾏数据:')for i, cell_object in enumerate(list(sheet.rows)):cell_lst = [cell.value for cell in cell_object]print(f'第 {i + 1} ⾏:', cell_lst)2.2.4.案例demo 数据源格式# contents数据contents=[{"uid": "1281948912","group_name": "测试群-5","domain": "","user_area": [{"num": 1024,"region": "中国","percent": 33.33},{"num": 1022,"region": "中国⾹港","percent": 33.33},{"num": 1021,"region": "新加坡","percent": 33.33}],"gf_area": [{"num": 5680,"region": "中国⾹港","percent": 97.8},{"num": 60,"region": "新加坡","percent": 0.8},{"num": 55,"region": "美西","percent": 0.8}],"sip_area": {"waf_ip":[""],"sip":["13.75.120.253","18.163.46.57"],"isp_region":[{"country": "中国⾹港","isp": ""},{"country": "中国⾹港","isp": ""}]}},]写⼊Excelimport osimport timefrom openpyxl import Workbook, load_workbookfrom openpyxl.styles import Alignment, Font, colors, PatternFillFILE_PATH = os.path.join(os.path.dirname(__file__), 'files/')# 颜⾊BLACK = colors.COLOR_INDEX[0]WHITE = colors.COLOR_INDEX[1]RED = colors.COLOR_INDEX[2]DARKRED = colors.COLOR_INDEX[8]BLUE = colors.COLOR_INDEX[4]DARKBLUE = colors.COLOR_INDEX[12]GREEN = colors.COLOR_INDEX[3]DARKGREEN = colors.COLOR_INDEX[9]YELLOW = colors.COLOR_INDEX[5]DARKYELLOW = colors.COLOR_INDEX[19]def export_gf_excel_test(filename=None, sheetName=None, contents=None): filename = filename if filename else 'openpyxl_Test.xlsx'sheetName = sheetName if sheetName else '测试'contents = contents if contents else []# 新建⼯作簿wb = Workbook()ws = wb.worksheets[0]# 设置sheet名称ws.title = sheetName# sheet标签颜⾊ws.sheet_properties.tabColor = '1072BA'# 居中pos_center = Alignment(horizontal='center', vertical='center')# 字体样式bold_12_font = Font(name='仿宋', size=12, italic=False,color=BLACK, bold=True)# 背景颜⾊bg_color = PatternFill('solid', fgColor='4DCFF6')# 设置标题# 合并merge_lst = ['A1:A3', 'B1:B3', 'C1:C3', 'D1:R1', 'S1:AA1', 'AB1:AE1','D2:F2', 'G2:I2', 'J2:L2', 'M2:O2', 'P2:R2', 'S2:U2', 'V2:X2','Y2:AA2', 'AB2:AB3', 'AC2:AC3', 'AD2:AD3', 'AE2:AE3'][ws.merge_cells(c) for c in merge_lst]# 填充字段title_dic = {'A1': 'UID', 'B1': '钉钉群', 'C1': '域名','D1': '⽤户区域', 'S1': '⾼防区域', 'AB1': '源站区域','D2': 'TOP1', 'G2': 'TOP2', 'J2': 'TOP3', 'M2': 'TOP4', 'P2': 'TOP5','S2': 'TOP1', 'V2': 'TOP2', 'Y2': 'TOP3','AB2': 'WAF IP', 'AC2': '源站IP', 'AD2': '源站IP区域', 'AE2': '运营商'}line3_v = ['物理区域', '请求量', '占⽐'] * 8line3_k = [chr(i) + '3' for i in range(68, 91)] + ['AA3']title_dic.update(dict(zip(line3_k, line3_v)))for k, v in title_dic.items():ws[k].value = vws[k].font = bold_12_fontws[k].alignment = pos_centerws[k].fill = bg_color# 列宽width_dic = {'A': 30, 'B': 30, 'C': 30,'AB': 16, 'AC': 16, 'AD': 16, 'AE': 16}for k, v in width_dic.items():ws.column_dimensions[k].width = v# 内容for i, dic in enumerate(contents):user_gf_mod = {'region': '', 'num': '', 'percent': ''}user_area = dic['user_area']gf_area = dic['gf_area']sip_area = dic['sip_area']# UID+域名data = [dic['uid'], dic['group_name'], dic['domain']]# ⽤户区域if not user_area:user_area = [user_gf_mod] * 5else:user_area = list(map(lambda item: {'region': item['region'], 'num': item['num'], 'percent': item['percent']}, user_area))[user_area.append(user_gf_mod) for _ in range(5 - len(user_area))][data.extend(user_area[u].values()) for u in range(len(user_area))]# ⾼防区域if not gf_area:gf_area = [user_gf_mod] * 3else:gf_area = list(map(lambda item: {'region': item['region'], 'num': item['num'], 'percent': item['percent']}, gf_area))[gf_area.append(user_gf_mod) for _ in range(3 - len(gf_area))][data.extend(gf_area[g].values()) for g in range(len(gf_area))]# 源站区域waf_ip = sip_area['waf_ip']sip = sip_area['sip']isp_region = sip_area['isp_region']data.append(','.join(waf_ip)) if waf_ip else data.append('')data.append(','.join(sip)) if sip else data.append('')if not isp_region:data.extend([''] * 2)else:try:country = ','.join(map(lambda item: item['country'], isp_region))isp = ','.join(map(lambda item: item['isp'] if item['isp'] else '暂未查到', isp_region))data.append(country)data.append(isp)except Exception as e:print(e)print(isp_region)# 写⼊Excelws.append(data)# 保存⽂件wb.save(filename=filename)if __name__ == "__main__":curTime = ''.join(map(lambda i: str(i) if len(str(i)) >= 2 else '%02d' % i, [i for i in time.localtime()[:-4]])) filename = os.path.join(FILE_PATH, 'openpyxl_Test_{}.xlsx'.format(curTime))export_gf_excel_test(filename, contents=contents)2.3.xlsxwriter的使⽤2.3.1.安装pip install XlsxWriter2.3.2.写⼊Excelimport osimport timeimport jsonimport xlsxwriterFILE_PATH = os.path.join(os.path.dirname(__file__), 'files/')def export_gf_excel_test(filename=None, sheetName=None, contents=None):filename = filename if filename else 'xlsxwriter_Test.xlsx'sheetName = sheetName if sheetName else '测试'contents = contents if contents else []# 新建wb = xlsxwriter.Workbook(filename)ws = wb.add_worksheet(name=sheetName)# 设置风格style1 = wb.add_format({"bold": True,'font_name': '仿宋','font_size': 12,# 'font_color': '#217346','bg_color': '#4DCFF6',"valign": 'vcenter','text_wrap': 1})style2 = wb.add_format({# "bold": True,# 'font_name': '仿宋','font_size': 11,'font_color': '#217346','bg_color': '#E6EDEC',"align": 'center',"valign": 'vcenter',# 'text_wrap': 1})# 标题ws.set_column('A1:AE1', None, style1)# 合并单元格: first_row, first_col, last_row, last_col# 第 1 ⾏ws.merge_range(0, 0, 2, 0, 'UID')ws.merge_range(0, 1, 2, 1, '钉钉群')ws.merge_range(0, 2, 2, 2, '域名')ws.merge_range(0, 3, 0, 17, '⽤户区域')ws.merge_range(0, 18, 0, 26, '⾼防区域')ws.merge_range(0, 27, 0, 30, '源站区域')# 第 2 ⾏user_tl2 = ['TOP' + str(i) for i in range(1, 6)]gf_tl2 = user_tl2[:3][ws.merge_range(1, 3 * (i + 1), 1, 3 * (i + 2) - 1, name) for i, name in enumerate(user_tl2 + gf_tl2)] # 第 3 ⾏user_gf_tl3 = ['物理区域', '请求量', '占⽐'] * 8sip_tl3 = ['WAF IP', '源站IP', '源站IP区域', '运营商'][ws.write(2, 3 + i, name) for i, name in enumerate(user_gf_tl3)][ws.merge_range(1, 27 + i, 2, 27 + i, name) for i, name in enumerate(sip_tl3)]# ws.write(11, 2, '=SUM(1:10)') # 增加公式# ws.set_default_row(35) # 设置默认⾏⾼# 设置列宽ws.set_column(0, 2, 30)ws.set_column(3, 26, 10)ws.set_column(27, 30, 16)# 内容for i, dic in enumerate(contents):user_gf_mod = {'region': '', 'num': '', 'percent': ''}user_area = dic['user_area']gf_area = dic['gf_area']sip_area = dic['sip_area']# UID+域名data = [dic['uid'], dic['group_name'], dic['domain']]# ⽤户区域if not user_area:user_area = [user_gf_mod] * 5else:user_area = list(map(lambda item: {'region': item['region'], 'num': item['num'], 'percent': item['percent']}, user_area))[user_area.append(user_gf_mod) for _ in range(5 - len(user_area))][data.extend(user_area[u].values()) for u in range(len(user_area))]# ⾼防区域if not gf_area:gf_area = [user_gf_mod] * 3else:gf_area = list(map(lambda item: {'region': item['region'], 'num': item['num'], 'percent': item['percent']}, gf_area))[gf_area.append(user_gf_mod) for _ in range(3 - len(gf_area))][data.extend(gf_area[g].values()) for g in range(len(gf_area))]# 源站区域waf_ip = sip_area['waf_ip']sip = sip_area['sip']isp_region = sip_area['isp_region']data.append(','.join(waf_ip)) if waf_ip else data.append('')data.append(','.join(sip)) if sip else data.append('')if not isp_region:data.extend([''] * 2)else:try:country = ','.join(map(lambda item: item['country'], isp_region))isp = ','.join(map(lambda item: item['isp'] if item['isp'] else '暂未查到', isp_region))data.append(country)data.append(isp)except Exception as e:print(e)# 写⼊Excelws.write_row('A' + str(i + 4), data, style2)# 保存关闭⽂件wb.close()if __name__ == '__main__':curTime = ''.join(map(lambda i: str(i) if len(str(i)) >= 2 else '%02d' % i, [i for i in time.localtime()[:-4]]))filename = os.path.join(FILE_PATH, 'xlsxwriter_Test_{}.xlsx'.format(curTime))export_gf_excel_test(filename, contents=contents)以上是两个库操作Excel的简单实现。
py createobject用法
py createobject用法Python中的createobject用法在Python中,createobject是一个很有用的函数,用于创建和操作各种对象。
它可以帮助我们在编程过程中更方便地管理和使用对象。
要使用createobject函数,首先需要导入相应的模块。
常用的模块包括win32com.client、comtypes.client等。
以win32com.client为例,下面是createobject 函数的基本用法:```pythonimport win32com.clientobj = win32com.client.Dispatch("ObjectName")```在上面的代码中,"ObjectName"表示要创建的对象的名称。
通过这个对象,我们可以使用其提供的方法和属性来完成各种操作。
下面是一些常见的用法示例:1. 创建Excel对象```pythonimport win32com.clientxl = win32com.client.Dispatch("Excel.Application")```上述代码将会创建一个Excel对象,我们可以使用该对象来操作Excel文件,比如打开、保存、修改表格数据等。
2. 创建Word对象```pythonimport win32com.clientword = win32com.client.Dispatch("Word.Application")```上述代码将会创建一个Word对象,我们可以使用该对象来处理Word文档,比如打开、保存、编辑文本内容等。
3. 创建PowerPoint对象```pythonimport win32com.clientppt = win32com.client.Dispatch("PowerPoint.Application")```上述代码将会创建一个PowerPoint对象,我们可以使用该对象来创建幻灯片、添加文本、插入图片等操作。
python处理excel踩过的坑——data_only,公式全部丢失
python处理excel踩过的坑——data_only,公式全部丢失⽤openpyxl读取excel的load_workbook有个data_only参数。
yb_wb = load_workbook(u"D:\\Desktop\\xxx.xlsx", data_only=True)顾名思义,True时,只读data,忽略公式。
但是有个情景是——得先保留公式,根据旧公式写⼊新公式。
然后再读取值进⾏操作。
也就是说先data_only = False,然后再data_only = True。
这样会导致读取值操作的时候,公式全部没有了。
对,全部为空。
就是这么奇怪。
⾕歌,百度后得知:wb = openpyxl.load_workbook(‘abc.xlsx’, data_only=True)当’abc.xlsx’被⽣成并在Excel程序中打开并保存之后(这个过程Excel会把公式结果计算出来),该⽂件附带有两套值,⼀套是公式全都没有计算的(data_only=False(默认)),⼀套是公式计算了结果的(data_only=True)。
(如果没有被Excel打开并保存,则只有⼀套值(data_only=False的那套,公式没有计算结果的)。
此时,以data_only=True或默认data_only=False打开会得到两种不同的结果,各⾃独⽴,即data_only=True状态下打开的,会发现公式结果为None(空值)或者⼀个计算好的常数,⽽不会看到它原本的公式是如何。
⽽data_only=False则只会显⽰公式⽽已。
因此,data_only=True状态下打开,如果最后⽤save()函数保存了,则原xlsx⽂件中,公式会被替换为常数结果或空值。
⽽data_only=False状态下打开,最后⽤save()函数保存了的话,原xlsx⽂件也会只剩下data_only=False的那套值(即公式),另⼀套(data_only=True)的值会丢失,如想重新获得两套值,则仍旧需要⽤Excel程序打开该⽂件并保存。
python-win32操作excel的一些特殊功能
python-win32操作excel的⼀些特殊功能⼀、代码特殊操作包括(隐藏列,解锁⼯作表保护,插⼊批注,创建⽂本框,追加修改单元格内容)from openpyxl import load_workbookimport win32com.client# 隐藏列def hidden_column(path, column, sheet_name=0):''':param path: ⽂件路径:param column: 列名,如A,B,C,可以传⼊单个,可以是区间[B,E]:return:'''try:wb = load_workbook(path, data_only=True)if isinstance(sheet_name, str):ws = wb.get_sheet_by_name(sheet_name)else:ws = wb.worksheets[sheet_name]if isinstance(column, list):ws.column_dimensions.group(column[0], column[1], hidden=True)else:ws.column_dimensions[column].hidden = Truewb.save(path)except Exception as e:print("打开⽂件失败:%s" % e)# 解锁⼯作表保护def unlock_excel(path, password, sheet_name="Sheet1"):''':param path: ⽂件路径:param password:⼯作表保护密码:param sheetname: sheet名:return:'''xlApp = win32com.client.DispatchEx("Excel.Application")try:# 后台运⾏, 不显⽰, 不警告xlApp.Visible = FalsexlApp.DisplayAlerts = Falsewb = xlApp.Workbooks.Open(path)# 屏蔽弹窗wb.Checkcompatibility = Falsesht = wb.Worksheets(sheet_name)sht.Unprotect(password)wb.Save()wb.Close(SaveChanges=True)except Exception as e:xlApp.Quit()print("打开⽂件失败:%s" % e)# 插⼊批注def insert_notes(path, cell, content, sheet_name="Sheet1"):''':param path: ⽂件路径:param cell: 批注单元格:如B4:param content: 批注内容:param notes_name: 批注⼈名:param sheet_name: sheet名:return:'''xlApp = win32com.client.DispatchEx("Excel.Application")try:# 后台运⾏, 不显⽰, 不警告xlApp.Visible = FalsexlApp.DisplayAlerts = Falsewb = xlApp.Workbooks.Open(path)sht = wb.Worksheets(sheet_name)if not sht.Range(cell).Comment:sht.Range(cell).AddComment()sht.Range(cell).Comment.Text(content)wb.Save()wb.Close()except Exception as e:xlApp.Quit()print("打开⽂件失败:%s" % e)def create_text_box(path, left,top,Width,Height,content, sheet_name="Sheet1"):xlApp = win32com.client.DispatchEx("Excel.Application")try:# 后台运⾏, 不显⽰, 不警告xlApp.Visible = FalsexlApp.DisplayAlerts = Falsewb = xlApp.Workbooks.Open(path)sht = wb.Worksheets(sheet_name)# 分别是⽂字⽅向,⽂本框的左上⾓相对于⽂档左上⾓的位置,# 相对于⽂档顶部的⽂本框左上⾓的位置,⽂本框的宽度,⽂本框的⾼度(以磅为单位)# 磅的⼤⼩为 1/72 英⼨。
python对具有宏excel的操作
一 、 使 用 win32com库 二、工作表加密解密
finally: #excel xlBook.Close() xlApp.Quit()
import win32com.client
FilePath=r"*****" excel = win32com.client.Dispatch('Eபைடு நூலகம்cel.Application') wb = excel.Workbooks.Open(FilePath) excel.Visible = False sht=wb.Worksheets("Sheet1") # sht.Unprotect("1234") #解除锁定 sht.Protect() #增加锁定 wb.Save() wb.Close(SaveChanges=True)
因此python对象的接口力求简单而且统一类似其他语言中面向接口编程思想
python对具有宏 excel的操作
安装pip install pypiwin32
import win32com.client #excel xlApp =win32com.client.DispatchEx("Excel.Application")
#后台运行, 不显示, 不警告 xlApp.Visible = 0 xlApp.DisplayAlerts = 0 FileName = r"C:\Users\ffm11\Desktop\mydata.xls" # excel xlBook = xlApp.Workbooks.Open(FileName) # 屏蔽弹窗 xlBook.Checkcompatibility = False try:
使用Python处理excel表格(openpyxl)教程
使⽤Python处理excel表格(openpyxl)教程现在有个⼩任务,需要处理excel中的数据。
其实就是简单的筛选,excel玩的不熟练,⽽且需要处理的表有70多个,于是想着写个脚本处理⼀下吧。
python中的openpyxl包可以轻松实现读写excel⽂件,下⾯简单介绍⼀下过程。
1.安装openpyxl通过pip或者easy_install均可安装openpyxl。
openpyxl官⽹:https:///en/latest/安装命令:pip install openpyxl (在线安装)或者 easy_install openpyxl 即可。
2.使⽤openpyxl读xlsx加载workbook,注意,openpyxl只⽀持xlsx格式,⽼版的xls格式需要其他⽅法去加载。
wb = load_workbook(filename = r'tj.xlsx')获取每个sheet的名称sheetnames = wb.get_sheet_names()获得第⼀个sheetws = wb.get_sheet_by_name(sheetnames[0])获取⼀个单元格的数据c = ws['A4']或者c = ws.cell('A4')或者d = ws.cell(row = 4, column = 2)⼀次获取多个单元格的数据cell_range = ws['A1':'C2']或者tuple(ws.iter_rows('A1:C2'))或者1. for row in ws.iter_rows('A1:C2'):2. for cell in row:3. <span style='white-space:pre'> </span>print cell或者1. data_dic = []2.3. for rx in range(0,ws.get_highest_row()):4.5. temp_list = []6. money = ws.cell(row = rx,column = 1).value7. kind = ws.cell(row = rx,column = 2).value8.9. temp_list = [money , kind]10. #print temp_list11.12. data_dic.append(temp_list)13.14. for l in data_dic:15. print l[0],l[1]3.写⼊xlsx⽐如数据存在上边定义的data_dic中1. out_filename = r'result.xlsx'2.3. outwb = Workbook()4.5. ew = ExcelWriter(workbook = outwb)6.7. ws = outwb.worksheets[0]8.9. ws.title = 'res'9. ws.title = 'res'10.11. i=112. for data_l in data_dic:13. for x in range(0,len(data_l)):14. #col = get_column_letter(x)15. ws.cell(column = x+1 , row = i , value = '%s' % data_l[x])16. i+=117.18. ew.save(filename = out_filename)再增加⼀个sheet写内容1. ws2 = outwb.create_sheet(title = 's2')2.3. for data_l in data_dic:4. for x in range(0,len(data_l)):5. ws2.cell(column = x+1 , row = i , value = '%s' % data_l[x])6. i+=17.8. ew.save(filename = out_filename)4.中⽂编码问题表格中的值,openpyxl会⾃动转换为不同的类型,有些表格中会有中⽂出现,就需要进⾏相应的转码。
使用Python通过win32COM打开Excel并添加Sheet的方法
使⽤Python通过win32COM打开Excel并添加Sheet的⽅法对win32 COM不是很熟悉,不知道⼀个程序究竟有多少属性或者⽅法可以操作。
仅仅是⼀个Sheet页的添加就费了我好长时间,因为这种成功来⾃于试探。
编辑代码如下:#!/usr/bin/pythonfrom win32com.client import DispatchxlApp = Dispatch('Excel.Application')xlApp.Visible = TruexlApp.Workbooks.Add()xlApp.Worksheets.Add()程序运⾏结果:我⽤的Excel版本默认打开的时候只有⼀个Sheet页,通过以上操作后打开的时候出现了两个Sheet页,可见创建Sheet页成功。
如果要指明Sheet页的名字,那么就得在创建的时候修改⼀个属性。
修改代码如下:#!/usr/bin/pythonfrom win32com.client import DispatchxlApp = Dispatch('Excel.Application')xlApp.Visible = TruexlApp.Workbooks.Add()xlApp.Worksheets.Add().Name = 'test'xlSheet = xlApp.Worksheets('test')xlSheet.Cells(1,1).Value = 'title'xlSheet.Cells(2,1).Value = 123程序执⾏结果如下:从上⾯的结果可以看出,操作不仅实现了创建新的Sheet页同时还实现了给新创建的Sheet页命名的功能。
在创建并命名结束后,⼜通过名称所引导这个Sheet页实现了信息的写⼊。
python启动办公软件进程(word、excel、ppt、以及wps的et、wps、wpp)
#-*- coding:utf-8 -*from win32com.client import Dispatch import time def start_office_application(app_name): # 在这里获取到app后,其它的操作和通过VBA操作办公软件类似 app = Dispatch(app_name) app.Visible = True time.sleep(0.5) app.Quit() if __name__ == '__main__': ''''' 通过python启动办公软件的应用进程, 其中wpp、et、wpp对应的是金山文件、表格和演示 word、excel、powerpoint对应的是微软的文字、表格和演示 ''' lst_app_name = [ "wps.Application", 'et.Application', 'wpp.Application', 'word.Application', 'excel.Application', 'powerpoint.Application' ] for app_name in lst_app_name: print "app_name:%s" % app_name start_office_application(app_name)
在常见的几个音乐网站里酷狗可以说是最好爬取的啦什么弯都没有所以最适合小白入门爬虫本篇针对爬虫零基础的小白所以每一步骤我都截图并详细解释了其实我自己看着都啰嗦归根到底就是两个步骤的请求还请大佬绕路勿喷
Python的excel操作——PasteSpecial实现选择性粘贴自动化
Python的excel操作——PasteSpecial实现选择性粘贴⾃动化前提要景: 最近收到这么⼀个需求,excel表格⾥⾯我们只想要结果,不要把底表发出来,也就是把excel⾥⾯做好的数据粘贴在新的excel,并选择性粘贴为数值,并且保留格式。
完成后发邮件给相应的经理⽼板们。
在经过⼀系列跌跌撞撞,磕磕碰碰的错误下,写了个excel⾃动把特定的区域复制粘贴到新的excel的sheet中,并保留了数值和格式。
Python操作excel的模块有千千万,本⽂只挑选了win32com.client来进⾏操作,如有其它模块的操作,记得艾特我学习⼀下!启动excelPython启动excel的常规操作有两种:第⼀种:os.system('taskkill /IM EXCEL.exe /F')xlapp = Dispatch('Excel.Application')第⼆种:os.system('taskkill /IM EXCEL.exe /F')xlapp = win32com.client.gencache.EnsureDispatch('Excel.Application')有什么区别呢?我也清楚得不仔细,EnsureDispatch的启动⽅式要求格式⽐较严格,⽅法必须⾸字母⼤写,最主要的是这种启动⽅式可以使⽤win32com.client⾥⾯的excelVBA常量constants,⽽普通Dispatch不可以完成,选择性粘贴PasteSpecial必须要⽤到constants的常量,故本⽂使⽤EnsureDispatch的⽅式启动excel。
然后使⽤Visible为true,表⽰⼯作簿可见,xlapp.Visible = TrueDisplayAlerts为False表⽰为关闭警告,⽐如在保存时候,提⽰我们已经有相同⽂件了,是否保存并覆盖,为false表⽰为不提⽰警告并覆盖此⽂件。
openpyxl公式自动计算
openpyxl公式自动计算openpyxl是一个用于操作Excel文件的Python库,它并不直接支持公式的自动计算。
但是,你可以通过调用Excel应用程序来实现自动计算公式。
以下是一个示例代码,该代码使用openpyxl来计算Excel文件中的公式:```pythonfrom openpyxl import Workbookimport win32com.client as win32# 创建一个新的Excel文件wb = Workbook()ws = wb.active# 在单元格中写入公式ws['A1'] = 5ws['A2'] = 10ws['A3'] = '=SUM(A1:A2)'# 保存文件wb.save('test.xlsx')# 打开Excel应用程序ExcelApp = win32.gencache.EnsureDispatch('Excel.Application') # 打开文件wb = ExcelApp.Workbooks.Open('test.xlsx')# 计算公式ExcelApp.Calculate()# 关闭文件wb.Close(True)# 退出Excel应用程序ExcelApp.Quit()```这段代码使用openpyxl创建一个包含公式的Excel文件,并使用`win32com`模块的`win32`模块打开Excel应用程序,计算公式后关闭Excel应用程序。
在运行此代码之前,你需要安装`openpyxl`和`pywin32`库。
请注意,这种方法依赖于用户计算机上安装的Excel应用程序,因此它不适用于没有安装Excel的环境。
巧用pythonwin32com模块操作excel文件
巧⽤pythonwin32com模块操作excel⽂件 Python操作excel⽂件的第三⽅库有很多,⼩爬就常⽤openPyxl库来操作已有的excel⽂件,它对xlsx、xlsm等格式的⽀持都较好。
可openPyxl也有不⾜,它难以实习VBA中的很多功能。
如果我们平⽇⾥对VBA语法很熟悉,则可以通过win32com.client来操纵excel⽂件,语法⾮常类似。
之所以不直接使⽤VBA,是因为VBA擅长跟excel打交道,不擅长跟外部应⽤打交道。
⼩爬最近就遇到这样⼀个⾃动化场景:先利⽤python爬⾍的⽅法,获取到服务器端的多个excel⽂件,然后对这些excel⽂件进⾏跨表操作,单纯的VBA实现起来⽐较繁琐,⽤python和VBA各实现⼀部分不利于脚本的封装,割裂感较强。
话不多说,我们看看如何⽤win32com来控制excel,⾸先我们需要⽤pip安装pywin32库,之后就可以使⽤了:import win32com.client下⾯的代码演⽰了⼀些常规的语法操作,与vba如出⼀辙,只是需要代码pythonic:import win32com.clientimport osbase_dir=os.path.dirname(os.path.abspath(__file__)) # 获取当前路径xlApp = win32com.client.Dispatch('Excel.Application')xlApp.Visible=1 # 显⽰excel界⾯filename="test.xlsx"fullPath=os.path.join(base_dir,filename) # 得到完整的filepathxlBook = xlApp.Workbooks.Open(fullPath, ReadOnly = False) #打开对饮的excel⽂件sht = xlBook.Worksheets('Sheet1') # 打开对应名称的sheetedRange.ClearContents() # 对当前使⽤区域清除内容nrows=edRange.Rows.Count # 获取使⽤区域的⾏数edRange.Copy() #复制sht.Activate() # 激活当前⼯作表光这些还不够,⽐如我们希望实现excel的复制&粘贴值操作,vba的语法类似这样:Sub宏1()'Range("A1").SelectSelection.CurrentRegion.SelectSelection.CopySelection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=FalseEnd Sub这段VB风格的代码如何pythonic且不出错呢,你可能⾸先会想这样改造:Range("A1").Select()Selection.CurrentRegion.Select()Selection.Copy()Selection.PasteSpecial(Paste=xlPasteValues, Operation=xlNone, SkipBlanks=False, Transpose=False)VBA中默认你操作的当前worksheet,所以可以直接使⽤Range对象,Selection对象,但是python中不能直接这样简写,改造和简化后应该是:sht.Range("A1").CurrentRegion.Copy()sht.Range("A1").CurrentRegion.PasteSpecial(Paste=xlPasteValues, Operation=xlNone, SkipBlanks=False, Transpose=False)其实这样还是会报错,因为python并⽆法知道xlPasteValues、xlNone这些常量到底为多少,因为我们没有提前定义它。
使用Python操作Office——EXCEL
使⽤Python操作Office——EXCEL ⾸先介绍下office win32 com接⼝,这个是MS为⾃动化提供的操作接⼝,⽐如我们打开⼀个EXCEL⽂档,就可以在⾥⾯编辑VB脚本,实现我们⾃⼰的效果。
对于这种⼀本万利的买卖,Python怎么能放过,它内置了对于win32 com接⼝的⽀持,我们可以⽅便的控制。
要想熟悉使⽤office win32 com接⼝,没有什么⽐MS提供的API⽂档更加权威了。
下⾯我们以操作EXCEL⽂档为例: ⼀、对Excel⽂件进⾏写⼊操作:#!/usr/bin/python3# -*- coding:utf-8 -*-__author__ = 'mayi'# 导⼊模块import win32com.client# 打开ExcelApplication = win32com.client.Dispatch("Excel.Application")# 或者使⽤下⾯的⽅法,使⽤启动独⽴的进程:# Application = win32com.client.DispatchEx("Excel.Application")# 后台运⾏,显⽰程序界⾯,不警告Application.Visible = 1 # 调试阶段建议打开Application.DisplayAlerts = 0# 新建⼀个⽂档Workbook = Application.Workbooks.Add()# 打开⼀个⽂档Workbook = Application.Workbooks.Open("F:\\test.xlsx")# 根据⼯作表名Base = Workbook.Worksheets("Sheet1")# 根据⼯作表顺序# Base = Workbook.Worksheets(1)# 接受当前⼯作表# Base = Workbook.ActiveSheet# 添加内容: 0.0, 0.5, 1.0Base.Cells(1, 1).Value = 'Values'Base.Cells(1, 2).Value = 0.0Base.Cells(1, 3).Value = 0.5Base.Cells(1, 4).Value = 1.0Workbook.SaveAs("F:\\test.xlsx")# 关闭⽂档Workbook.Close()# 退出ExcelApplication.Quit() ⼆、对Excel⽂件进⾏读取操作:#!/usr/bin/python3# -*- coding:utf-8 -*-__author__ = 'mayi'# 导⼊模块import win32com.client# 打开ExcelApplication = win32com.client.Dispatch("Excel.Application")# 或者使⽤下⾯的⽅法,使⽤启动独⽴的进程:# Application = win32com.client.DispatchEx("Excel.Application")# 后台运⾏,显⽰程序界⾯,不警告Application.Visible = 1 # 调试阶段建设打开Application.DisplayAlerts = 0# 打开⼀个⽂档Workbook = Application.Workbooks.Open("F:\\test.xlsx")Base = Workbook.Worksheets(1)# 接受当前⼯作表Base = Workbook.ActiveSheet#列数ncols = 0while True:cell_value = Base.Cells(1, ncols + 1).Valueif cell_value:ncols += 1else:break# ⾏数nrows = 0while True:cell_value = Base.Cells(nrows + 2, 1).Value # 第⼀⾏表头 if cell_value:for col in range(ncols):cell_key = Base.Cells(1, col + 1).Valuecell_value = Base.Cells(nrows + 2, col + 1).Valueprint(cell_key, "=>", cell_value, end = "\t")print("")nrows += 1else:break# 关闭⽂档Workbook.Close()# 退出ExcelApplication.Quit() 假设test.xlsx⽂件中的内容如下: 则,运⾏以上程序输出:序号 => 1.0 姓名 => 张三姓别 => 男地址 => 北京序号 => 2.0 姓名 => 李四姓别 => ⼥地址 => 上海序号 => 3.0 姓名 => 王五姓别 => 男地址 => 南京。
Python处理Excel效率高十倍(下篇)通篇硬干货,再也不用加班啦
Python处理Excel效率高十倍(下篇)通篇硬干货,再也不用加班啦《用Python处理Excel表格》下篇来啦!身为工作党或学生党的你,平日里肯定少不了与Excel表格打交道的机会。
当你用Excel处理较多数据时,还在使用最原始的人工操作吗?现在教你如何用Python处理Excel,从此处理表格再也不加班,时间缩短数十倍!上篇我们进行了一些事前准备,目的是用Python提取Excel表中的数据。
而这一篇便是在获取数据的基础上,对Excel表格的实操处理。
操作创建新的excel第9行代码用来指定创建的excel的活动表的名字:·不写第9行,默认创建sheet·写了第9行,创建指定名字的sheet表import osimport openpyxlpath = r'C:\Users\asuka\Desktop'os.chdir(path) # 修改工作路径workbook = openpyxl.Workbook()sheet = workbook.activesheet.title = '1号sheet'workbook.save('1.xlsx') 修改单元格、excel另存为第9行代码,通过给单元格重新赋值,来修改单元格的值第9行代码的另一种写法sheet['B1'].value = 'age'第10行代码,保存时如果使用原来的(第7行)名字,就直接保存;如果使用了别的名字,就会另存为一个新文件import osimport openpyxlpath = r'C:\Users\asuka\Desktop'os.chdir(path) # 修改工作路径workbook = openpyxl.load_workbook('test.xlsx') # 返回一个workbook数据类型的值sheet = workbook.active # 获取活动表sheet['A1'] = 'name'workbook.save('test.xlsx')添加数据插入有效数据使用append()方法,在原来数据的后面,按行插入数据import osimport openpyxlpath = r'C:\Users\asuka\Desktop'os.chdir(path) # 修改工作路径workbook = openpyxl.load_workbook('test.xlsx') # 返回一个workbook数据类型的值sheet = workbook.active # 获取活动表print('当前活动表是:' + str(sheet))data = [ ['素子',23], ['巴特',24], ['塔奇克马',2]]for row in data: sheet.append(row) # 使用append 插入数据workbook.save('test.xlsx')插入空行空列·insert_rows(idx=数字编号, amount=要插入的行数),插入的行数是在idx行数的下方插入·insert_cols(idx=数字编号, amount=要插入的列数),插入的位置是在idx列数的左侧插入import osimport openpyxlpath = r'C:\Users\asuka\Desktop'os.chdir(path) # 修改工作路径workbook = openpyxl.load_workbook('test.xlsx') # 返回一个workbook数据类型的值sheet = workbook.active # 获取活动表print('当前活动表是:' + str(sheet))sheet.insert_rows(idx=3, amount=2)sheet.insert_cols(idx=2,amount=1)workbook.save('test.xlsx')删除行、列·delete_rows(idx=数字编号, amount=要删除的行数)·delete_cols(idx=数字编号, amount=要删除的列数)import osimport openpyxlpath = r'C:\Users\asuka\Desktop'os.chdir(path) # 修改工作路径workbook = openpyxl.load_workbook('test.xlsx') # 返回一个workbook数据类型的值sheet = workbook.active # 获取活动表print('当前活动表是:' + str(sheet))sheet.delete_rows(idx=10) # 删除第10行sheet.delete_cols(idx=1, amount=2) # 删除第1列,及往右共2列workbook.save('test.xlsx')移动指定区间的单元格(move_range)move_range(“数据区域”,rows=,cols=):正整数为向下或向右、负整数为向左或向上import osimport openpyxlpath = r'C:\Users\asuka\Desktop'os.chdir(path) # 修改工作路径workbook = openpyxl.load_workbook('test.xlsx') # 返回一个workbook数据类型的值sheet = workbook.active # 获取活动表print('当前活动表是:' + str(sheet))sheet.move_range('D11:F12',rows=0,cols=-3) # 移动D11到F12构成的矩形格子workbook.save('test.xlsx')字母列号与数字列号之间的转换核心代码from openpyxl.utils import get_column_letter, column_index_from_string# 根据列的数字返回字母print(get_column_letter(2)) # B# 根据字母返回列的数字print(column_index_from_string('D')) # 4举个例子:import osimport openpyxlfrom openpyxl.utils import get_column_letter, column_index_from_stringpath = r'C:\Users\asuka\Desktop'os.chdir(path) # 修改工作路径workbook = openpyxl.load_workbook('2.xlsx') # 返回一个workbook数据类型的值sheet = workbook.active # 获取活动表print('当前活动表是:' + str(sheet))# 根据列的数字返回字母print(get_column_letter(2)) # B# 根据字母返回列的数字print(column_index_from_string('D')) # 4字体样式查看字体样式import osimport openpyxlimport openpyxl.stylespath = r'C:\Users\asuka\Desktop'os.chdir(path) # 修改工作路径workbook = openpyxl.load_workbook('test.xlsx') # 返回一个workbook数据类型的值sheet = workbook.active # 获取活动表print('当前活动表是:'+str(sheet))cell = sheet['A1']font = cell.fontprint('当前单元格的字体样式是')print(, font.size, font.bold, font.italic, font.color)'''当前活动表是:<Worksheet '1号sheet'>当前单元格的字体样式是等线11.0 False False <openpyxl.styles.colors.Color object>Parameters:rgb=None, indexed=None, auto=None, theme=1, tint=0.0, type='theme'''' 修改字体样式openpyxl.styles.Font(name=字体名称,size=字体大小,bold=是否加粗,italic=是否斜体,color=字体颜色)其中,字体颜色中的color是RGB的16进制表示import osimport openpyxlimport openpyxl.stylespath = r'C:\Users\asuka\Desktop'os.chdir(path) # 修改工作路径workbook = openpyxl.load_workbook('test.xlsx') # 返回一个workbook数据类型的值sheet = workbook.active # 获取活动表print(sheet)cell = sheet['A1']cell.font = openpyxl.styles.Font(name='微软雅黑', size=20, bold=True, italic=True, color='FF0000')workbook.save('test.xlsx')再者,可以使用for循环,修改多行多列的数据,在这里介绍了获取的方法import osimport openpyxlimport openpyxl.stylespath = r'C:\Users\asuka\Desktop'os.chdir(path) # 修改工作路径workbook = openpyxl.load_workbook('test.xlsx') # 返回一个workbook数据类型的值sheet = workbook.active # 获取活动表print(sheet)cell = sheet['A']for i in cell: i.font = openpyxl.styles.Font(name='微软雅黑', size=20, bold=True, italic=True, color='FF0000')workbook.save('test.xlsx')设置对齐格式Alignment(horizontal=水平对齐模式,vertical=垂直对齐模式,text_rotation=旋转角度,wrap_text=是否自动换行)水平对齐:'distributed’,'justif y’,'center’,'left’,'centerContinuous’,'right,'general’垂直对齐:'bottom’,'distributed’,'justify’,'center’,'top’import osimport openpyxl.stylespath = r'C:\Users\asuka\Desktop'os.chdir(path) # 修改工作路径workbook = openpyxl.load_workbook('test.xlsx') # 返回一个workbook数据类型的值sheet = workbook.active # 获取活动表print('当前活动表是:' + str(sheet))cell = sheet['A1']alignment = openpyxl.styles.Alignment(horizontal='center', vertical='center', text_rotation=0, wrap_text=True)cell.alignment = alignmentworkbook.save('test.xlsx')当然,你仍旧可以调用for循环来实现对多行多列的操作import osimport openpyxl.stylespath = r'C:\Users\asuka\Desktop'os.chdir(path) # 修改工作路径workbook = openpyxl.load_workbook('test.xlsx') # 返回一个workbook数据类型的值sheet = workbook.active # 获取活动表print('当前活动表是:' + str(sheet))cell = sheet['A']alignment = openpyxl.styles.Alignment(horizontal='center', vertical='center',text_rotation=0, wrap_text=True)for i in cell: i.alignment = alignment workbook.save('test.xlsx')设置行高列宽设置行列的宽高:·row_dimensions[行编号].height = 行高·column_dimensions[列编号].width = 列宽import osimport openpyxlimport openpyxl.stylespath = r'C:\Users\asuka\Desktop'os.chdir(path) # 修改工作路径workbook = openpyxl.load_workbook('test.xlsx') # 返回一个workbook数据类型的值sheet = workbook.active # 获取活动表print('当前活动表是:' + str(sheet))# 设置第1行的高度sheet.row_dimensions[1].height = 50# 设置B列的卷度sheet.column_dimensions['B'].width = 20workbook.save('test.xlsx')设置所有单元格(显示的结果是设置所有,有数据的单元格的)from openpyxl import load_workbookfrom openpyxl.utils import get_column_letterimport osos.chdir(r'C:\Users\asuka\Desktop')workbook = load_workbook('1.xlsx')print(workbook.sheetnames) # 打印所有的sheet表ws = workbook[workbook.sheetnames[0]] # 选中最左侧的sheet表width = 2.0 # 设置宽度height = width * (2.2862 / 0.3612) # 设置高度print('row:', ws.max_row, 'column:', ws.max_column) # 打印行数,列数for i in range(1, ws.max_row + 1): ws.row_dimensions[i].height = heightfor i in range(1, ws.max_column + 1): ws.column_dimensions[get_column_letter(i)].width = widthworkbook.save('test.xlsx')合并、拆分单元格合并单元格有下面两种方法,需要注意的是,如果要合并的格子中有数据,即便python没有报错,Excel打开的时候也会报错。
python exportasfixedformat详解 -回复
python exportasfixedformat详解-回复关于Python中的exportAsFixedFormat详解在处理大量文档时,将其转换为固定格式可能是一种非常有用的功能。
Python的exportAsFixedFormat方法提供了一种将文档转换为固定格式(如PDF)的方式。
本文将详细介绍exportAsFixedFormat方法,并提供一步一步的解释。
1. 什么是exportAsFixedFormat方法?exportAsFixedFormat是一种Microsoft Office的方法,它允许将Microsoft Office的文档(如Word文档、Excel表格和PowerPoint演示文稿)转换为以固定格式输出。
在Python中,我们可以使用相应的库(如pywin32)来调用该方法并执行转换。
2. 安装所需的库在开始之前,我们首先需要安装所需的库。
打开终端并输入以下命令来安装pywin32库:pip install pywin323. 使用exportAsFixedFormat方法要使用exportAsFixedFormat方法,我们首先需要导入所需的库,并创建一个与Microsoft Office应用程序的连接。
下面是一个示例代码:pythonimport win32com.client as win32# 创建与Word应用程序的连接word_application =win32.gencache.EnsureDispatch('Word.Application')word_application.Visible = False# 打开要转换的文档document =word_application.Documents.Open("path_to_word_document.docx ")# 调用exportAsFixedFormat方法,将文档转换为PDF格式document.ExportAsFixedFormat("path_to_output_pdf.pdf", 17)# 关闭文档和应用程序document.Close()word_application.Quit()代码解释:a. 我们首先导入win32com.client库,并创建一个与Word应用程序的连接。
Pythonwin32com操作Excel简单方法
Pythonwin32com操作Excel简单⽅法from win32com.client import Dispatchimport win32com.clientclass easyExcel:"""A utility to make it easier to get at Excel. Rememberingto save the data is your problem, as is error handling.Operates on one workbook at a time."""def__init__(self, filename=None): #打开⽂件或者新建⽂件(如果不存在的话)self.xlApp = win32com.client.Dispatch('Excel.Application')if filename:self.filename = filenameself.xlBook = self.xlApp.Workbooks.Open(filename)else:self.xlBook = self.xlApp.Workbooks.Add()self.filename = ''def save(self, newfilename=None): #保存⽂件if newfilename:self.filename = newfilenameself.xlBook.SaveAs(newfilename)else:self.xlBook.Save()def close(self): #关闭⽂件self.xlBook.Close(SaveChanges=0)del self.xlAppdef getCell(self, sheet, row, col): #获取单元格的数据"Get value of one cell"sht = self.xlBook.Worksheets(sheet)return sht.Cells(row, col).Valuedef setCell(self, sheet, row, col, value): #设置单元格的数据"set value of one cell"sht = self.xlBook.Worksheets(sheet)sht.Cells(row, col).Value = valuedef setCellformat(self, sheet, row, col): #设置单元格的数据"set value of one cell"sht = self.xlBook.Worksheets(sheet)sht.Cells(row, col).Font.Size = 15#字体⼤⼩sht.Cells(row, col).Font.Bold = True#是否⿊体sht.Cells(row, col).Name = "Arial"#字体类型sht.Cells(row, col).Interior.ColorIndex = 3#表格背景#sht.Range("A1").Borders.LineStyle = xlDoublesht.Cells(row, col).BorderAround(1,4)#表格边框sht.Rows(3).RowHeight = 30#⾏⾼sht.Cells(row, col).HorizontalAlignment = -4131 #⽔平居中xlCentersht.Cells(row, col).VerticalAlignment = -4160 #def deleteRow(self, sheet, row):sht = self.xlBook.Worksheets(sheet)sht.Rows(row).Delete()#删除⾏sht.Columns(row).Delete()#删除列def getRange(self, sheet, row1, col1, row2, col2): #获得⼀块区域的数据,返回为⼀个⼆维元组"return a 2d array (i.e. tuple of tuples)"sht = self.xlBook.Worksheets(sheet)return sht.Range(sht.Cells(row1, col1), sht.Cells(row2, col2)).Valuedef addPicture(self, sheet, pictureName, Left, Top, Width, Height): #插⼊图⽚"Insert a picture in sheet"sht = self.xlBook.Worksheets(sheet)sht.Shapes.AddPicture(pictureName, 1, 1, Left, Top, Width, Height)def cpSheet(self, before): #复制⼯作表"copy sheet"shts = self.xlBook.Worksheetsshts(1).Copy(None,shts(1))def inserRow(self,sheet,row):sht = self.xlBook.Worksheets(sheet)sht.Rows(row).Insert(1)#下⾯是⼀些测试代码。
使用Python导出Excel图表以及导出为图片的方法
使⽤Python导出Excel图表以及导出为图⽚的⽅法本篇讲下如何使⽤纯python代码将excel 中的图表导出为图⽚。
这⾥需要使⽤的模块有win32com、pythoncom模块。
⽹上经查询有⼈已经写好的模块pyxlchart,具体代码如下:from win32com.client import Dispatchimport osimport pythoncomclass Pyxlchart(object):"""This class exports charts in an Excel Spreadsheet to the FileSystemwin32com libraries are required."""def __init__(self):pythoncom.CoInitialize()self.WorkbookDirectory = ''self.WorkbookFilename = ''self.GetAllWorkbooks = Falseself.SheetName = ''self.ChartName = ''self.GetAllWorkbookCharts = Falseself.GetAllWorksheetCharts = Falseself.ExportPath = ''self.ImageFilename = ''self.ReplaceWhiteSpaceChar = '_'self.ImageType = 'jpg'def __del__(self):passdef start_export(self):if self.WorkbookDirectory == '':return "WorkbookDirectory not set"else:self._export()def _export(self):"""Exports Charts as determined by the settings in class variabels."""excel = Dispatch("excel.application")excel.Visible = Falsewb = excel.Workbooks.Open(os.path.join(self.WorkbookDirectory ,self.WorkbookFilename))self._get_Charts_In_Worksheet(wb,self.SheetName,self.ChartName)wb.Close(False)excel.Quit()def _get_Charts_In_Worksheet(self,wb,worksheet = "", chartname = ""):if worksheet != "" and chartname != "":sht = self._change_sheet(wb,worksheet)cht = sht.ChartObjects(chartname)self._save_chart(cht)returnif worksheet == "":for sht in wb.Worksheets:for cht in sht.ChartObjects():if chartname == "":self._save_chart(cht)else:if chartname == :self._save_chart(cht)else:sht = wb.Worksheets(worksheet)for cht in sht.ChartObjects():if chartname == "":self._save_chart(cht)else:if chartname == :self._save_chart(cht)def _change_sheet(self,wb,worksheet):try:return wb.Worksheets(worksheet)except:raise NameError('Unable to Select Sheet: ' + worksheet + ' in Workbook: ' + )def _save_chart(self,chartObject):imagename = self._get_filename()savepath = os.path.join(self.ExportPath,imagename)print savepathchartObject.Chart.Export(savepath,self.ImageType)def _get_filename(self,chartname):"""Replaces white space in self.WorkbookFileName with the value given in self.ReplaceWhiteSpaceCharIf self.ReplaceWhiteSpaceChar is an empty string then self.WorkBookFileName is left as is"""if self.ImageFilename == '':self.ImageFilename == chartnameif self.ReplaceWhiteSpaceChar != '':chartname.replace(' ',self.ReplaceWhiteSpaceChar)if self.ImageFilename != "":return self.ImageFilename + "_" + chartname + "." + self.ImageTypeelse:return chartname + '.' + self.ImageTypeif __name__ == "__main__":xl = Pyxlchart()xl.WorkbookDirectory = "\\\\maawtns01\\discipline\\procurement\\MATERIEL\\Raw Material\\Data Management\\Hawk"xl.WorkbookFilename = "Hawk Workability KPI.xlsm"xl.SheetName = ""xl.ImageFilename = "MyChart1"xl.ExportPath = "d:\\pycharts"xl.ChartName = ""xl.start_export()print "This file does not currently allow direct access"print "Please import PyXLChart and run start_export()"这⾥还使⽤Excel vba将chart另存为图⽚篇中创建的chart_column.xlsx表,使⽤上⾯的模块的⽅法如下:from pyxlchart import Pyxlchartxl = Pyxlchart()xl.WorkbookDirectory = "D:\\"xl.WorkbookFilename = "chart_column.xlsx"xl.SheetName = ""#xl.ImageFilename = "MyChart1"xl.ExportPath = "d:\\"xl.ChartName = ""xl.start_export()由于有该表⾥有多张图表,所以上⾯未指定xl.ImageFilename ,使⽤⽰例如下:**Excel vba将chart另存为图⽚** python下使⽤xlswriter模块,可以轻松在excel 中创建图⽚,不过想实现将⽣成的chart图表导出为图⽚,在email 中导⼊图⽚的⽬标。
Python实现对excel文件列表值进行统计的方法
Python实现对excel⽂件列表值进⾏统计的⽅法本⽂实例讲述了Python实现对excel⽂件列表值进⾏统计的⽅法。
分享给⼤家供⼤家参考。
具体如下:#!/usr/bin/env python#coding=gbk#此PY⽤来统计⼀个execl⽂件中的特定⼀列的值的分类import win32com.clientfilename=raw_input("请输⼊要统计⽂件的详细地址:")flag=0 #⽤于判断⽂件名如果不带‘⽇'就为 0if ' c8 d5' in filename:flag=1print 50*'='+'\n\t 请稍等,程序正在统计中。
'try:xls=win32com.client.Dispatch('et.Application')try:xlsfile=xls.Workbooks.Open(filename)#打开指定的⽂件,⼀般打开的是sheet1sheet=xlsfile.Worksheets('Sheet1')except:print '⽂件找开错误!'exit(1)print '程序正在⾃动退出。
'if sheet.Cells(3,6).Value!=u'业务类型' or sheet.Cells(3,3).Value!=u'转办单位':print '您输⼊的表格已不是默认的表格,数据格式有误'exit(1) #这个判断是当⽂件中的特定列改变时,直接退出程序i=4dept=sheet.Cells(i,3).Valuetype=sheet.Cells(i,6).Valuetypelist=[] #⽤于存放数据的列表,下⾯就是取sheet表⾥的某⼀列数据deptlist=[] #⽤于存放转办单位的列表while type:typelist.append(type)deptlist.append(dept)i=i+1type=sheet.Cells(i,6).Valuedept=sheet.Cells(i,3).Value#存放列的数据到⼆个列表中counts=len(typelist) #总件数if counts==0:print '输⼊的⽂件统计结果为0,是否⽂件的格式有误?'exit(1)typelist=[(i,typelist.count(i)) for i in set(typelist)]departmentlist=[]delchar='0123456789' #删除取出列表中有可能带数字分开字段有空格的话for i in deptlist[:]:i=''.join([j for j in i if j not in delchar])while '.' in i: i=i.replace('.',' ')deptlist+=i.split()deptlist=deptlist[counts:]deptlist=[(i,deptlist.count(i)) for i in set(deptlist)]#下⾯是打印格式等。
pythonxlwings调用vba以及使用windowapi调用vba脚本
pythonxlwings调⽤vba以及使⽤windowapi调⽤vba脚本python xlwings 调⽤vba以及使⽤windowapi调⽤vba脚本使⽤win32com调⽤vba脚本程序如下:import win32com.clientfilepathb = r"C:\Users\user\Desktop\Excel VBA快速⼯具\拆分本⼯作簿\拆分本⼯作簿.xlsm"xls = win32com.client.Dispatch("Excel.Application")xls.Workbooks.Open(filepathb)xls.Application.Run("拆分本⼯作簿")xls.Application.Quit()但是需要持续写⼊数据的时候使⽤win32com有不是特别⽅便。
使⽤xlwings库调⽤vba脚本⽽且在⼀个持续写⼊excel⽂本中,偏向会去使⽤xlwings库调⽤相关的库⽽且xlwings于pywin32库的结合也是较好的。
调⽤不同层级的api如sheet、workbook、application上的。
问题时,在利⽤api调⽤vba脚本的时候需要激活在宏所在的⼯作簿。
import xlwings as xwfilepath=r"C:\Users\user\Desktop\Excel VBA快速⼯具\拆分本⼯作簿\拆分本⼯作簿.xlsm"app = xw.App(visible=True, add_book=False)wb = app.books.open(filepath)wb.activate() #⼯作簿需要被激活后才能调⽤vba脚本。
wb.api.Application.Run("拆分本⼯作簿")wb.save()wb.close()app.quit()app.kill()。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1. Python 操作 Excel 的函数库
我主要尝试了 3 种读写 Excel 的方法:
1> xlrd, xlwt, xlutils: 这三个库的好处是不需要其它支持,在任何操作系统上都可以使用。
xlrd 可以读取 .xls, .xlsx 文件,非常好用;但因为 xlwt 不能直接修改 Excel 文档,必须得复制一份然后另存为其它文件,而且据说写复杂格式的 Excel 文件会出现问题,所以我没有选它来写 Excel 文件。
2> openpyxl: 这个库也是不需要其它支持的,而且据说对 Office 2007 格式支持得更好。
遗憾地是,我经过测试,发现它加载 Excel 文件的效率比 xlrd 慢 3 倍以上,内存使用在 10 倍以上,于是就放弃了。
3> win32com: Python Win32 扩展,这个库需要运行环境为 Windows+Office 对应版
本。
由于 Python Win32 扩展只是把 COM 接口包装了一下,可以视为与 VBA 完全相同,不会有读写格式上的问题。
尝试了一下用 win32com 读取 Excel 文件,效率还是比 xlrd 慢一些。
由于读取效率上 xlrd > win32com > openpyxl,所以我自然选择了 xlrd 用来读取统计报表;而最终输出的报表格式较复杂,所以选择了 win32com 直接操作 Excel 文件。
2. Python 里的关系型数据库
SQLite是一个非常轻量级的关系型数据库,很多语言和平台都内置 SQLite 支持,也是 iOS 和Android 上的默认数据库。
Python 的标准库里也包含了sqlite3库,用起来非常方便。
3. 用 xlrd 读取 Excel 并插入数据库样例
如果数据量不大,直接用 Python 内部数据结构如 dict, list 就够了。
但如果读取的几张表数据量都较大,增加个将数据插入数据库的预处理过程就有很大好处。
一是避免每次调试都要进行耗时较长的 Excel 文件载入过程;二是能充分利用数据库的索引和 SQL 语句强大功能进行快速数据分析。
#!/usr/bin/python
# -*- coding: gbk -*-
import xlrd
import sqlite3
# 打开数据库文件
device_city_db = sqlite3.connect('device_city.db')
cursor = device_city_db.cursor()
# 建表
cursor.execute('DROP TABLE IF EXISTS device_city')
cursor.execute('CREATE TABLE device_city (device_id char(16) PRIMARY KEY, city
varchar(16))')
# 打开 device 相关输入 Excel 文件
device_workbook = xlrd.open_workbook('输入.xlsx')
device_sheet = device_workbook.sheet_by_name('设备表')
# 逐行读取 device-城市映射文件,并将指定的列插入数据库
for row in range(1, device_sheet.nrows):
device_id = device_sheet.cell(row, 6).value
if len(device_id) > 16:
device_id = device_id[0:16]
if len(device_id) == 0:
continue
city = device_sheet.cell(row, 10).value
# 避免插入重复记录
cursor.execute('SELECT * FROM device_city WHERE device_id=?', (device_id,))
res = cursor.fetchone()
if res == None:
cursor.execute('INSERT INTO device_city (device_id, city) VALUES (?, ?)',
(device_id, city))
else:
if res[1] != city:
print'%s, %s, %s, %s' % (device_id, city, res[0], res[1])
device_city_mit()
4. 将结果写入 Excel 文件样例
使用 win32com 写入 Excel 的时候要注意,一定要记得退出 Excel,否则下次运行会出错。
这需要增加异常处理语句,我这里偷了个懒,出了异常后要手动杀死任务管理器中的 excel 进程。
至于 win32com 中类的接口,可以从 MSDN 网站查阅。
import win32com.client as win32
import os
excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = False
# 貌似这里只能接受全路径
workbook = excel.Workbooks.Open(os.path.join(os.getcwd(), '输出.xlsx'))
month_sheet = workbook.Worksheets(1)
# 计算文件中实际有内容的行数
nrows = month_sheet.Range('A65536').End(win32.constants.xlUp).Row
# 操作 Excel 单元格的值
for row in range(5, nrows-4):
month_sheet.Cells(row, 1).Value += something
# 保存工作簿
workbook.Save()
# 退出 Excel
excel.Application.Quit()。