import openpyxl, pprint
print('Opening workbook...')
wb = openpyxl.load_workbook('censuspopdata.xlsx')
sheet = wb.get_sheet_by_name('Population by Census Tract')
countyData = {}
# 填充县城数据,通过国家人口和土地
print('Reading rows...')
for row in range(2, sheet.max_row + 1):
# Each row in the spreadsheet has data for one census tract.
state = sheet['B' + str(row)].value
county = sheet['C' + str(row)].value
pop = sheet['D' + str(row)].value
countyData.setdefault(state, {})
countyData[state].setdefault(county, {'tracts': 0, 'pop': 0})
countyData[state][county]['tracts'] += 1
countyData[state][county]['pop'] += int(pop)
print('Writing results...')
resultFile = open('census2010.py', 'w')
resultFile.write('allData = ' + pprint.pformat(countyData))
resultFile.close()
print('Done.')
唯一一点变化是:get_highest_row()和get_highest_column()在最新版的openpyxl模块中已经被删除了,取而代之的是max_row和max_column两个属性。
1,从电子表格中读取数据,将它作为 Python 程序的输入
example.xlxs还是书上的那个
#将从xlxs中读取的数据,存入列表name,然后输出
import openpyxl
wb = openpyxl.load_workbook('example.xlsx')
sheet = wb.get_sheet_by_name('Sheet1')
name=[]
for i in range(1, 8, 2):
name.append(sheet.cell(row=i, column=2).value)
for nam in name:
print(nam)
2,检查电子表格是否有空行或无效的数据,如果有就警告。
#输出类型
import openpyxl
wb = openpyxl.load_workbook('example_one.xlsx')
sheet = wb.get_sheet_by_name('Sheet1')
print(sheet.max_row)
name=[]
for i in range(1,sheet.max_row+1):
name.append(sheet.cell(row=i, column=2).value)
i=1#记录第几行是空行
for nam in name:
print(nam,end=' ')
print(type(nam))
import openpyxl
wb = openpyxl.load_workbook('example_one.xlsx')
sheet = wb.get_sheet_by_name('Sheet1')
print(sheet.max_row)
name=[]
for i in range(1,sheet.max_row+1):
name.append(sheet.cell(row=i, column=2).value)
i=1#记录第几行是空行
for nam in name:
if nam==None:
print("row: "+str(i)+" 是 空行")
i+=1
3,比较一个电子表格中多行的数据。
4,打开多个 Excel 文件,跨电子表格比较数据。
说一下思路:从Excel中提取数据,然后存入列表,元组,字典,然后比较即可。
假设 Garlic、Celery 和 Lemons 的价格输入的不正确,输入其正确的价格.
import openpyxl
wb = openpyxl.load_workbook('produceSales.xlsx')
sheet = wb.get_sheet_by_name('Sheet')
PRICE_UPDATES = {'Garlic': 3.07,
'Celery': 1.19,
'Lemon': 1.27}
for rowNum in range(2, sheet.max_row): # skip the first row
produceName = sheet.cell(row=rowNum, column=1).value
if produceName in PRICE_UPDATES:
sheet.cell(row=rowNum, column=2).value = PRICE_UPDATES[produceName]
wb.save('updatedProduceSales.xlsx')
类似程序的思想
1,从一个电子表格读取数据,写入其他电子表格的某些部分
问题:如何将Excel中的一行整个转移到另一个Excel?
答:创建一个新的Excel表格,
import openpyxl
wb = openpyxl.Workbook()
sheet = wb.get_active_sheet()
wb.save('writeFormula_one.xlsx')
再通过Python操作
#提取produceSale.xlsx中'Cucumber','Grapefruit','Yellow peppers'的信息
#保存至example.xlsx中
import openpyxl
wb = openpyxl.load_workbook('produceSales.xlsx')
wbone = openpyxl.load_workbook('example.xlsx')
sheet = wb.get_sheet_by_name('Sheet')
#原来get_sheet_by_name()中的参数 表示取第几个sheet,务必与Excel下的sheet名称对应
sheetone = wbone.get_sheet_by_name('Sheet1')
flagA=False
flagB=False
flagC=False
flagD=False
speics=['Cucumber','Grapefruit','Yellow peppers']
speics_plus={'Cucumber':[],'Grapefruit':[],'Yellow peppers':[]}
for rowNum in range(2, sheet.max_row):
produceName = sheet.cell(row=rowNum, column=1).value
column2=sheet.cell(row=rowNum, column=2).value
column3=sheet.cell(row=rowNum, column=3).value
if produceName in speics:
speics_plus[produceName].append(column2)
speics_plus[produceName].append(column3)
if produceName =='Cucumber':
flagA=True
elif produceName =='Grapefruit':
flagB=True
elif produceName =='Yellow peppers':
flagC=True
if flagA == True and flagB == True and flagC == True:
break
rowNum=1
#创建头部信息
sheet.cell(row=rowNum, column=1).value='PRODUCE'
sheet.cell(row=rowNum, column=2).value='COST PER POUND'
sheet.cell(row=rowNum, column=2).value='POUNDS SOLD'
rowNum+=1
#将存储的信息调入example.elxs中
for key in speics_plus.keys():
col=1
sheetone.cell(row=rowNum, column=col).value=key
col+=1
for item in speics_plus[key]:
sheetone.cell(row=rowNum, column=col).value=item
col+=1
rowNum+=1
wbone.save('example.xlsx')
效果:
差强人意~~~
2,从网站、文本文件或剪贴板读取数据,将它写入电子表格
要用到第八章 读写文件 的知识,
读取数据 从.txt文件
helloFile = open('C:\\Users\\your_home_folder\\hello.txt')
helloContent = helloFile.read()
helloContent
从.txt中读取数据,然后存入xlxs中
3,自动清理电子表格中的数据。例如,可以利用正则表达式,读取多种格式的电
话号码,将它们转换成单一的标准格式
知识点:第七章 模式匹配与正则表达式
import re
phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
mo = phoneNumRegex.search('My number is 415-555-4242.')
print('Phone number found: ' + mo.group())
Phone number found: 415-555-4242
读取多种格式的电话号码 要进行多次正则匹配,因为无法一次匹配多个正则标准
关于12.8,12.9,12.10 import Error:https://blog.csdn.net/weixin_41569319/article/category/7753938
12.13.1 乘法表
import openpyxl
wb = openpyxl.Workbook()
sheet = wb.get_active_sheet()
n=input("输入n:")
n=int(n)
for i in range(1,n+1):
sheet.cell(row=1, column=i+1).value=i
sheet.cell(row=i+1, column=1).value=i
for j in range(1,n+1):
sheet.cell(row=i+1, column=j+1).value=i*j
wb.save('writeFormula.xlsx')
没用命令行,因为没将这个文件夹添加至 环境变量
12.13.2 空行插入程序
python中的逆序遍历:
for i in range(n,1,-1)
#从第二行开始插入两行空白
import openpyxl
wb = openpyxl.load_workbook('example.xlsx')
sheet = wb.get_sheet_by_name('Sheet1')
n=2
m=2
for i in range(sheet.max_row,n-1,-1):
sheet.cell(row=i+m,column=1).value=sheet.cell(row=i,column=1).value
#必须指定row与column
for i in range(n,n+m):
sheet.cell(row=i,column=1).value=""
wb.save('example_one.xlsx')
12.13.3 电子表格单元格翻转程序
同时打开两个Excel,for i ,for j 遍历即可
12.13.4 文本文件到电子表格
能把这行的赋值控制好即可
sheet.cell(row=i, column=j+1).value=..
12.13.5 电子表格到文本文件
沿纵轴遍历,for j