zoukankan      html  css  js  c++  java
  • python 解析Excel

    python 解析Excel

      公司背景:好吧LZ太懒了.略...

      原由起因:公司老板发话要导出公司数据库中符合条件的数据,源数据有400万,符合条件的大概有70万左右吧.

      最终目的:符合条件的数据并生成Excel

      翠花,上代码:

      由于LZ python的底子并不是很好只会写一些简单的脚本,全当是记录学习里程了。此次采用的是openpyxl,因为查到它支持Excel2010

      

    # coding=utf-8
    from openpyxl.workbook import Workbook
    from openpyxl.writer.excel import ExcelWriter
    from openpyxl.styles import Color, Fill
    from openpyxl.cell import Cell
    import datetime
    from pymongo import MongoClient
    import pymongo
    
    import smtplib
    from email.MIMEText import MIMEText
    from email.MIMEMultipart import MIMEMultipart
    from email.MIMEBase import MIMEBase
    from email import Encoders
    import time
    
    mongoDB = MongoClient('beta-mongo01')#公司数据库采用的是mongodb 别问我为什么LZ也不知道为毛不用关系型数据库
    db_name = 'core'
    db = mongoDB[db_name]
    rows = db.customerProfiles.find()
    filters = ["理财","金融","证劵","咨询","银行","财务","信托","基金","期货","租赁","投资","保险","会计","审计","投行","券商","股权","风险","财务","财富","资产"]#这是筛选条件 自己猜我们是干啥的吧...
    def getfiltersByexperiences(experiences):#这是数据筛选
    	for i in filters:
    		if i.decode('utf-8') in experiences:
    			return True
    def getExperieces(row):#筛选工作经历
    	try:
    		experiences = ""
    		i = 0
    		while i < len(row["workExperiences"]):
    			experiences = experiences + row["workExperiences"][i]["position"] + row["workExperiences"][i]["organization"]
    			i =i +1
    			continue
    		return getfiltersByexperiences(experiences)
    	except Exception as e:
    		experiences = ""
    		return getfiltersByexperiences(experiences)
    def getfiltersByexpect(expect):#另一个筛选
    	for i in filters:
    		if i.decode('utf-8') in expect:
    			return True
    def getExpect(row):#这也是
    	try:
    		expect = ""
    		i = 0
    		while i < len(row["expect"]["expectIndustry"]):
    			expect = expect + row["expect"]["expectIndustry"][i]
    			i =i +1
    			continue
    		return getfiltersByexpect(expect)
    	except Exception as e:
    		expect = ""
    		return getfiltersByexpect(expect)
    def getfullName(row):#这也是
    	try:
    		if row["fullName"] != "" and row["fullName"] != None:
    			return True
    		else:
    			return False
    	except Exception as e:
    		return False
    def getEmail(row):#这也是
    	try:
    		if row["descriptions"]["contactEmail"] != "" and row["descriptions"]["contactEmail"] != None:
    			return True
    		else:
    			return False
    	except Exception as e:
    		return False
    def getPhone(row):#这也是
    	try:
    		if row["descriptions"]["contactPhoneNumber"] != "" and row["descriptions"]["contactPhoneNumber"] != None:
    			return True
    		else:
    			return False
    	except Exception as e:
    		return False
    now = datetime.datetime.now()
    #新建一个workbook
    wb = Workbook()
    #第一个sheet是ws
    ws = wb.worksheets[0]
    #设置ws的名称
    ws.title = u"简历数据"
    #给A1赋值
    ws.cell('A1').value = '%s'%("编号")
    ws.cell('B1').value = '%s'%("CustomerId")
    ws.cell('C1').value = '%s'%("姓名")
    ws.cell('D1').value = '%s'%("性别")
    ws.cell('E1').value = '%s'%("所在地")
    ws.cell('F1').value = '%s'%("邮箱")
    ws.cell('G1').value = '%s'%("电话")
    ws.cell('H1').value = '%s'%("曾经任职职位")
    ws.cell('I1').value = '%s'%("曾经任职公司")
    ws.cell('J1').value = '%s'%("期望行业")
    ws.cell('K1').value = '%s'%("工作年份")
    ws.cell('L1').value = '%s'%("简历更新时间")
    ws.cell('M1').value = '%s'%("简历来源")
    count = 2 
    for row in rows:#循环取数据
    	if getfullName(row) == True:
    		if getEmail(row) == True or getPhone(row) == True:
    			if getExperieces(row) == True or getExpect(row) == True:
    				count = count +1
    				if count >200002:
    					try:
    						position = ""
    						if len(row["workExperiences"]) == 0:
    							pass
    						else:
    							i = 0 
    							while i < len(row["workExperiences"]):
    								position = position + row["workExperiences"][i]["position"] + "/"
    								i =i +1
    								continue
    					except Exception as e:
    						position = ""
    					try:
    						organization = ""
    						if len(row["workExperiences"]) == 0:
    							pass
    						else:
    							i = 0 
    							while i < len(row["workExperiences"]):
    								organization = organization + row["workExperiences"][i]["organization"] + "/"
    								i =i +1
    								continue				
    					except Exception as e:
    						organization = ""
    					try:
    						expectedIndustry = ""
    						if len(row["expect"]["expectedIndustry"]) == 0:
    							pass
    						else:
    							i = 0 
    							while i < len(row["expect"]["expectIndustry"]):
    								expectedIndustry = expectedIndustry + row["expect"]["expectIndustry"][i]
    								i =i +1
    								continue
    					except Exception as e:
    						expectedIndustry = ""
    					try:#开始写excel
    						ws.cell(str('A'+str(count))).value = '%s'%(str(count-1))
    						ws.cell(str('B'+str(count))).value = '%s'%(str(row.get("_id","")))
    						ws.cell(str('C'+str(count))).value = '%s'%(row.get("fullName",""))
    						ws.cell(str('D'+str(count))).value = '%s'%(row.get("gender",""))
    						ws.cell(str('E'+str(count))).value = '%s'%(row.get("descriptions","").get("city",""))
    						ws.cell(str('F'+str(count))).value = '%s'%(row.get("descriptions","").get("contactEmail",""))
    						ws.cell(str('G'+str(count))).value = '%s'%(row.get("descriptions","").get("contactPhoneNumber",""))
    						ws.cell(str('H'+str(count))).value = '%s'%(position)
    						ws.cell(str('I'+str(count))).value = '%s'%(organization)
    						ws.cell(str('J'+str(count))).value = '%s'%(expectedIndustry)
    						ws.cell(str('K'+str(count))).value = '%s'%(str(row.get("descriptions","").get("workLife","")) + "年")
    						ws.cell(str('L'+str(count))).value = '%s'%(str(row.get("updateTime","2015-05-05 00:00:00"))[0:11])
    						ws.cell(str('M'+str(count))).value = '%s'%(str(row.get("source","")))
    					except Exception as e:
    						count = count +1
    						continue
    					print(count)
    					if count == 500002:
    						break
    				else:
    					continue
    			else:
    				continue		
    		else:
    			continue
    	else:
    		continue	
    	
    ##修改某一列宽度
    ws.column_dimensions["A"].width =10.0
    ws.column_dimensions["B"].width =25.0
    ws.column_dimensions["C"].width =10.0
    ws.column_dimensions["D"].width =10.0
    ws.column_dimensions["E"].width =15.0
    ws.column_dimensions["F"].width =20.0
    ws.column_dimensions["G"].width =15.0
    ws.column_dimensions["H"].width =25.0
    ws.column_dimensions["I"].width =35.0
    ws.column_dimensions["J"].width =35.0
    ws.column_dimensions["K"].width =15.0
    ws.column_dimensions["L"].width =15.0
    ws.column_dimensions["M"].width =10.0
    #文件Name
    file_name = str(now.strftime("%Y%m%d")) + "(2).xlsx"
    #文件存放地址
    file_dir = '/usr/src/Python'
    ##保存生成xlsx
    wb.save(filename = str(file_name))
    ew = ExcelWriter(workbook = wb)
    

    还有一些从网上找的记录下来 各种方法...

    python读取excel文件代码:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # 读取excel数据
    # 小罗的需求,取第二行以下的数据,然后取每行前13列的数据
    import xlrd
    data = xlrd.open_workbook('test.xls') # 打开xls文件
    table = data.sheets()[0] # 打开第一张表
    nrows = table.nrows # 获取表的行数
    for i in range(nrows): # 循环逐行打印
    if i == 0: # 跳过第一行
    continue
    print table.row_values(i)[:13] # 取前十三列 
    

    使用xlrd读取文件,使用xlwt生成Excel文件(可以控制Excel中单元格的格式)。但是用xlrd读取excel是不能对其进行操作的;而 xlwt生成excel文件是不能在已有的excel文件基础上进行修改的,如需要修改文件就要使用xluntils模块。pyExcelerator模 块与xlwt类似,也可以用来生成excel文件。

    #coding=utf-8
    #######################################################
    #filename:test_xlrd.py
    #author:defias
    #date:xxxx-xx-xx
    #function:读excel文件中的数据
    #######################################################
    import xlrd
    #打开一个workbook
    workbook = xlrd.open_workbook('E:\Code\Python\testdata.xls')
    #抓取所有sheet页的名称
    worksheets = workbook.sheet_names()
    print('worksheets is %s' %worksheets)
    #定位到sheet1
    worksheet1 = workbook.sheet_by_name(u'Sheet1')
    """
    #通过索引顺序获取
    worksheet1 = workbook.sheets()[0]
    #或
    worksheet1 = workbook.sheet_by_index(0)
    """
    """
    #遍历所有sheet对象
    for worksheet_name in worksheets:
    worksheet = workbook.sheet_by_name(worksheet_name)
    """
    #遍历sheet1中所有行row
    num_rows = worksheet1.nrows
    for curr_row in range(num_rows):
    row = worksheet1.row_values(curr_row)
    print('row%s is %s' %(curr_row,row))
    #遍历sheet1中所有列col
    num_cols = worksheet1.ncols
    for curr_col in range(num_cols):
    col = worksheet1.col_values(curr_col)
    print('col%s is %s' %(curr_col,col))
    #遍历sheet1中所有单元格cell
    for rown in range(num_rows):
    for coln in range(num_cols):
    cell = worksheet1.cell_value(rown,coln)
    print cell
    """
    #其他写法:
    cell = worksheet1.cell(rown,coln).value
    print cell
    #或
    cell = worksheet1.row(rown)[coln].value
    print cell
    #或
    cell = worksheet1.col(coln)[rown].value
    print cell
    #获取单元格中值的类型,类型 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error
    cell_type = worksheet1.cell_type(rown,coln)
    print cell_type
    """
    
    #coding=utf-8
    #######################################################
    #filename:test_xlwt.py
    #author:defias
    #date:xxxx-xx-xx
    #function:新建excel文件并写入数据
    #######################################################
    import xlwt
    #创建workbook和sheet对象
    workbook = xlwt.Workbook() #注意Workbook的开头W要大写
    sheet1 = workbook.add_sheet('sheet1',cell_overwrite_ok=True)
    sheet2 = workbook.add_sheet('sheet2',cell_overwrite_ok=True)
    #向sheet页中写入数据
    sheet1.write(0,0,'this should overwrite1')
    sheet1.write(0,1,'aaaaaaaaaaaa')
    sheet2.write(0,0,'this should overwrite2')
    sheet2.write(1,2,'bbbbbbbbbbbbb')
    """
    #-----------使用样式-----------------------------------
    #初始化样式
    style = xlwt.XFStyle() 
    #为样式创建字体
    font = xlwt.Font()
    font.name = 'Times New Roman'
    font.bold = True
    #设置样式的字体
    style.font = font
    #使用样式
    sheet.write(0,1,'some bold Times text',style)
    """
    #保存该excel文件,有同名文件时直接覆盖
    workbook.save('E:\Code\Python\test2.xls')
    print '创建excel文件完成!'
    
    #coding=utf-8
    #######################################################
    #filename:test_xlutils.py
    #author:defias
    #date:xxxx-xx-xx
    #function:向excel文件中写入数据
    #######################################################
    import xlrd
    import xlutils.copy
    #打开一个workbook
    rb = xlrd.open_workbook('E:\Code\Python\test1.xls') 
    wb = xlutils.copy.copy(rb)
    #获取sheet对象,通过sheet_by_index()获取的sheet对象没有write()方法
    ws = wb.get_sheet(0)
    #写入数据
    ws.write(1, 1, 'changed!')
    #添加sheet页
    wb.add_sheet('sheetnnn2',cell_overwrite_ok=True)
    #利用保存时同名覆盖达到修改excel文件的目的,注意未被修改的内容保持不变
    wb.save('E:\Code\Python\test1.xls')
    
    #coding=utf-8
    #######################################################
    #filename:test_pyExcelerator_read.py
    #author:defias
    #date:xxxx-xx-xx
    #function:读excel文件中的数据
    #######################################################
    import pyExcelerator
    #parse_xls返回一个列表,每项都是一个sheet页的数据。
    #每项是一个二元组(表名,单元格数据)。其中单元格数据为一个字典,键值就是单元格的索引(i,j)。如果某个单元格无数据,那么就不存在这个值
    sheets = pyExcelerator.parse_xls('E:\Code\Python\testdata.xls')
    print sheets
    
    #coding=utf-8
    #######################################################
    #filename:test_pyExcelerator.py
    #author:defias
    #date:xxxx-xx-xx
    #function:新建excel文件并写入数据
    #######################################################
    import pyExcelerator
    #创建workbook和sheet对象
    wb = pyExcelerator.Workbook()
    ws = wb.add_sheet(u'第一页')
    #设置样式
    myfont = pyExcelerator.Font()
    myfont.name = u'Times New Roman'
    myfont.bold = True
    mystyle = pyExcelerator.XFStyle()
    mystyle.font = myfont
    #写入数据,使用样式
    ws.write(0,0,u'ni hao 帕索!',mystyle)
    #保存该excel文件,有同名文件时直接覆盖
    wb.save('E:\Code\Python\mini.xls')
    print '创建excel文件完成!'
    

      

      

  • 相关阅读:
    C#验证码识别类网上摘抄的
    C#如何用WebClient动态提交文件至Web服务器和设定Http响应超时时间
    C#制作曲线图源码
    在PHP中怎样实现文件下载?
    ASP.NET如何调用Web Service
    MSDN中关于读取web.config的那块,System.Configuration.ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString
    饿也要做一个和这个差不多的blog,但功能上有要增强的
    理解能力的高低决定人们的学习能力的高低
    有点困惑了,不知道是从smartClient入手还是从做网站web入手学习.net技术
    什么工厂模式?反射, 晕了,有书吗,推荐推荐.....5555555555555
  • 原文地址:https://www.cnblogs.com/shiyan123/p/5405164.html
Copyright © 2011-2022 走看看