2016-07-21 2 views
1

일부 엑셀 파일을 처리하는 데 사용할 플라스크 응용 프로그램을 작성했지만 .xlsx 파일로 작성했습니다. 입력 된 파일은 Openlsxl이 열 수 없다는 것을 알고있는 .xls 파일 일 수 있습니다. 애플리케이션에서 Openpyxl로 파일을 처리하기 전에 어떻게 파일을 .xlsx로 변환 할 수 있습니까?.xls를 .xlsx로 변환하면 Openpyxl도 함께 작동합니다.

xlrd를 사용하여 원본 .xls를 Openpyxl에서 처리 할 수있는 .xlsx 파일로 작성하는 것에 대해 온라인에서 봤지만 특정 응용 프로그램에 맞게 조정하는 데 문제가있었습니다.

미리 감사드립니다.

from openpyxl import load_workbook 
from openpyxl.styles import Style, Font 
from flask import Flask, request, render_template, redirect, url_for, send_file 
import os 


app = Flask(__name__) 

@app.route('/') 
def index(): 
    return """<center><body bgcolor="#FACC2E"> 
      <h1><p>Automated TDX Report</h1></p><br> 
    <form action="/upload" method=post enctype=multipart/form-data> 
     <p><input type=file name=file> 
     <input type=submit value=Upload> 
    </form></center></body>""" 

@app.route('/upload', methods = ['GET', 'POST']) 
def upload(): 
    if request.method == 'POST': 
     f = request.files['file'] 
     f.save(f.filename) 
     return process(f.filename) 

