を使用してスプレッドシートに書き込むプログラムがあります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.xml
しoutput.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 file
しoutput.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]
コメントを追加