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つを添付します.
#!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()