def process(filename): 


    VP = ['ZYJD', 'ZYJC', 'ZYKC', 'ZYKA', 'ZYKB', 'ZYKD', 'ZYKE', 'ZYKF', 'ZYJB', 'ZYJX', 'ZYKG', 'ZYKH', 'ZYJE', 'ZYJA', 
     'ZYKI', 'ZYKX', 'ZYKK', 'ZYKJ', 'ZYJF', 'ZYJK', 'ZYJG', 'ZYJJ', 'ZYKL', 'ZYKM', 'ZYKN'] 

    VA = ['ZYIC', 'ZYIB', 'ZYHC', 'ZYIA', 'ZYHA', 'ZYHG', 'ZYHB', 'ZYID', 'ZYDA', 'ZYIE', 'ZYHD', 'ZYIG', 'ZYIX', 'ZYHE', 
     'ZYIF', 'ZYHX', 'ZYDE', 'ZYHF', 'ZYLB', 'ZYAC', 'ZYCF', 'ZYDF', 'ZYBG', 'ZYDG', 'ZYDD', 'ZYDH', 'ZYCB', 'ZYCA', 
     'ZYWA', 'ZYWB', 'ZYWC', 'ZYWD', 'ZYWE', 'ZYWF', 'ZYWG', 'ZYWI', 'ZYWJ'] 

    Gordon = ['ZYDB', 'ZYDX', 'ZYEB', 'ZYED', 'ZYEC', 'ZYEA', 'ZYEX', 'ZYFE', 'ZYFX', 'ZYFD', 'ZYFA', 'ZYFC', 'ZYFB', 
      'ZYGC', 'ZYGA', 'ZYGX', 'ZYGB', 'ZYGF', 'ZYGG', 'ZYGD', 'ZYLA', 'ZYBF', 'ZYBE', 'ZYLD', 'ZYKM', 'ZYKN', 
      'ZYCC', 'ZYCE'] 

    Pete = ['ZYAD', 'ZYBX', 'ZYAX', 'ZYAB', 'ZYBC', 'ZYBA', 'ZYBB', 'ZYAA', 'ZYBD', 'ZYLE', 'ZYCX', 'ZYAE', 'ZYCC', 'ZYCE', 
      'ZYLA', 'ZYBF', 'ZYBE', 'ZYLD'] 

    Mike = ['ZYKP', 'ZYAP', 'ZYHP', 'ZYJP', 'ZYFP', 'ZYJR', 'ZYCP', 'ZYIR', 'ZYAR', 'ZYBP', 'ZYKR', 'ZYJS', 'ZYIP', 'ZYHR', 
      'ZYEP', 'ZYFF', 'ZYGP', 'ZYKS', 'ZYEE', 'ZYJH', 'ZYII', 'ZYHH', 'ZYJW'] 

    workbook = load_workbook(filename) 
    worksheet = workbook.active 

    worksheet.column_dimensions.group('B', hidden=True) 
    worksheet.column_dimensions.group('D', hidden=True) 
    worksheet.column_dimensions.group('E', hidden=True) 
    worksheet.column_dimensions.group('F', hidden=True) 
    worksheet.column_dimensions.group('G', hidden=True) 
    worksheet.column_dimensions.group('H', hidden=True) 
    worksheet.column_dimensions.group('I', hidden=True) 
    worksheet.column_dimensions.group('K', hidden=True) 
    worksheet.column_dimensions.group('L', hidden=True) 
    worksheet.column_dimensions.group('M', hidden=True) 
    worksheet.column_dimensions.group('N', hidden=True) 
    worksheet.column_dimensions.group('O', hidden=True) 
    worksheet.column_dimensions.group('P', hidden=True) 
    worksheet.column_dimensions.group('Q', hidden=True) 
    worksheet.column_dimensions.group('R', hidden=True) 
    worksheet.column_dimensions.group('S', hidden=True) 
    worksheet.column_dimensions.group('T', hidden=True) 
    worksheet.column_dimensions.group('U', hidden=True) 
    worksheet.column_dimensions.group('V', hidden=True) 
    worksheet.column_dimensions.group('W', hidden=True) 
    worksheet.column_dimensions.group('X', hidden=True) 
    worksheet.column_dimensions.group('Y', hidden=True) 
    worksheet.column_dimensions.group('Z', hidden=True) 
    worksheet.column_dimensions.group('AA', hidden=True) 
    worksheet.column_dimensions.group('AB', hidden=True) 
    worksheet.column_dimensions.group('AC', hidden=True) 
    worksheet.column_dimensions.group('AD', hidden=True) 
    worksheet.column_dimensions.group('AE', hidden=True) 
    worksheet.column_dimensions.group('AF', hidden=True) 
    worksheet.column_dimensions.group('AG', hidden=True) 
    worksheet.column_dimensions.group('AH', hidden=True) 
    worksheet.column_dimensions.group('AI', hidden=True) 
    worksheet.column_dimensions.group('AJ', hidden=True) 
    worksheet.column_dimensions.group('AK', hidden=True) 
    worksheet.column_dimensions.group('AM', hidden=True) 
    worksheet.column_dimensions.group('AN', hidden=True) 
    worksheet.column_dimensions.group('AP', hidden=True) 
    worksheet.column_dimensions.group('AQ', hidden=True) 
    worksheet.column_dimensions.group('AR', hidden=True) 
    worksheet.column_dimensions.group('AS', hidden=True) 
    worksheet.column_dimensions.group('AT', hidden=True) 
    worksheet.column_dimensions.group('AU', hidden=True) 
    worksheet.column_dimensions.group('AV', hidden=True) 
    worksheet.column_dimensions.group('AW', hidden=True) 
    worksheet.column_dimensions.group('AX', hidden=True) 
    worksheet.column_dimensions.group('AY', hidden=True) 
    worksheet.column_dimensions.group('AZ', hidden=True) 
    worksheet.column_dimensions.group('BA', hidden=True) 
    worksheet.column_dimensions.group('BB', hidden=True) 
    worksheet.column_dimensions.group('BC', hidden=True) 
    worksheet.column_dimensions.group('BD', hidden=True) 
    worksheet.column_dimensions.group('BE', hidden=True) 
    worksheet.column_dimensions.group('BF', hidden=True) 
    worksheet.column_dimensions.group('BH', hidden=True) 
    worksheet.column_dimensions.group('BI', hidden=True) 
    worksheet.column_dimensions.group('BJ', hidden=True) 
    worksheet.column_dimensions.group('BK', hidden=True) 
    worksheet.column_dimensions.group('BL', hidden=True) 
    worksheet.column_dimensions.group('BM', hidden=True) 
    worksheet.column_dimensions.group('BN', hidden=True) 
    worksheet.column_dimensions.group('BO', hidden=True) 
    worksheet.column_dimensions.group('BP', hidden=True) 
    worksheet.column_dimensions.group('BQ', hidden=True) 
    worksheet.column_dimensions.group('BR', hidden=True) 
    worksheet.column_dimensions.group('BS', hidden=True) 
    worksheet.column_dimensions.group('BT', hidden=True) 
    worksheet.column_dimensions.group('BU', hidden=True) 
    worksheet.column_dimensions.group('BV', hidden=True) 
    worksheet.column_dimensions.group('BW', hidden=True) 
    worksheet.column_dimensions.group('BX', hidden=True) 
    worksheet.column_dimensions.group('BY', hidden=True) 
    worksheet.column_dimensions.group('BZ', hidden=True) 
    worksheet.column_dimensions.group('CA', hidden=True) 
    worksheet.column_dimensions.group('CB', hidden=True) 
    worksheet.column_dimensions.group('CC', hidden=True) 
    worksheet.column_dimensions.group('CD', hidden=True) 
    worksheet.column_dimensions.group('CE', hidden=True) 
    worksheet.column_dimensions.group('CF', hidden=True) 
    worksheet.column_dimensions.group('CG', hidden=True) 
    worksheet.column_dimensions.group('CH', hidden=True) 
    worksheet.column_dimensions.group('CI', hidden=True) 
    worksheet.column_dimensions.group('CJ', hidden=True) 
    worksheet.column_dimensions.group('CK', hidden=True) 
    worksheet.column_dimensions.group('CL', hidden=True) 
    worksheet.column_dimensions.group('CM', hidden=True) 
    worksheet.column_dimensions.group('CN', hidden=True) 
    worksheet.column_dimensions.group('CO', hidden=True) 
    worksheet.column_dimensions.group('CP', hidden=True) 
    worksheet.column_dimensions.group('CQ', hidden=True) 
    worksheet.column_dimensions.group('CR', hidden=True) 
    worksheet.column_dimensions.group('CS', hidden=True) 
    worksheet.column_dimensions.group('CU', hidden=True) 


    routecolumn = worksheet.columns[58] 
    i = 2 
    supervisorheader = worksheet.cell("CV1") 
    s = Style(font=Font(bold=True)) 
    supervisorheader.style = s 

    worksheet['CV1'] = 'Supervisor' 
    for route in routecolumn: 
     if route.value == 'Responsible Route': 
      continue 
     if route.value in Gordon: 
      pos = Gordon.index(route.value) 
      worksheet['CV' + str(i)].value = 'Gordon' 
      i += 1 
     elif route.value in VA: 
      pos = VA.index(route.value) 
      worksheet['CV' + str(i)].value = 'Vinny A' 
      i += 1 
     elif route.value in VP: 
      pos = VP.index(route.value) 
      worksheet['CV' + str(i)].value = 'Vinny P' 
      i += 1 
     elif route.value in Pete: 
      pos = Pete.index(route.value) 
      worksheet['CV' + str(i)].value = 'Pete' 
      i += 1 
     elif route.value in Mike: 
      pos = Mike.index(route.value) 
      worksheet['CV' + str(i)].value = 'Mike' 
      i += 1 
     elif route.value not in Gordon or route.value not in VA or route.value not in VP or route.value not in Pete \ 
     or route.value not in Mike: 
      worksheet['CV' + str(i)].value = 'Building' 
      i += 1 


    workbook.save(filename) 
    newfilename = filename.strip(".xlsx") 
    newfilename = newfilename + ".xls" 
    os.rename('/home/MY NAME/'+filename, '/home/MY NAME/'+newfilename) 

    return send_file(newfilename, attachment_filename='tdx.xls', as_attachment=True), os.remove ('/home/MY NAME/'+newfilename) 



