当前位置:   article > 正文

使用Python处理excel表格(openpyxl)教程_openpyxl 官网

openpyxl 官网

      现在有个小任务,需要处理excel中的数据。其实就是简单的筛选,excel玩的不熟练,而且需要处理的表有70多个,于是想着写个脚本处理一下吧。python中的openpyxl包可以轻松实现读写excel文件,下面简单介绍一下过程。

1.安装openpyxl通过pip或者easy_install均可安装openpyxl。openpyxl官网:https://openpyxl.readthedocs.org/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()   

获得第一个sheet

ws = 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. for rx in range(0,ws.get_highest_row()):
  3. temp_list = []
  4. money = ws.cell(row = rx,column = 1).value
  5. kind = ws.cell(row = rx,column = 2).value
  6. temp_list = [money , kind]
  7. #print temp_list
  8. data_dic.append(temp_list)
  9. for l in data_dic:
  10. print l[0],l[1]
3.写入xlsx比如数据存在上边定义的data_dic中
  1. out_filename = r'result.xlsx'
  2. outwb = Workbook()
  3. ew = ExcelWriter(workbook = outwb)
  4. ws = outwb.worksheets[0]
  5. ws.title = "res"
  6. i=1
  7. for data_l in data_dic:
  8. for x in range(0,len(data_l)):
  9. #col = get_column_letter(x)
  10. ws.cell(column = x+1 , row = i , value = "%s" % data_l[x])
  11. i+=1
  12. ew.save(filename = out_filename)

再增加一个sheet写内容

  1. ws2 = outwb.create_sheet(title = 's2')
  2. for data_l in data_dic:
  3. for x in range(0,len(data_l)):
  4. ws2.cell(column = x+1 , row = i , value = "%s" % data_l[x])
  5. i+=1
  6. ew.save(filename = out_filename)

4.中文编码问题表格中的值,openpyxl会自动转换为不同的类型,有些表格中会有中文出现,就需要进行相应的转码。可以写一个函数专门处理转码,需要时调用

  1. def gbk2utf(in_data , tag):
  2. if 1 == tag:
  3. return in_data.encode('gbk').decode('gbk')
  4. elif 0 == tag:
  5. return in_data.encode('gbk').decode('gbk').encode('utf8')

当原始的excel文件是gbk编码时,就需要tag=0的方式去处理,

因为读入后是gbk的编码,需要先encode为gbk再decode为unicode,再encode为utf8,就可以显示了。

 

【实战】

 

介绍下自己需要处理的表格情况,这是一个关于酬金的表格,每月都有,它的格式都是固定的,所以完全可以利用Python写一个脚本,来实现自己的需求,这样一来,每月只需敲击一个命令行,就能生成自己想要的表格,节约不少时间!~因为酬金分为很多大项,大项中又有很多小项,而我要做的就是把大项中的小项进行金额汇总,然后在写入一个新的表格,表格中是每个大项汇总的数据,以此生成我们需要进行绘图的数据。

