从过新年那会儿早先上传免费无广告的接纳到市场上,到四月起来大批量上传有广告的应用赚钱。

新近遇上一个境况,就是期限生成并发送服务器使用情状报表,依据分化维度总计,涉及python对excel的操作,上网搜罗了一番,大多安阳小异,而且不太能满意要求,可是经过一番对源码的”钻探”(用此一词让自身认为颇有成就感)之后,基本解决了家常所需。重要记录使用进程的广阔难题及缓解。

从有米广告的0.21单价且数额还能的甜蜜时光,到0.07单价,再到尝百草(尝试不一致的广告平台),最后选项了力美。达到1天1个应用400多的提神。

python操作excel紧要选用xlrd和xlwt那四个库,即xlrd是读excel,xlwt是写excel的库。可从那里下载https://pypi.python.org/pypi。上面分别记录python读和写excel.

在那个阶段,我以为有必不可少写一点东西。

python读excel——xlrd

Android能给开发者带来收益,一边写本人喜欢的行使,一边刷新数据,查看收益的加码,是何其欢悦的事情。

统计,以此历程有多少个相比麻烦的题材,比如读取日期、读合并单元格内容。上边先看看基本的操作:

自身从赚到首个10元的提神,到以后对金额的麻木。

先是读一个excel文件,有八个sheet,测试用第三个sheet,sheet2内容如下:

最早,我上传的是纯免费广告的使用。但下载量,并不佳好。

统计 1

大概九月份啊,我起来上传带有米广告的施用,并且看着收入增加,万分快乐。每天下班后,就写应用。

python 对 excel基本的操作如下:

那段时光是一对一的亢奋。

?

但5.18早先,有米,降了,就好像失恋一样的感觉。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# -*- coding: utf-8 -*-
import xlrd
import xlwt
from datetime import date,datetime
  
def read_excel():
  # 打开文件
  workbook = xlrd.open_workbook(r'F:\demo.xlsx')
  # 获取所有sheet
  print workbook.sheet_names() # [u'sheet1', u'sheet2']
  sheet2_name = workbook.sheet_names()[1]
  
  # 根据sheet索引或者名称获取sheet内容
  sheet2 = workbook.sheet_by_index(1) # sheet索引从0开始
  sheet2 = workbook.sheet_by_name('sheet2')
  
  # sheet的名称,行数,列数
  print sheet2.name,sheet2.nrows,sheet2.ncols
  
  # 获取整行和整列的值(数组)
  rows = sheet2.row_values(3) # 获取第四行内容
  cols = sheet2.col_values(2) # 获取第三列内容
  print rows
  print cols
  
  # 获取单元格内容
  print sheet2.cell(1,0).value.encode('utf-8')
  print sheet2.cell_value(1,0).encode('utf-8')
  print sheet2.row(1)[0].value.encode('utf-8')
    
  # 获取单元格内容的数据类型
  print sheet2.cell(1,0).ctype
  
if __name__ == '__main__':
  read_excel()

3周后,开端探寻新的广告平台。

运转结果如下:

尝试过:

统计 2

天上、admob、vpon、微云、Adtouch等平台,当然,我了然还有任何平台。其余平台,我从已经采纳过的人的申报中,已经直接过滤掉了,有些是因为数量作假,单价低,还有就是纳税太高

那就是说难题来了,上边的运作结果中红框框中的字段明明是出生日期,可兆示的真的浮点数。好的,来化解首个问题:

等等的原因。

1、python读取excel中单元格内容为日期的点子

自我用的那多少个里头,Adtouch是最烂的,我用过后,是准不想用第二次,91的市场也是最烂的。

python读取excel中单元格的情节重返的有5种档次,即上边例子中的ctype:

当然,hiapk那么些市场也是更恶心,他须要开发者用他们的指定的广告,且要4.6分为。

?

天空,我用的年月终归比较长的,收入太低了,宣传时说得很好。

1
ctype : 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error

admob,同样收入太低,我是翻开了adsense的。因为我多年前,在用google
adsense的网站广告。

即date的ctype=3,那时急需选拔xlrd的xldate_as_tuple来拍卖为date格式,先判断表格的ctype=3时xldate才能伊始操作。以往命令行看下:

自身注意到,admob的广告,点了后,会弹出指示,view
ad,须要再点这一个指示,才会算几遍点击。

?