if __name__ == '__main__': 
    app.run(debug = True, host = '0.0.0.0') 
+2

[이 질문에 대한 답변] (http://stackoverflow.com/questions/9918646/how-to-convert-xls-to-xlsx) 만족스럽지 않습니까? – taleinat

+0

흠. 그래서 그 대답 xlrd는 새로운 xlsx 파일에 그것을 쓴 다음 book1 (새 책)을 반환하기보다는 openpyxl로 열어서 처리할까요? 나에게 의미가있다. – Harrison

+1

코드는 최소한이어야합니다. 제공된 코드는 실제 질문과 아무 관련이 없습니다. –

답변

1

내 권장 사항 : 필요한 값을 읽으려면 xlrd를 사용하고 새 xlsx 통합 문서를 만들려면 openpyxl을 사용하십시오. xlrd를 사용하여 관련된 모든 정보를 얻을 수 있어야합니다.

셀에서 값을 읽는 것만이 아니라 "활성"워크 시트를 선택하는 것입니다. 나는 제목의 스레드에서 this Google Groups post 발견 "xlrd : 활성 시트 가져 오기"

import xlrd 
b = xlrd.open_workbook("vis.xls") # where vis.xls is your test file 
for i, s in enumerate(b.sheets()): 
    print(i, s.name, s.sheet_selected, s.sheet_visible) 

또한 노트 :

작동 확인하려면 다음의 코드는 .sheet_selected 특성 또는 .sheet_visible 속성을 사용하려고 말한다

이 두 속성은 라인 2. sheet_visible 약에서 시작 DICT _WINDOW_2sheet.py에서 설명하는 것은 당신이 원하는 아마. 이 비트를 표시하는 MS 문서를 정의되지 않음으로 무시하십시오.

+0

이 답변은 xls를 xlsx로 변환하는 것과 관련이 있습니까? – ptierno

+1

첫 번째 문장의 일부가 분명하다고 생각했습니다. "xlrd를 사용하여 필요한 값을 읽고 openpyxl을 사용하여 새 xlsx 통합 문서를 만듭니다." – taleinat

0

가장 좋은 방법은 XLS 파일을 OpenOffice/LibreOffice (headless mode)에 파이프하여 변환을 수행 한 다음 처리를 위해 파일을 파이썬으로로드하는 것입니다.

+0

은 xml을 파싱하기 위해 파이썬 라이브러리가 이미 존재하기 때문에 300MB 이상의 프레임 워크를 호출합니다. – cowbert

+0

그것은 과도하지 않으며 쉘에서 한 줄입니다. –

관련 문제