这里直接粘贴源代码,因为可能涉及敏感信息,故有XXXX出现以代替原始注释,图片还有马赛克出现:

  1. from openpyxl import Workbook
  2. from openpyxl import load_workbook
  3. wb = load_workbook("C:/Users/Administrator/Desktop/酬金.xlsx")
  4. ws = wb.get_sheet_by_name('酬金明细')
  5. ws_rows_len = len(ws.rows) #行数
  6. ws_columns_len = len(ws.columns) #列数
  7. #xxxxxxx
  8. shop_name_column = 5
  9. #xxxxx
  10. user_start = 8
  11. user_end = 23
  12. #xxxxx
  13. terminal_start = 24
  14. terminal_end = 35
  15. #xxxxx
  16. infomation_start = 36
  17. infomation_end = 42
  18. #xxxx
  19. group_start = 43
  20. group_end = 45
  21. #xxxx
  22. commission_start = 46
  23. commission_end = 60
  24. #xxxx
  25. stimulate_start = 61
  26. stimulate_end = 65
  27. #xxxx
  28. net_start = 66
  29. net_end = 67
  30. #xxxxxxx
  31. agreement_start = 68
  32. agreement_end = 70
  33. #数据有效行从第四行开始
  34. start_row = 4
  35. temp_data = []
  36. for row in range(start_row, ws_rows_len+1):
  37. t = 0
  38. temp_data.append(ws.cell(row=row,column=shop_name_column).value)
  39. #计算xxxxxx总金额
  40. for column in range(user_start,user_end+1):
  41. t += ws.cell(row=row,column=column).value
  42. temp_data.append(t)
  43. t = 0
  44. #计算xxxx总金额
  45. for column in range(terminal_start,terminal_end+1):
  46. t += ws.cell(row=row,column=column).value
  47. temp_data.append(t)
  48. t = 0
  49. #计算xxxx发展总金额
  50. for column in range(infomation_start,infomation_end+1):
  51. t += ws.cell(row=row,column=column).value
  52. temp_data.append(t)
  53. t = 0
  54. #计算xxxx总金额
  55. for column in range(group_start,group_end+1):
  56. t += ws.cell(row=row,column=column).value
  57. temp_data.append(t)
  58. t = 0
  59. #计算xxxxx总金额
  60. for column in range(commission_start,commission_end+1):
  61. t += ws.cell(row=row,column=column).value
  62. temp_data.append(t)
  63. t = 0
  64. #计算xxxxx总金额
  65. for column in range(stimulate_start,stimulate_end+1):
  66. t += ws.cell(row=row,column=column).value
  67. temp_data.append(t)
  68. t = 0
  69. #计算xxxxx总金额
  70. for column in range(net_start,net_end+1):
  71. t += ws.cell(row=row,column=column).value
  72. temp_data.append(t)
  73. t = 0
  74. #计算xxxxxxxx总金额
  75. for column in range(agreement_start,agreement_end+1):
  76. t += ws.cell(row=row,column=column).value
  77. temp_data.append(t)
  78. #以上代码为获取酬金原始数据进行汇总
  79. #下面将汇总得到的数据插入到一个新的数据表中
  80. reward_ws_hearder = ['xxxx','xxxxx','xxxx','xxxxx','xxxxxx','xxxx','xxxx','xxxx','xxxx']
  81. reward_ws = wb.create_sheet(title='酬金分析')
  82. reward_ws.append(reward_ws_hearder)
  83. start_list = 0
  84. list_step = 9
  85. end_list = start_list + list_step
  86. for i in range(0,ws_rows_len-start_row+1):
  87. reward_ws.append(temp_data[start_list:end_list])
  88. start_list += list_step
  89. end_list = start_list + list_step
  90. wb.save("C:/Users/Administrator/Desktop/酬金1.xlsx") #另存为另一个表,防止意外破坏原始数据。

代码写得有点乱,仅供学习openpyxl参考。通过上述的代码,实现了一个新表存放了汇总的数据(原始数据有很多列,现在汇总到一起了) 
这里写图片描述 
被马赛克涂抹的左边A列是名称,首行则是业务列别。可见数据则是汇总金额。如果我不用脚本处理的话,每次利用excel进行手动操作,那么需要对每个大项的小项进行汇总,然后用手动粘贴到一个新表中(自己的EXCEL不是很熟,然后对每一行都要进行一个绘图操作,算下来花的时间很多哦)而现在,只是花了时间写了一段代码,然后以后的以后,只要表格格式不变,我只需要运行py文件即可!~花的时间就1s吧。

下篇会介绍xlsxwriter这个库,因为我写到这里的时候想用openpyxl来进行绘图,发现openpyxl实现不了自己的需求,于是找到了这个写数据和画图都很强的xlsxwriter!而且文档也更加完善,有很多例子!!!

通过这次这个例子,自己以后也会更加学习如何善于发现,善于思考,如何运用自己以前所学的知识将它运用新的岗位上。

 

 

 

----------------------------------------------------------------------------------------------------------------------------------------------------------------

 

【附录】

openpyxl库学习

1、wb = Workbook()

2、获取sheet工作区间

1)# 激活worksheet,得到一个worksheet,默认得到sheet1        ws = wb.active

2)#命名sisilast格式,插入到最后        ws2 = wb.create_sheet("sisilast")

3)#命名sisilast格式,插入到最开始的位置        ws3 = wb.create_sheet("sisifrist",0)

3、给指定单元格赋值

1)直接写数据到指定的单元格中

 >>>ws['A1'] = 100

2)使用openpyxl.worksheet.Worksheet.cell()方法操作某行某列的某个值:

>>> ws.cell(row=6,column=5,value='kaixin')

 

注意:

  1. 当worksheet在内存中被创建时,是没有包含cells的,cells是在首次访问时创建.
  2. 可以循环在内存中创建cells,这时不指定他们的值也会创建该cells些:(创建8x8cells)

       >>> for i in range(1,9): 

