python用win32com处理excel表格

合集下载

python用openpyxl操作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的操作方法

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用法

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,公式全部丢失

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的一些特殊功能

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的操作

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)教程

使⽤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的方法

使⽤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页实现了信息的写⼊。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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()。

相关文档
最新文档