Python:openpyxlを使用してexcelテーブルを操作する
7034 ワード
最近、プロジェクトはデータ収集整理の仕事をしなければなりません.一時的な需要でexcel表の操作をシステムに書くのに十分な時間がないので、システムの外でいくつかの小さなツールを一時的にパッケージするしかありません.
中間結果の出力から最終結果までのプロセス全体のexcelに対する操作は20ステップ、すなわち20の小さなツールに分けられ、excelの表間、表内、sheet、セルなど様々な数学計算にほとんど関連している.以前javaのPOI操作excelも使用したことがありますが、POIインタフェースの操作は確かに煩雑で、pythonとopenpyxlを使ってアヒルを追い払って棚に上げました.
Pythonのexcelに対する操作はjavaのpoi構文よりも簡潔で、コード量を少なくとも2倍に減らすことができ、pythonの言語特性と関係がある可能性があります.しかし、一部の操作は直接サポートできないような気がします.一部の場所で引っかかります.速度の面ではpythonの優位性ではなく、百十兆のテストデータは十数分走ることができます.もちろん、これは要求された計算ロジックと自分のコード品質に関係しています.その後は最適化します.
当時書いたdemoの1つを添付します.
中間結果の出力から最終結果までのプロセス全体のexcelに対する操作は20ステップ、すなわち20の小さなツールに分けられ、excelの表間、表内、sheet、セルなど様々な数学計算にほとんど関連している.以前javaのPOI操作excelも使用したことがありますが、POIインタフェースの操作は確かに煩雑で、pythonとopenpyxlを使ってアヒルを追い払って棚に上げました.
Pythonのexcelに対する操作はjavaのpoi構文よりも簡潔で、コード量を少なくとも2倍に減らすことができ、pythonの言語特性と関係がある可能性があります.しかし、一部の操作は直接サポートできないような気がします.一部の場所で引っかかります.速度の面ではpythonの優位性ではなく、百十兆のテストデータは十数分走ることができます.もちろん、これは要求された計算ロジックと自分のコード品質に関係しています.その後は最適化します.
当時書いたdemoの1つを添付します.
#!Linux path:/usr/bin/env python3
# -*- coding: utf-8 -*-
from openpyxl import Workbook
from openpyxl import load_workbook
from sys import argv
from urllib.request import urlopen
import os
import warnings
import sys
inputdir = argv[1] #argv[1] #r"D:\8to9" #argv[1]
outputdir = argv[2] #r"F:\pythonDemo\8to9\test\output" #argv[2]
def split_file():
#
html = urlopen('***********')
strl = str(html.read())
print(strl)
if not '20171103' in strl:
sys.exit(0)
print(" ")
# ( python )
path = os.path.abspath('.')
excel_files = os.listdir()
tempExcels = {}
map_excel = None
for excel in excel_files:
if not excel.startswith("input_8to9_") and not excel == " .xlsx":
continue
if excel == ' .xlsx':
template = path + '/' + excel
print(" :" + template)
map_excel = load_workbook(filename=template)
else:
excelpath = path + '/' + excel
# print(" :" + excelpath)
excelwork = load_workbook(filename=path + "/" + excel)
tempExcels[excel] = excelwork
excel_files1 = os.listdir(inputdir)
for k in excel_files1:
print(k)
for excel in excel_files1:
if excel == 'input_step4_ .xlsx':
print("loading file...")
warnings.simplefilter("ignore")
read_excel = load_workbook(filename = inputdir + "/" + excel)
sheets = read_excel.get_sheet_names()
sheet = read_excel.get_sheet_by_name(sheets[0])
mapsheet = map_excel.get_sheet_by_name("Sheet1")
sheetNames = [' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ']
sheetAndColumnIn = {} # sheet #{' ':83,' ':84}
sheetAndColumnAll = {} # sheet
sheetAndColumnMap = {} # sheet #{" ": 3, " ": 4}
sheetAndRowDict = {} # sheet
headerMap = {} #
# sheetAndColumnIn
for i in range(1,sheet.max_column+1):
s = sheet.cell(row= 2,column=i).value
if s in sheetNames:
sheetAndColumnIn[s] = i
# print(sheetAndColumnIn)
# sheetAndColumnAll
for i in range(1,sheet.max_column+1):
s = sheet.cell(row= 1,column=i).value
sheetAndColumnAll[s] = i
# print(sheetAndColumnAll)
# sheetAndRowDict
for i in sheetNames:
excel1 = tempExcels.get("input_8to9_"+ i + ".xlsx")
sheets = excel1.get_sheet_names()
sheet1 = excel1.get_sheet_by_name(sheets[0])
row = sheet1.max_row
sheetAndRowDict[i] = row
# # ( )
for i in range(1,mapsheet.max_column+1):
s = mapsheet.cell(row= 1,column=i).value
if s in sheetNames:
sheetAndColumnMap[s] = i
# print(sheetAndColumnMap)
for i in sheetNames:
temp = {}
for j in range(2, mapsheet.max_row + 1):
c = sheetAndColumnMap[i]
k = mapsheet.cell(row=j,column=1).value
v = mapsheet.cell(row=j, column=c).value
if v :
if k:
temp[k]= v
headerMap[i] = temp
#
outWorkMap = {}
for index in sheetNames:
temp = {}
excel2 = tempExcels.get("input_8to9_"+ index +".xlsx")
sheets = excel2.get_sheet_names()
sheet2 = excel2.get_sheet_by_name(sheets[0])
for i in range(1, sheet2.max_column+1):
v = sheet2.cell(row=1,column=i).value
if v:
temp[v] = i
outWorkMap[index] = temp
# len(sheetNames) ,
print("insert data...")
print(sheet.max_row)
for i in sheetNames:
temp = headerMap.get(i) # :
list = temp.keys() #
outMap = outWorkMap.get(i) # :
for l in range(3,sheet.max_row+1):
colnum = sheetAndColumnIn.get(i)
v = sheet.cell(row=l, column=colnum).value
if v == '1' or v == 1:
index = sheetAndRowDict[i] + 1
sheetAndRowDict[i] = index
wb = tempExcels["input_8to9_"+ i +".xlsx"]
sheets = wb.get_sheet_names()
temp_sheet = wb.get_sheet_by_name(sheets[0])
#
for m in list:
colnum1 = sheetAndColumnAll.get(m)
if colnum1 == None:
# print(" input "+ i + m + " ")
continue
v = sheet.cell(row = l,column= colnum1).value
row = sheetAndRowDict.get(i)
# m ,
colnum2 = outMap.get(temp.get(m))
if colnum2 == None:
# print( " "+ i + m + " ")
continue
temp_sheet.cell(row = row,column = colnum2,value = v)
print(i + " ")
print("save file...")
for index in sheetNames:
tempExcels["input_8to9_"+ index +".xlsx"].save(outputdir + "/" + "output_8to9" + '_' + index + '.xlsx')
print("succefully!")
return 0
if __name__ == "__main__":
split_file()