for j in range(1,9):

ws.cell(row=i,column=j,value=i*j)

      

        3.也可以使用 openpyxl.worksheet.Worksheet.iter_rows() 方法:(需要指定行->行,截止列)

         

       4.也可以使用 openpyxl.worksheet.Worksheet.iter_cols() 方法:(需要指定列->列,截止行)

       5.如果你需要遍历所有文件的行或列,可以使用openpyxl.worksheet.Worksheet.rows() 属性:>>>tuple(ws.rows)

       or openpyxl.worksheet.Worksheet.columns() 属性:>>>tuple(ws.columns)

4、# 附加一行,从第一列开始附加        ws.append([1,2,3])

5、#保存文件到指定位置        wb.save("D:/test/test.xlsx")

6、修改sheet名称

创建的sheet的名称会自动创建,按照sheet,sheet1,sheet2自动增长,通过title属性可以修改其名称。

>>> from openpyxl import Workbook

>>> wb = Workbook()>>> ws = wb.create_sheet("haha")>>> ws.title = "heihei">>> wb.save("D:/test/heihei.xlsx")

7、查看workbook中的所有worksheets名称:openpyxl.workbook.Workbook.get_sheet_names()

>>> print(wb.sheetnames)['Sheet', 'heihei']

8、直接访问单元格

>>> value1 = ws['A3']

9、openpyxl.load_workbook()已经存在的workbook:

10、使用公式

 --------------------------------------------------------------------------------------

 

【openpyxl的基本使用教程】

 

python操作excel方法

  1. 1)自身有Win32 COM操作office但讲不清楚,可能不支持夸平台,linux是否能用不清楚,其他有专业处理模块,如下
  2. 2)xlrd:(读excel)表,xlrd读大表效率高于openpyxl
  3. 3)xlwt:(写excel)表,
  4. xlrd和xlwt对版本上兼容不太好,很多新版excel有问题。

新版excel处理:

  1. openpyxl(可读写excel表)专门处理Excel2007及以上版本产生的xlsx文件,xls和xlsx之间转换容易
  2. 注意:如果文字编码是“gb2312” 读取后就会显示乱码,请先转成Unicode

安装openpyxl

  1. 1)下载openpyxl模块:https://pypi.python.org/pypi/openpyxl
  2. 2)解压到指定文件目录:tar -xzvf openpyxl.tar.gz
  3. 3)进入目录,找到setup.py文件,执行命令:python setup.py install
  4. 如果报错No module named setuptools 就使用命令“easy_install openpyxl”,easy_install for win32,会自动安装setuptools。
  5. 这里注意,如果不能自动安装,基本上python的模块都通过命令 python 模块名.py install 来安装,如果setuptools模块没有,直接去官网下载,然后前面命令安装就可以了
  6. 4)处理图片还需要安装pillow(PIL)
  7. 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:
  8. pip install pillow

pthon学习资料

  1. python 学习小组http://www.thinksaas.cn/group/show/368/page/4
  2. 官网:
  3. https://pypi.python.org/pypi/openpyxl
  4. http://openpyxl.readthedocs.io/en/default/
  5. good:
  6. http://blog.csdn.net/suofiya2008/article/details/6284208
  7. http://blog.csdn.net/zzukun/article/details/49946147
  8. http://www.thinksaas.cn/topics/0/501/501962.html

openpyxl的使用

openpyxl定义多种数据格式

  1. 最重要的三种:
  2. NULL空值:对应于python中的None,表示这个cell里面没有数据。
  3. numberic: 数字型,统一按照浮点数来进行处理。对应于python中的float
  4. string: 字符串型,对应于python中的unicode。

Excel文件三个对象

  1. workbook: 工作簿,一个excel文件包含多个sheet。
  2. sheet:工作表,一个workbook有多个,表名识别,如“sheet1”,“sheet2”等。
  3. cell: 单元格,存储数据对象

1)导入

  1. from openpyxl import Workbook
  2. from openpyxl import load_workbook
  3. from openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Font, Color, Fill
  4. from openpyxl.styles import colors
  5. from openpyxl.styles import Fill,fills
  6. from openpyxl.formatting.rule import ColorScaleRule

2)打开workbook:

    wb = load_workbook('file_name.xlsx')

