2017-01-29 9 views
6

मेरे पास एक प्रोग्राम है जो openpyxl का उपयोग कर स्प्रेडशीट को लिखता है। कार्यक्रम के निष्पादन पर, कोशिकाओं को अपेक्षित रूप से भर दिया जाता है लेकिन स्प्रेडशीट क्षतिग्रस्त हो जाती है। एक्सेल स्प्रेडशीट की मरम्मत करता है और फिर मैं इसे फिर से देख सकता हूं।स्प्रेडशीट पर लिखने के लिए openpyxl मॉड्यूल का उपयोग एक क्षतिग्रस्त स्प्रेडशीट बनाता है, ज़िपफाइल मॉड्यूल के साथ कैसे ठीक करें?

import openpyxl 
from openpyxl import load_workbook 
amounts, row = [1, 2, 3, 4, 5], 2 
book = load_workbook("output.xlsx") 
sheet = book.active 

for i, value in enumerate(amounts): 
    sheet.cell(column=i+1, row=row, value=value) 
print ("Sheet updating complete.") 
book.save("output.xlsx") 

मैं Microsoft से ओपन एक्सएमएल एसडीके उत्पादकता उपकरण का उपयोग कर एक दूसरे के साथ एक अच्छे और बुरे फ़ाइल की तुलना करने की कोशिश की और पाया है कि styles.xml याद आ रही है है। मैं इसे किसी अन्य प्रश्न से प्राप्त निम्न स्रोत कोड का उपयोग करके कॉपी करने का प्रयास करता हूं, लेकिन यह मेरे लिए समस्या का समाधान नहीं करता है।

import zipfile 
with zipfile.ZipFile('outputcopy.xlsx', 'r') as zgood: 
    styles_xml = zgood.read('xl/styles.xml') 
with zipfile.ZipFile('output.xlsx', 'a') as zbad: 
    zbad.writestr('xl/styles.xml', styles_xml) 

मैं मरम्मत से पुष्टि कर सकते हैं लोग इन एक्सेल उत्पन्न करता है, कि समस्या xl/styles.xml के साथ है। मुझे इस प्रतिलिपि फ़ाइल को अच्छी प्रतिलिपि से, खराब प्रतिलिपि में कॉपी करने की आवश्यकता है।

मैं xl/styles.xml फ़ाइल की प्रतिलिपि कैसे प्राप्त कर सकता हूं ताकि प्रोग्राम output.xlsx को नुकसान पहुंचाए बिना चलाया जा सके?

मैंने इस मुद्दे को ठीक करने का एक और प्रयास किया है। ऑफ मौके में styles.xml को एक अलग एक्सेल फ़ाइल से कॉपी नहीं किया जा सकता है; मैंने book.save("output.xlsx") से पहले output.xlsx से styles.xml खोला है। सहेजने के बाद, मैं सहेजने से पहले styles.xml प्राप्त करता हूं, और इसे लिखता हूं। दुर्भाग्यवश, इसने कुछ भी नहीं बदला है और मुझे अभी भी एक क्षतिग्रस्त एक्सेल फ़ाइल मिल रही है। इस प्रयास के साथ, अपने परीक्षण कोड इस तरह दिखता है:

import openpyxl 
import zipfile 

from openpyxl import load_workbook 
amounts, indexValue, row = [1, 2, 3, 4, 5], 0, 2 
book = load_workbook("output.xlsx") 
sheet = book.active 

for i, value in enumerate(amounts): 
    sheet.cell(column=i+1, row=row, value=value) 
print ("Sheet updating complete.") 

with zipfile.ZipFile('output.xlsx', 'r') as zgood: 
    styles_xml = zgood.read('xl/styles.xml') 

book.save("output.xlsx") 

with zipfile.ZipFile('output.xlsx', 'a') as zbad: 
    zbad.writestr('xl/styles.xml', styles_xml) 

मैं एक पूरी तरह से नए Excel फ़ाइल के रूप में सहेजना की कोशिश की है, लेकिन अभी भी एक ही समस्या है। मैंने output.xlsx से खोलने और नई सहेजी गई फ़ाइल को लिखने के लिए zip file का उपयोग करने का प्रयास किया, लेकिन अभी भी कोई परिणाम नहीं है।

import openpyxl 
import zipfile 
from openpyxl import load_workbook 

amounts, indexValue, row, cell = [1, 2, 3, 4, 5], 0, 2, "A2" 
book = load_workbook("output.xlsx") 
sheet = book.active 

while indexValue != 5: 
    sheet[cell] = amounts[indexValue] 
    indexValue += 1 
    cell = chr(ord(cell[0]) + 1) + str(cell[1]) 
