programing

텍스트 및 파일스트림을 통해 openpyxl 파일 저장

lovejava 2023. 4. 9. 20:54

텍스트 및 파일스트림을 통해 openpyxl 파일 저장

OpenPyXL을 파일 스트림을 통해 쓰기 위해 엑셀 파일의 내용을 포함하는 문자열이 필요한 어플리케이션으로 만들고 있습니다.

OpenPyXL 소스 코드를 조사한 결과, 이러한 출력을 지원하지 않는 것 같습니다.이를 지원하기 위해 openpyxl을 수정한 경험이 있는 사람이 있습니까?

또는 일반적인 조언/회피책은 무엇입니까?

감사해요.

jcollado의 답변은 실제로 유효하지만 openpyxl에는 "save_virtual_disples"라는 함수(아직 문서화되어 있지 않음)writer.writer.writer는 워크북을 문자열로 반환합니다.

from openpyxl.workbook import Workbook
from openpyxl.writer.excel import save_virtual_workbook

wb = Workbook()
print save_virtual_workbook(wb)

찾고 있는 문자열은 save_virtual_workbook()에서 반환된 문자열입니다.

openpyxl 2.6에서는save_virtual_workbookmethod는 다음 경고를 발행합니다.

DeprecationWarning: Call to deprecated function save_virtual_workbook (Use a NamedTemporaryFile).

어느 순간save_virtual_workbookopenpyxl에서 제거됩니다.

Python 3에서는 openpyxl 워크북을 filestream에 저장하는 일반적인 방법은 다음과 같습니다.

from io import BytesIO
from tempfile import NamedTemporaryFile
from openpyxl import Workbook

wb = Workbook()
with NamedTemporaryFile() as tmp:
    wb.save(tmp.name)
    output = BytesIO(tmp.read())

워크북 구현 검토 후save메서드에서는 '파일명'이 ZipFile로 직접 전송됩니다.ZipFile은 경로 또는 파일 유사 개체를 받아들이기 때문에 이름 지정이 필요 없습니다.Temporary File 및 메모리 내 바이트 사용IO:

from io import BytesIO
from openpyxl import Workbook

wb = Workbook()
virtual_workbook = BytesIO()
wb.save(virtual_workbook)

# now use virtual_workbook to send to a stream; email attachment, etc

를 사용하는 것은 어떨까요?StringIO파일 내용을 저장하는 object:

from openpyxl.workbook import Workbook
from StringIO import StringIO

output = StringIO()
wb = Workbook()
wb.save(output)
print output.getvalue()

찾고 있는 문자열은 이 예의 마지막 줄에 인쇄되어 있는 문자열입니다.

와의 호환성이 있는 실장save_virtual_workbook버전 2.6 이후 권장되지 않음:

from io import BytesIO
from tempfile import NamedTemporaryFile


def save_virtual_workbook(workbook):
    with NamedTemporaryFile() as tf:
        workbook.save(tf.name)
        in_memory = BytesIO(tf.read())
        return in_memory.getvalue()
from openpyxl import Workbook
from io import BytesIO

rows = [[1,2], [3,4]]

book = Workbook()
sheet = book.active

for row in rows:
    sheet.append(row)

io = BytesIO
book.save(io)

content = io.getValue()

return Response(
    content,
    mimetype=magic.from_buffer(content, mime=True),
    headers={
    'Content-Disposition': 'attachment;filename=' + 'test.xlsx'}
)

언급URL : https://stackoverflow.com/questions/8469665/saving-openpyxl-file-via-text-and-filestream