3)open sheet:

  1. 通过名字
  2. ws = wb["frequency"]
  3. 等同于 ws2 = wb.get_sheet_by_name('frequency')
  4. 验证命令ws is ws2 is ws3 输出True
  5. 不知道名字用index
  6. sheet_names = wb.get_sheet_names()
  7. ws = wb.get_sheet_by_name(sheet_names[index])# index0为第一张表
  8. 或者
  9. ws =wb.active
  10. 等同于 ws = wb.get_active_sheet() #通过_active_sheet_index设定读取的表,默认0读第一个表
  11. 活动表表名wb.get_active_sheet().title

4)建新表

  1. ws1 = wb.create_sheet() #默认插在最后
  2. ws2 = wb.create_sheet(0) #插在开头
  3. 建表后默认名按顺序,如sheet1,sheet2...
  4. ws.title = "New Title" #修改表名称
  5. 简化 ws2 = wb.create_sheet(title="Pi")

5)backgroud color of tab( be white by default)

ws.sheet_properties.tabColor = "1072BA" # set with RRGGBB color code

6)单元格使用

  1. c = ws['A4'] #read 等同于 c = ws.cell('A4')
  2. ws['A4'] = 4 #write
  3. #ws.cell有两种方式,行号列号从1开始
  4. d = ws.cell(row = 4, column = 2) #行列读写
  5. d = ws.cell('A4')
  6. 写入cell值
  7. ws.cell(row = 4, column = 2).value = 'test'
  8. ws.cell(row = 4, column = 2, value = 'test')

7)访问多个单元格

  1. cell_range = ws['A1':'C2']
  2. 读所有单元格数据
  3. get_cell_collection()

8) 按行操作,按列操作

  1. a)逐行读
  2. ws.iter_rows(range_string=None, row_offset=0, column_offset=0): range-string(string)-单元格的范围:例如('A1:C4') row_offset-添加行 column_offset-添加列
  3. 返回一个生成器, 注意取值时要用value,例如:
  4. for row in ws.iter_rows('A1:C2'):
  5. for cell in row:
  6. print cell
  7. 读指定行、指定列:
  8. rows=ws.rows#row是可迭代的
  9. columns=ws.columns#column是可迭代的
  10. 打印第n行数据
  11. print rows[n]#不需要用.value
  12. print columns[n]#不需要用.value
  13. b)逐行写
  14. (http://openpyxl.readthedocs.io/en/default/_modules/openpyxl/worksheet/worksheet.html#Worksheet.append)
  15. ws.append(iterable)
  16. 添加一行到当前sheet的最底部 iterable必须是list,tuple,dict,range,generator类型的。 1,如果是list,将list从头到尾顺序添加。 2,如果是dict,按照相应的键添加相应的键值。
  17. append([‘This is A1’, ‘This is B1’, ‘This is C1’])
  18. append({‘A’ : ‘This is A1’, ‘C’ : ‘This is C1’})
  19. append({1 : ‘This is A1’, 3 : ‘This is C1’})

8) #显示有多少张表

  1. wb.get_sheet_names()
  2. #显示表名,表行数,表列数
  3. print ws.title
  4. print ws.max_row
  5. print ws.max_column
  6. ws.get_highest_row() #UserWarning: Call to deprecated function
  7. ws.get_highest_column()# UserWarning: Call to deprecated function

9) 获得列号x的字母 col = get_column_letter(x), x从1开始

  1. from openpyxl.utils import get_column_letter
  2. for x in range( 1, len(record)+ 1 ):
  3. col = get_column_letter(x)
  4. ws.cell( '%s%s' %(col, i)).value = x
  5. 通过列字母获取多个excel数据块
  6. cell_range = "E3:{0}28".format(get_column_letter(bc_col))
  7. ws["A1"] = "=SUM(%s)"%cell_range

10)excel文件是gbk编码,读入时需要先encode为gbk,再decode为unicode,再encode为utf8

cell_value.encode('gbk').decode('gbk').encode('utf8')  

11) 公式计算formulae

  1. ws["A1"] = "=SUM(1, 1)"
  2. ws["A1"] = "=SUM(B1:C1)"

