이 기사는 파이썬에 익숙하지 않은 개발자에게 일상 업무를 용이하게 하기 위해 편리한 Excel 처리 도구를 제공하는 것을 목표로 합니다.
1. 파이썬 설치
입력 https://www.python.org/downloads/
하고 운영 체제 버전에 따라 해당 설치 패키지를 선택합니다.
Add to path
설치 과정에서 체크 에 주의를 기울 python路径信息
이면 시스템 환경 변수에 추가됩니다 PATH
.
IDE 도구 는 jetbrains에서 제공하는 pycharm 커뮤니티 에디션 설치를 권장합니다.
2. 엑셀 소개
.xlsx 접미사가 붙은 스프레드시트 도구 .
Excel 문서 는 통합 문서이고, 통합 문서는 여러 시트 를 포함할 수 있으며 , 시트 는 워크시트입니다.
3. openpyxl 모듈 설치
DOS 명령 창에서 실행:pip install openpyxl==2.6.2
넷째, 엑셀 처리
이 모듈의 코드와 실험 파일은 Github에 업로드되었습니다.
창고 주소: github.com/WWindmill/p…
코드 디렉토리:
4.1 읽기 작업
import openpyxl
from openpyxl.utils import get_column_letter, column_index_from_string
# 工作簿对象
workbook = openpyxl.load_workbook("C:\projects\Python\9.源代码文件\automate_online-materials\example.xlsx")
print('type of result: ', type(workbook))
print("all sheet names: ", workbook.sheetnames)
# 获取工作表
sheet = workbook['Sheet1']
print("sheet obj: ", sheet, " sheet title:", sheet.title)
# 获取工作簿的活动表
anotherSheet = workbook.active
print("active sheet: ", anotherSheet)
# 获取单元格
print("cell A1: ", sheet['A1'])
print("cell A1 val: ", sheet['A1'].value)
c = sheet['B1']
print('Row %s, Column %s is %s' % (c.row, c.column, c.value))
print('Cell %s is %s' % (c.coordinate, c.value))
print("cell[B1]: ", sheet.cell(row=1, column=2))
# 步长为2
for i in range(1, 8, 2):
print('row:%s,column:2, value:%s' % (i, sheet.cell(row=i, column=2).value))
# 获取工作表大小
print("max row: ", sheet.max_row)
print("max column: ", sheet.max_column)
# 列字母与数字转换
print("1 mean letter: ", get_column_letter(1))
print(sheet.max_column, "mean letter: ", get_column_letter(sheet.max_column))
print("column A point at num: ", column_index_from_string('A'))
# 按行遍历 method1
print(tuple(sheet['A1':'C3']))
for rowCell in sheet['A1':'C3']:
for eachCell in rowCell:
print(eachCell.coordinate, eachCell.value)
print('--- END OF ROW ---')
# 按行遍历 method2
print(list(sheet.rows)[0])
for cellObj in list(sheet.rows)[0]:
print(cellObj.value)
print('--- END OF ROW ---')
# 按列遍历
print(list(sheet.columns)[0])
for cellObj in list(sheet.columns)[0]:
print(cellObj.value)
print('--- END OF column ---')
4.2 쓰기 작업
import openpyxl
# 工作簿对象
workbook = openpyxl.load_workbook(".\source\example.xlsx")
print('type of result: ', type(workbook))
print("all sheet names: ", workbook.sheetnames)
# 获取工作表
sheet = workbook['Sheet1']
print("sheet obj: ", sheet, " sheet title:", sheet.title)
# 修改sheet名称 并转储为另一个文件
sheet.title = 'Spam Spam Spam'
workbook.save('.\source\example_copy.xlsx')
# 创建和删除工作表
workbook.create_sheet(index=3, title="the fourth sheet")
print('sheet names: ', workbook.sheetnames)
del workbook['the fourth sheet']
print('sheet names: ', workbook.sheetnames)
workbook.save('.\source\example_copy.xlsx')
# 修改单元格属性值
sheet['B1'] = 'Hello, world!'
print('B1 modified value: ', sheet['B1'].value)
workbook.save('.\source\example_copy.xlsx')
4.3 기타 작업
import openpyxl
# 公式
workbookCal = openpyxl.Workbook()
sheet = workbookCal.active
sheet['A1'] = 200
sheet['A2'] = 300
# 设置公式.
sheet['A3'] = '=SUM(A1:A2)'
workbookCal.save('.\source\writeFormula.xlsx')
# 行、列操作
workbookOpt = openpyxl.Workbook()
sheetOpt = workbookOpt.active
sheetOpt['A1'] = 'Tall row'
sheetOpt['B2'] = 'Wide column'
# 设置宽高
sheetOpt.row_dimensions[1].height = 70
sheetOpt.column_dimensions['B'].width = 20
# 合并单元格
sheetOpt.merge_cells('A1:D3')
sheetOpt['A1'] = 'Twelve cells merged together.'
sheetOpt.merge_cells('C5:D5')
sheetOpt['C5'] = 'Two merged cells.'
workbookOpt.save('.\source\dimensions.xlsx')
# 分拆单元格
sheetOpt.unmerge_cells('C5:D5')
workbookOpt.save('.\source\dimensions.xlsx')
# 冻结窗口
sheetOpt.freeze_panes = 'C5'
workbookOpt.save('.\source\dimensions.xlsx')
#图表
workbookDraw = openpyxl.Workbook()
sheetDraw = workbookDraw.active
for i in range(1, 11):
sheetDraw['A' + str(i)] = i
refObj = openpyxl.chart.Reference(sheet, min_col=1, min_row=1,max_col=1, max_row=10)
seriesObj = openpyxl.chart.Series(refObj, title='First series')
chartObj = openpyxl.chart.BarChart()
chartObj.title = 'My Chart'
chartObj.append(seriesObj)
sheetDraw.add_chart(chartObj, 'C5')
workbookDraw.save('.\source\sampleChart.xlsx')
V. 종합 실습
다음의 표 구조에 따라 각 카운티의 총인구와 인구조사 지역의 수를 세어 Json 파일로 출력한다.
인구 조사 트랙 | 상태 | 군 | 팝 |
---|---|---|---|
... | ... | ... | ... |
안에:
- CensusTract 는 인구 조사 지역 번호를 나타냅니다.
- State 는 상태 약어를 의미합니다.
- 카운티 는 카운티 의 이름을 나타냅니다.
- POP 는 인구 조사 지역의 인구입니다.
파일 다운로드 주소: censuspopdata.xlsx
구현 코드는 다음과 같습니다.
import openpyxl, pprint
print('Opening workbook...')
workbook = openpyxl.load_workbook('.\source\censuspopdata.xlsx')
sheet = workbook['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
# Make sure the key for this state exists.if already exist, execute nothing.
countyData.setdefault(state, {})
# Make sure the key for this county in this state exists.if already exist, execute nothing.
countyData[state].setdefault(county, {'tracts': 0, 'pop': 0})
# Each row represents one census tract, so increment by one.
countyData[state][county]['tracts'] += 1
# Increase the county pop by the pop in this census tract.
countyData[state][county]['pop'] += int(pop)
# Open a new text file and write the contents of countyData to it.
print('Writing results...')
resultFile = open('.\source\census.json', 'w')
resultFile.write('allData = ' + pprint.pformat(countyData))
resultFile.close()
print(pprint.pformat(countyData))
# print Anchorage population
# print(countyData['AK']['Anchorage']['pop'])
print('Done.')
다음과 같이 반환합니다.
{
"AK": {
"Aleutians East": {
"pop": 3141,
"tracts": 1
},
"Aleutians West": {
"pop": 5561,
"tracts": 2
},
"Anchorage": {
"pop": 291826,
"tracts": 55
},
"Bethel": {
"pop": 17013,
"tracts": 3
},
"Bristol Bay": {
"pop": 997,
"tracts": 1
},
"Denali": {
"pop": 1826,
"tracts": 1
},
"Dillingham": {
"pop": 4847,
"tracts": 2
},
...