openpyxlモジュールを使用してスプレッドシートに書き込むと、破損したスプレッドシートが作成されます。zipfileモジュールで修正するにはどうすればよいですか?

オーガストウィリアムズ

を使用してスプレッドシートに書き込むプログラムがありますopenpyxlプログラムの実行時に、セルは期待どおりに埋められますが、スプレッドシートが破損します。Excelがスプレッドシートを修復し、再度表示できるようになりました。

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のOpenXML SDK Productivity Toolを使用して、良いファイルと悪いファイルを相互に比較しようとしました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)

Excelが生成する修復ログから、問題がにあることを確認できますxl/styles.xmlこのxmlファイルを良いコピーから悪いコピーにコピーする必要があります。

xl/styles.xmlプログラムを損傷することなく実行できるようにファイルをコピーするにはどうすればよいoutput.xlsxですか?

私はこの問題を修正するために別の試みをしました。styles.xml別のExcelファイルからコピーできない可能性があります。以前から開店styles.xmloutput.xlsxましたbook.save("output.xlsx")保存後styles.xml、saveステートメントの前からfromを取得し、それを記述します。残念ながら、これは何も変更されておらず、Excelファイルが破損しています。この試みでは、私のテストコードは次のようになります。

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ファイルとして保存しようとしましたが、それでも同じ問題が発生します。を使用zip fileoutput.xlsxて、新しく保存したファイルを開いて書き込んでみましたが、それでも結果が得られませんでした。

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)

私はすでにこの問題を修正しましたが、この問題はブックをロードするときにのみ発生するように見えることに注意してください。ワークブックをロードするのではなく、作成するスプレッドシートを使用して別のプログラムを作成しました。この結果、スプレッドシートは破損したものを保存しません。

オーガストウィリアムズ

問題がにあることを確認した後、問題はstyles.xml書き込まれたセルのスタイルフォーマットにある可能性が最も高いことを確認しました。モジュールstylesから使用することでopenpyxl、問題を修正しました。

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、Open XMLSDK生産性ツールを使用するときに欠落していた理由を説明します。修正後にこのExcelファイルを再度確認するstyles.xmlと、欠落しいないことが確認できます

保存時にファイルが破損することはなくなり、通常どおりに開くことができます。また、このスクリプトを実行して、Excelファイルを修復するために開いたり閉じたりすることなく、Excelファイルに再度書き込むことができるようになりました。

問題を修正する試みの一環として、ループを元のループから変更したことにも注意してください。これは最終的な結果に影響を与えていません-それはすべて書かれたセルのスタイリングにかかっています。

これは、具体的に問題を解決するという質問に正確に答えるわけではありませんzipfileが、問題を解決します。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