代码实例实例(直接修改使用)

  1. from openpyxl import Workbook
  2. from openpyxl.compat import range
  3. from openpyxl.cell import get_column_letter
  4. dest_filename = 'empty_book.xlsx'
  5. wb = Workbook()
  6. ws1 = wb.active
  7. ws1.title = "range names"
  8. for row in range(1, 40):
  9. ws1.append(range(600))
  10. ws3 = wb.create_sheet(title="Data")
  11. for row in range(10, 20):
  12. for col in range(27, 54):
  13. _ = ws3.cell(column=col, row=row, value="%s" % get_column_letter(col))
  14. print(ws3['AA10'].value)
  15. wb.save(filename = dest_filename)
  16. sheet_ranges = wb['range names']
  17. print(sheet_ranges['D18'].value)
  18. ws['A1'] = datetime.datetime(2010, 7, 21)
  19. ws['A1'].number_format #输出'yyyy-mm-dd h:mm:ss'
  20. rows = [
  21. ['Number', 'Batch 1', 'Batch 2'],
  22. [2, 40, 30],
  23. [3, 40, 25],
  24. [4, 50, 30],
  25. [5, 30, 10],
  26. [6, 25, 5],
  27. [7, 50, 10],
  28. ]
  29. rows = [
  30. ['Date', 'Batch 1', 'Batch 2', 'Batch 3'],
  31. [date(2015,9, 1), 40, 30, 25],
  32. [date(2015,9, 2), 40, 25, 30],
  33. [date(2015,9, 3), 50, 30, 45],
  34. [date(2015,9, 4), 30, 25, 40],
  35. [date(2015,9, 5), 25, 35, 30],
  36. [date(2015,9, 6), 20, 40, 35],
  37. ]
  38. for row in rows:
  39. ws.append(row)

excel中图片的处理,PIL模块

  1. try:
  2. from openpyxl.drawing import image
  3. import PIL
  4. except ImportError, e:
  5. print "[ERROR]",e
  6. report_file = self.excel_path + "/frquency_report_%d.xlsx" %id
  7. shutil.copyfile(configs.PATTEN_FILE, report_file)
  8. if not os.path.exists(report_file):
  9. print "generate file failed: ", report_file
  10. sys.exit(1)
  11. wb = load_workbook(report_file)
  12. ws = wb.get_sheet_by_name('frequency')
  13. img_f = configs.IMAGE_LOGO
  14. if os.path.exists(img_f):
  15. try:
  16. img = image.Image(img_f)
  17. ws.add_image(img, 'A1')
  18. except Exception, e:
  19. print "[ERROR]%s:%s" % (type(e), e)
  20. ws['A1'] = "程序化营销平台"
  21. else:
  22. ws['A1'] = "程序化营销平台"
  23. font1 = Font(size=22)
  24. ws['A1'].font = font1
  25. ws['B4'] = ad_plan #等同ws.cell('B4') = ad_plan
  26. ws['B5'] = ad_names
  27. ws['B6'] = str(start_d) + ' to ' + str(end_d)
  28. wb.save(report_file)
  29. try:
  30. wb = load_workbook(report_file)
  31. ws = wb.get_sheet_by_name('frequency')
  32. row = 9
  33. for it in query_result:
  34. one_row = it.split('\t')
  35. print one_row
  36. if '10' == one_row[0]:
  37. one_row[0] = '10+'
  38. col = 1
  39. for one_cell in one_row:
  40. ws.cell(row = row, column = col).value = one_cell
  41. col = col + 1
  42. row = row + 1
  43. except Thrift.TException, tx:
  44. print '[ERROR] %s' % (tx.message)
  45. else:
  46. wb.save(report_file)
  47. finally:
  48. pass
 '
运行

 


http://www.python-excel.org/(翻墙后的页面,直接贴出来,主要是可以用Python来操作excel表格的一系列工具家族。)

 

Working with Excel Files in Python

 

This site contains pointers to the best information available about working with Excel files in the Python programming language.

 

The Packages

There are python packages available to work with Excel files that will run on any Python platform and that do not require either Windows or Excel to be used. They are fast, reliable and open source:

openpyxl

The recommended package for reading and writing Excel 2010 files (ie: .xlsx)

 

Download | Documentation | Bitbucket

xlsxwriter

An alternative package for writing data, formatting information and, in particular, charts in the Excel 2010 format (ie: .xlsx)

Download | Documentation | GitHub

xlrd

This package is for reading data and formatting information from older Excel files (ie: .xls)

 

Download | Documentation | GitHub

xlwt

This package is for writing data and formatting information to older Excel files (ie: .xls)

 

Download | Documentation | Examples | GitHub

xlutils

This package collects utilities that require both xlrd and xlwt, including the ability to copy and modify or filter existing excel files.

NB: In general, these use cases are now covered by openpyxl!

 

Download | Documentation | GitHub

 


 

 

如果觉得本文的文章写得很好,打个赏,多少都行~~~

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/828108
推荐阅读
相关标签
  

闽ICP备14008679号