print ("Sheet updating complete.") 

book.save("test.xlsx") 

with zipfile.ZipFile('output.xlsx', 'r') as zgood: 
    styles_xml = zgood.read('xl/styles.xml') 
with zipfile.ZipFile('test.xlsx', 'a') as zbad: 
    zbad.writestr('xl/styles.xml', styles_xml) 

हालांकि मैं पहले से ही इस मुद्दे को तय कर दी है, यह देखते हुए कि इस समस्या को केवल जब किसी कार्यपुस्तिका लोड हो रहा है तब हो रहा है लायक है। मैंने स्प्रैडशीट्स के साथ एक और प्रोग्राम बनाया है जो इसे लोड करने के बजाए कार्यपुस्तिका बनाता है। इसके परिणामस्वरूप, स्प्रेडशीट क्षतिग्रस्त नहीं बचा है।

+0

माइक्रोसॉफ्ट एक्सेल का कौन सा संस्करण आप उपयोग कर रहे हैं? मैं एमएस एक्सेल 2010 का उपयोग कर रहा हूं और यह आपके उदाहरण का उपयोग करके कोई त्रुटि नहीं दिखाता है। – Brian

+0

@ ब्रायन मैं माइक्रोसॉफ्ट एक्सेल, 2016 के नवीनतम संस्करणों का उपयोग कर रहा हूं। मैंने ओएस एक्स और विंडोज 10 दोनों पर एक्सेल फ़ाइल खोलने का प्रयास किया है। एक तरफ ध्यान दें, ऐप्पल के नंबर फ़ाइल को पूरी तरह से ठीक करने में सक्षम हैं। –

उत्तर

4

यह पुष्टि करने के बाद कि यह समस्या styles.xml के साथ थी, मैंने पहचाना कि समस्या लिखित कोशिकाओं की शैली स्वरूपण के साथ सबसे अधिक संभावना थी। openpyxl मॉड्यूल से styles का उपयोग करके, मैंने समस्या ठीक कर दी है।

मैं एक चर, fontStyle इस मामले में ऐलान करते हैं और सेट सभी शैली सेटिंग्स:

fontStyle = Font(name="Calibri", size=12, color=colors.BLACK) 

जब प्रत्येक कक्ष के लिए amounts लेखन, मैं भी का उपयोग कर इन कोशिकाओं की शैली fontStyle सेट:

sheet[cell].font = fontStyle 

पूरा कोड ऐसा दिखाई देता है:

import openpyxl 
from openpyxl import load_workbook 
from openpyxl.styles import colors 
from openpyxl.styles import Font, Color 

fontStyle = Font(name="Calibri", size=12, color=colors.BLACK) 
amounts, indexValue, cell = [1, 2, 3, 4, 5], 0, "A2" 
book = load_workbook("output.xlsx") 
sheet = book.active 

while indexValue != 5: 
    sheet[cell] = amounts[indexValue] 
    sheet[cell].font = fontStyle 
    indexValue += 1 
    cell = chr(ord(cell[0]) + 1) + str(cell[1]) 

print ("Sheet updating complete.") 
book.save("output.xlsx") 

मेरा मानना ​​है कि इसने काम किया है क्योंकि लेखन विधि में कोई डिफ़ॉल्ट शैली सेटिंग्स नहीं है। यह स्पष्ट करेगा कि ओपन एक्सएमएल एसडीके उत्पादकता उपकरण का उपयोग करते समय styles.xml क्यों गुम था। ठीक होने के बाद इस एक्सेल फ़ाइल को फिर से जांचने पर, मैं पुष्टि कर सकता हूं कि styles.xml अब अनुपलब्ध नहीं है।

फाइल सहेजी जाने पर अब क्षतिग्रस्त नहीं है और इसे सामान्य रूप से फिर से खोला जा सकता है। साथ ही, मैं अब एक्सेल फ़ाइल को लिखने के लिए इस स्क्रिप्ट को निष्पादित करने में सक्षम हूं, इसे खोलने और इसे बंद करने के बिना।

ध्यान दें कि मैंने मूल लूप से अपना लूप भी बदल दिया है - इस मुद्दे को ठीक करने के मेरे प्रयासों में से एक के हिस्से के रूप में। इसका अंतिम परिणाम पर कोई असर नहीं पड़ा है - यह सब लिखित कोशिकाओं की स्टाइल के लिए नीचे है।

यह विशेष रूप से zipfile के साथ समस्या को हल करने के प्रश्न का उत्तर नहीं देता है लेकिन यह समस्या को हल करता है।

संबंधित मुद्दे