xlrd
およびxlwt
の- ドキュメント で、次のことを学びました。
既存のワークブック/シートから読む方法:
from xlrd import open_workbook
wb = open_workbook("ex.xls")
s = wb.sheet_by_index(0)
print s.cell(0,0).value
#Prints contents of cell at location a1 in the first sheet in the document called ex.xls
新しいワークブック/シートを作成する方法:
from xlwt import Workbook
wb = Workbook()
Sheet1 = wb.add_sheet('Sheet1')
Sheet1.write(0,0,'Hello')
wb.save('ex.xls')
#Creates a document called ex.xls with a worksheet called "Sheet1" and writes "Hello" to the cell located at a1
ここでやりたいことは、既存のワークシートで既存のワークシートを開き、そのシートに書き込むことです。
私は次のようなものを試しました:
from xlwt import open_workbook
wb = open_workbook("ex.xls")
s = wb.sheet_by_index(0)
print s.cell(0,0).value
ただし、open_workbook
はxlrd
ではなく、xlwt
モジュールの一部にすぎません。
何か案は?
編集1:オリバーズの提案の後、私はxlutils
を調べて、次のことを試しました:
from xlrd import open_workbook
from xlwt import Workbook
from xlutils.copy import copy
wb = open_workbook("names.xls")
s = wb.get_sheet(0)
s.write(0,0,'A1')
wb.save('names.xls')
ただし、これにより次のエラーメッセージが表示されます。
File "C:\Python27\lib\site-packages\xlrd\book.py", line 655, in get_sheet
raise XLRDError("Can't load sheets after releasing resources.")
xlrd.biffh.XLRDError: Can't load sheets after releasing resources.
編集2:エラーメッセージは、get_sheet
関数の不適切な使用によるものでした。最後にそれを使用する方法を見つけました:
from xlrd import open_workbook
from xlwt import Workbook
from xlutils.copy import copy
rb = open_workbook("names.xls")
wb = copy(rb)
s = wb.get_sheet(0)
s.write(0,0,'A1')
wb.save('names.xls')
Opの編集で書いたように、既存のExcelドキュメントを編集するには、xlutils
モジュールを使用する必要があります(Oliverに感謝)
適切な方法は次のとおりです。
#xlrd, xlutils and xlwt modules need to be installed.
#Can be done via pip install <module>
from xlrd import open_workbook
from xlutils.copy import copy
rb = open_workbook("names.xls")
wb = copy(rb)
s = wb.get_sheet(0)
s.write(0,0,'A1')
wb.save('names.xls')
これにより、「names.xls」の最初のシートのa1にあるセルの内容がテキスト「a1」に置き換えられ、ドキュメントが保存されます。
次に、xlsxと互換性のあるopenpyxl
モジュールを使用して上記のコードを実行する別の方法を示します。これまで見てきたことから、フォーマットも維持されます。
from openpyxl import load_workbook
wb = load_workbook('names.xlsx')
ws = wb['SheetName']
ws['A1'] = 'A1'
wb.save('names.xlsx')