通过1个月左右的尝百草阶段。我灰心了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>> sheet2.cell(2,2).ctype #1990/2/22
>>> sheet2.cell(2,1).ctype #24
>>> sheet2.cell(2,0).ctype #小胖
>>> sheet2.cell(2,4).ctype #空值(这里是合并单元格的原因)
>>> sheet2.cell(2,2).value #1990/2/22
33656.0
>>> xlrd.xldate_as_tuple(sheet2.cell_value(2,2),workbook.datemode)
(1992, 2, 22, 0, 0, 0)
>>> date_value = xlrd.xldate_as_tuple(sheet2.cell_value(2,2),workbook.datemode)
>>> date_value
(1992, 2, 22, 0, 0, 0)
>>> date(*date_value[:3])
datetime.date(1992, 2, 22)
>>> date(*date_value[:3]).strftime('%Y/%m/%d'
'1992/02/22'

即使外界很多广告平台都在吹本人有多牛B,但再牛B的广告,也不如收入的压实能掀起开发者的心。

即可以做下简单处理,判断ctype是不是等于3,即使等于3,则用时间格式处理:

自个儿准备换回有米了,低就低呢,至少,我看总的收入,仍然比那多少个声称单价多高的阳台要好。

?

实际上,那中间,也有看到众多开发者用万普的广告,说是收到了这个高的入账,但像goapk之类的大流量的商海,都不容许用万普的广告。也只好作罢。至于万普是或不是真的能有高收入,是不是以

1
2
3
if (sheet.cell(row,col).ctype == 3):
  date_value = xlrd.xldate_as_tuple(sheet.cell_value(rows,3),book.datemode)
  date_tmp = date(*date_value[:3]).strftime('%Y/%m/%d')

献身用户体验为代价,我没试过,也就不得而知了。

那么难题又来了,上面 sheet2.cell(2,4).ctype
再次回到的值是0,表明这一个单元格的值是空值,明明是统一的单元格内容”好爱人”,这一个是自我以为那么些包作用不完美的地点,如果是联合的单元格那么相应联合的单元格的故事情节相同,可是它只是统一的首个单元格的有值,其余的为空。

在自己尝百草时期,力美的工作人士,与自我联络,说是准备推出一个好的阳台,想让本身在场,我立马是不care的,已经有些消极的情致。但勉强同意,报着看一看的姿态参与了。

?

果真,那个平台,2次延缓发布后,正式运作的第二天,出了难题,数据不太对。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
>>> sheet2.col_values(4)
[u'\u5173\u7cfb', u'\u597d\u670b\u53cb', '', u'\u540c\u5b66', '', '', u'\u4e00\u4e2a\u4eba', '']
>>> for i in range(sheet2.nrows):
  print sheet2.col_values(4)[i]
关系
好朋友
  
同学
  
  
一个人
  
>>> sheet2.row_values(7)
[u'\u65e0\u540d', 20.0, u'\u6682\u65e0', '', '']
>>> for i in range(sheet2.ncols):
  print sheet2.row_values(7)[i]
无名
20.0
暂无
  
  
>>>

唯独,接下去,就是让我吃惊了。

2、读取合并单元格的始末

数码出错的那天,他们给的补偿是10倍,我的个擦。比有米的2倍还牛B,而且,他们还确确实实给了。我表示,我领到了。有米的,于今,我并未领到过补偿。

其一是真没技术,只能拿到合并单元格的首先个cell的行列索引,才能读到值,读错了就是空值。

接下去的多少也是很给力的,0.3元的CPC单价。我表示尤其惬意。数据也还真真。至少,是本身用了这几个多平莱比锡,最高的,我指的是低收入。

即集合行单元格读取行的率先个目录,合并列单元格读取列的第四个目录,如上述,读取行合并单元格”好情人”和读取列合并单元格”暂无”只可以如下方式:

特别是某个周末,我习惯性的打开总结,居然看到有个使用一天有400多的低收入。

?

本人铁了心的服了力美。从前是不太care他的。以后是梦想力美,继续保险,千万别倒了,大概像有米,中途让利。

1
2
3
4
5
6
7
>>> print sheet2.col_values(4)[1]
好朋友
>>> print sheet2.row_values(7)[2]
暂无
  
 >>> sheet2.merged_cells # 明明有合并的单元格,为何这里是空
 []

就在下周,我听他们说,百度也出了个吓人的单价,0.75元。不过,在尚未专心一志的开发者在群里公布报告前,我不准备去作小白鼠,依旧先用着到底找到的力美。

难点又来了,合并单元格大概出现空值,但是表格自己的常见单元格也只怕是空值,要怎么获取单元格所谓的”第二个行或列的目录”呢?

那就要先明了怎么着是单元格是被合并的!

3、获取合并的单元格

读取文件的时候须要将formatting_info参数设置为True,暗中同意是False,所以地点拿到合并的单元格数组为空,

?

1
2
3
4
>>> workbook = xlrd.open_workbook(r'F:\demo.xlsx',formatting_info=True)
>>> sheet2 = workbook.sheet_by_name('sheet2')
>>> sheet2.merged_cells
[(7, 8, 2, 5), (1, 3, 4, 5), (3, 6, 4, 5)]

merged_cells重临的那两个参数的意思是:(row,row_range,col,col_range),其中[row,row_range)包括row,不包括row_range,col也是一致,即(1,
3, 4, 5)的意义是:第1到2行(不包含3)合并,(7, 8, 2,
5)的意思是:第2到4列合并。

利用那个,可以独家收获合并的多个单元格的始末:

?

1
2
3
4
5
6
>>> print sheet2.cell_value(1,4#(1, 3, 4, 5)
好朋友
>>> print sheet2.cell_value(3,4#(3, 6, 4, 5)
同学
>>> print sheet2.cell_value(7,2#(7, 8, 2, 5)
暂无

发觉规律了没?是的,获取merge_cells重回的row和col低位的目录即可!
于是足以如此一劳永逸:

?

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> merge = []
>>> for (rlow,rhigh,clow,chigh) in sheet2.merged_cells:
  merge.append([rlow,clow])
    
>>> merge
[[7, 2], [1, 4], [3, 4]]
>>> for index in merge:
  print sheet2.cell_value(index[0],index[1])
    
暂无
好朋友
同学
>>>

 

python写excel——xlwt

写excel的困难大概不在构造一个workbook的本身,而是填充的多寡,不过那不在界定内。在写excel的操作中也有困难的题材,比如写入合并的单元格就是比较费劲的,别的写入还有例外的体制。这一个要看源码才能商讨的透。

自个儿”构思”了如上面的sheet1,即要用xlwt达成的事物:

统计 3

大抵看起来还算复杂,而且看起来”很标准”,完全是个人杜撰。

代码如下:

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
'''
设置单元格样式
'''
  
def set_style(name,height,bold=False):
  style = xlwt.XFStyle() # 初始化样式
  
  font = xlwt.Font() # 为样式创建字体
  font.name = name # 'Times New Roman'
  font.bold = bold
  font.color_index = 4
  font.height = height
  
  # borders= xlwt.Borders()
  # borders.left= 6
  # borders.right= 6
  # borders.top= 6
  # borders.bottom= 6
  
  style.font = font
  # style.borders = borders
  
  return style
  
  
#写excel
def write_excel():
  f = xlwt.Workbook() #创建工作簿
  
  '''
  创建第一个sheet:
    sheet1
  '''
  sheet1 = f.add_sheet(u'sheet1',cell_overwrite_ok=True) #创建sheet
  row0 = [u'业务',u'状态',u'北京',u'上海',u'广州',u'深圳',u'状态小计',u'合计']
  column0 = [u'机票',u'船票',u'火车票',u'汽车票',u'其它']
  status = [u'预订',u'出票',u'退票',u'业务小计']
  
  #生成第一行
  for i in range(0,len(row0)):
    sheet1.write(0,i,row0[i],set_style('Times New Roman',220,True))
  
  #生成第一列和最后一列(合并4行)
  i, j = 1, 0
  while i < 4*len(column0) and j < len(column0):
    sheet1.write_merge(i,i+3,0,0,column0[j],set_style('Arial',220,True)) #第一列
    sheet1.write_merge(i,i+3,7,7) #最后一列"合计"
    i += 4
    j += 1
  
  sheet1.write_merge(21,21,0,1,u'合计',set_style('Times New Roman',220,True))
  
  #生成第二列
  i = 0
  while i < 4*len(column0):
    for j in range(0,len(status)):
      sheet1.write(j+i+1,1,status[j])
    i += 4
  
  f.save('demo1.xlsx') #保存文件
  
if __name__ == '__main__':
  #generate_workbook()
  #read_excel()
  write_excel()

必要稍作解释的就是write_merge方法:

write_merge(x, x + m, y, w + n, string, sytle)
x表示行,y表示列,m表示跨行个数,n表示跨列个数,string代表要写入的单元格内容,style代表单元格样式。其中,x,y,w,h,都以以0开头统计的。

本条和xlrd中的读合并单元格的不太相同。

如上述:sheet1.write_merge(21,21,0,1,u’合计’,set_style(‘Times New
Roman’,220,True))

即在22行统一第1,2列,合并后的单元格内容为”合计”,并安装了style。

 

比方须求创立八个sheet,则只要f.add_sheet即可。

如在上述write_excel函数里f.save(‘demo1.xlsx’)
那句以前再创设一个sheet2,效果如下:

统计 4

代码也是真实的easy的了:

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
'''
  创建第二个sheet:
    sheet2
  '''
  sheet2 = f.add_sheet(u'sheet2',cell_overwrite_ok=True) #创建sheet2
  row0 = [u'姓名',u'年龄',u'出生日期',u'爱好',u'关系']
  column0 = [u'小杰',u'小胖',u'小明',u'大神',u'大仙',u'小敏',u'无名']
  
  #生成第一行
  for i in range(0,len(row0)):
    sheet2.write(0,i,row0[i],set_style('Times New Roman',220,True))
  
  #生成第一列
  for i in range(0,len(column0)):
    sheet2.write(i+1,0,column0[i],set_style('Times New Roman',220))
  
  sheet2.write(1,2,'1991/11/11')
  sheet2.write_merge(7,7,2,4,u'暂无') #合并列单元格
  sheet2.write_merge(1,2,4,4,u'好朋友') #合并行单元格
    
  f.save('demo1.xlsx') #保存文件