Excel 스프레드 시트에 쓰기


149

저는 Python을 처음 사용합니다. 프로그램의 데이터를 스프레드 시트에 써야합니다. 온라인에서 검색했으며 사용 가능한 많은 패키지 (xlwt, XlsXcessive, openpyxl)가있는 것 같습니다. 다른 사람들은 .csv 파일에 쓰도록 제안합니다 (CSV를 사용하지 않았으며 실제로 무엇인지 이해하지 못합니다).

이 프로그램은 매우 간단합니다. 두 개의 목록 (부동)과 세 개의 변수 (문자열)가 있습니다. 두 목록의 길이를 모르며 아마도 같은 길이가 아닐 것입니다.

아래 그림과 같이 레이아웃을 원합니다.

레이아웃 샘플

분홍색 열에는 첫 번째 목록의 값이 있고 녹색 열에는 두 번째 목록의 값이 있습니다.

가장 좋은 방법은 무엇입니까?

추신 : 저는 Windows 7을 실행하고 있지만이 프로그램을 실행하는 컴퓨터에 반드시 Office가 설치되어 있지는 않습니다.

import xlwt

x=1
y=2
z=3

list1=[2.34,4.346,4.234]

book = xlwt.Workbook(encoding="utf-8")

sheet1 = book.add_sheet("Sheet 1")

sheet1.write(0, 0, "Display")
sheet1.write(1, 0, "Dominance")
sheet1.write(2, 0, "Test")

sheet1.write(0, 1, x)
sheet1.write(1, 1, y)
sheet1.write(2, 1, z)

sheet1.write(4, 0, "Stimulus Time")
sheet1.write(4, 1, "Reaction Time")

i=4

for n in list1:
    i = i+1
    sheet1.write(i, 0, n)



book.save("trial.xls")

나는 당신의 모든 제안을 사용하여 이것을 썼습니다. 작업이 완료되지만 약간 개선 될 수 있습니다.

for 루프 (list1 값)에서 생성 된 셀을 과학적 또는 숫자로 어떻게 포맷합니까?

값을 자르고 싶지 않습니다. 프로그램에 사용 된 실제 값은 소수점 이하 약 10 자리입니다.


메모장 / 워드 패드와 같은 텍스트 편집기에서 tsv 파일을 열면 파일이 무엇인지 이해할 수 있습니다. TSV를 사용하는 주요 장점은 기본적으로 스프레드 시트 프로그램의 버전을 열 수 있다는 것을 확신 할 수 있으며,뿐만 아니라 오피스 2010의 엑셀이다
goncalopp

파이썬에서 문자열 형식을 사용하여 숫자 데이터의 표시를 제어하십시오.
Fred Mitchell

openpyxl 에서 .xlsx 파일로 작업 하는지 확인
Santiago

답변:


95
import xlwt

def output(filename, sheet, list1, list2, x, y, z):
    book = xlwt.Workbook()
    sh = book.add_sheet(sheet)

    variables = [x, y, z]
    x_desc = 'Display'
    y_desc = 'Dominance'
    z_desc = 'Test'
    desc = [x_desc, y_desc, z_desc]

    col1_name = 'Stimulus Time'
    col2_name = 'Reaction Time'

    #You may need to group the variables together
    #for n, (v_desc, v) in enumerate(zip(desc, variables)):
    for n, v_desc, v in enumerate(zip(desc, variables)):
        sh.write(n, 0, v_desc)
        sh.write(n, 1, v)

    n+=1

    sh.write(n, 0, col1_name)
    sh.write(n, 1, col2_name)

    for m, e1 in enumerate(list1, n+1):
        sh.write(m, 0, e1)

    for m, e2 in enumerate(list2, n+1):
        sh.write(m, 1, e2)

    book.save(filename)

자세한 설명 : https://github.com/python-excel


13
Windows에서 Python을 실행 중이고 동일한 컴퓨터에 Excel을 설치 한 경우 Python COM 인터페이스를 사용하여 Excel을 직접 제어 할 수 있습니다.
Michael Dillon

1
이 링크는 매우 도움이되었습니다. 감사합니다
Jey

3
그냥 참고 .XLS 파일은 많은 행을 지원하기로이 코드의 최대 행 한도는 65536 개 행이와 그
Shreyas Pimpalgaonkar

1
분명히 말하면 Excel 2003 또는 이전 버전 xlwt의 이전 .xls파일을 작성하는 것입니다. 구식 일 수도 있습니다 (필요에 따라 다름).
cowlinator

openpyxl 을 검사 하여 .xlsx 파일로 작업 할 수 있습니다
Santiago

140

pandas의 DataFrame.to_excel 을 사용하십시오 . Pandas를 사용하면 기능이 풍부한 데이터 구조로 데이터를 표현할 수 있으며 Excel 파일에서도 읽을 수 있습니다 .

먼저 데이터를 DataFrame으로 변환 한 다음 Excel 파일에 다음과 같이 저장해야합니다.

In [1]: from pandas import DataFrame
In [2]: l1 = [1,2,3,4]
In [3]: l2 = [1,2,3,4]
In [3]: df = DataFrame({'Stimulus Time': l1, 'Reaction Time': l2})
In [4]: df
Out[4]: 
   Reaction Time  Stimulus Time
0              1              1
1              2              2
2              3              3
3              4              4

In [5]: df.to_excel('test.xlsx', sheet_name='sheet1', index=False)

그리고 나오는 Excel 파일은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

팬더가 불평 할 경우 두 목록의 길이가 같아야합니다. 이 문제를 해결하려면 모든 결 측값을로 바꿉니다 None.


고맙지 만 내 요구에 너무 복잡해 보입니다.
Jey

좋은 일,하지만 조금 잔인한 일
Burhan입니다 칼리드

2
팬더는 xlrd / xlwt 라이브러리를 사용하여 탁월한 성능을 발휘합니다. pandas.pydata.org/pandas-docs/stable/io.html#excel-files
mrmagooey

6
나는 그것이 xlwt너무 사용되었다고 가정 했지만 openpyxl오류가 발생했습니다. 이것에 혼란스러워하는 다른 사람들을 위해-그것은 당신이 원하는 파일 유형에 있습니다. pandas (0.12) 문서는 " .xls확장자를 가진 파일은 xlwt를 사용하여 작성 되고 확장자를 가진 파일은 openpyxl을 .xlsx사용하여 작성됩니다"라고 말합니다.
레이싱 올챙이

5
사람들이 왜 과잉이라고 말하는지 잘 모르겠습니다. 내 목적을 위해 그것은 내가 찾던 것입니다. 감사!
Abe

35
  • xlrd / xlwt (표준) : 파이썬은 표준 라이브러리에이 기능이 없지만 xlrd / xlwt 를 Excel 파일을 읽고 쓰는 "표준"방법 이라고 생각 합니다. 통합 문서를 만들고, 시트를 추가하고, 데이터 / 수식을 작성하고, 셀을 포맷하는 것은 매우 쉽습니다. 이 모든 것을 필요로하면이 라이브러리에서 가장 성공할 수 있습니다. 나는 당신이 대신 openpyxl을 선택할 수 있다고 생각하며 꽤 비슷할 것입니다. 그러나 나는 그것을 사용하지 않았습니다.

    xlwt를 사용하여 셀의 서식을 지정하려면 XFStyle시트에 쓸 때 스타일을 정의 하고 포함하십시오. 다음은 숫자 형식이 많은 예입니다 . 아래 예제 코드를 참조하십시오.

  • Tablib (강력하고 직관적 인) : Tablib 는 테이블 형식의 데이터 작업을위한보다 강력하지만 직관적 인 라이브러리입니다. csv, json 및 yaml과 같은 다른 형식뿐만 아니라 여러 시트로 Excel 통합 문서를 작성할 수 있습니다. 배경색과 같은 서식이 지정된 셀이 필요하지 않은 경우이 라이브러리를 사용하는 것이 좋습니다.

  • csv (easy) : 컴퓨터의 파일은 text 또는 binary 입니다. 텍스트 파일은 줄 바꿈 및 탭과 같은 특수 파일을 포함하여 문자 일 뿐이며 어디서나 쉽게 열 수 있습니다 (예 : 메모장, 웹 브라우저 또는 Office 제품). csv 파일은 특정 방식으로 형식이 지정된 텍스트 파일입니다. 각 줄은 쉼표로 구분 된 값 목록입니다. 파이썬 프로그램은 쉽게 텍스트를 읽고 쓸 수 있으므로 csv 파일은 파이썬 프로그램에서 Excel (또는 다른 파이썬 프로그램)로 데이터를 내보내는 가장 쉽고 빠른 방법입니다.

    Excel 파일은 바이너리이며 파일 형식을 알고있는 특수 라이브러리가 필요합니다. 따라서 파이썬 용 추가 라이브러리 또는 Microsoft Excel, Gnumeric 또는 LibreOffice와 같은 특수 프로그램을 읽고 쓰려면이 라이브러리가 필요합니다.


import xlwt

style = xlwt.XFStyle()
style.num_format_str = '0.00E+00'

...

for i,n in enumerate(list1):
    sheet1.write(i, 0, n, fmt)

2
CSV 파일을 작성하려는 경우 표준 라이브러리에 포함 된 csv 모듈 을 사용 하려고합니다.
Flimm

1
특별히 중요하지는 않지만 Tablib은 다른 많은 고급 패키지와 마찬가지로 xlwt를 사용하여 Excel 파일을 출력합니다.
John Y

13

파이썬 용 Excel 모듈을 조사한 결과 openpyxl 이 가장 좋습니다.

무료로 제공되는 Python으로 지루한 물건 자동화하기 openpyxl 에 대한 자세한 내용 이 포함 된 장을 읽거나 문서 읽기 사이트를 확인할 수 있습니다. openpyxl을 사용하기 위해 Office 또는 Excel을 설치할 필요가 없습니다.

프로그램은 다음과 같습니다.

import openpyxl
wb = openpyxl.load_workbook('example.xlsx')
sheet = wb.get_sheet_by_name('Sheet1')

stimulusTimes = [1, 2, 3]
reactionTimes = [2.3, 5.1, 7.0]

for i in range(len(stimulusTimes)):
    sheet['A' + str(i + 6)].value = stimulusTimes[i]
    sheet['B' + str(i + 6)].value = reactionTimes[i]

wb.save('example.xlsx')

오류가 발생했습니다 : int64를 Excel로 변환 할 수 없습니다
pnkjmndhl

11

CSV는 쉼표로 구분 된 값을 나타냅니다. CSV는 텍스트 파일과 유사하며 .CSV 확장자 를 추가하여 간단하게 만들 수 있습니다.

예를 들어 다음 코드를 작성하십시오.

f = open('example.csv','w')
f.write("display,variable x")
f.close()

이 파일을 Excel로 열 수 있습니다.


5
CSV를 사용하여 열 배경의 서식을 지정할 수 없습니다. 가져 오기 및 내보내기를위한 데이터 형식 일뿐입니다.
Michael Dillon

5
이 작업을 수행하려면 표준 라이브러리에 포함 된 csv 모듈 을 사용하고 싶을 것입니다 . 예를 들어 인용을 더 잘 처리합니다.
Flimm

@Flimm 어떻게 다른 셀에 간단하게 쓸 수 있습니까?
oldboy

파이썬 3를 사용하고 같은 파일이 ASCII가 아닌 문자가 포함 된 경우 é또는 , 당신은 더 나은 할 f.write('\xEF\xBB\xBF')애프터 권리를 open(). UTF-8 인코딩을 인식하기 위해 Microsoft 소프트웨어에 필요한 BOM ( byte order mark , qv)
Walter Tross

10
import xlsxwriter


# Create an new Excel file and add a worksheet.
workbook = xlsxwriter.Workbook('demo.xlsx')
worksheet = workbook.add_worksheet()

# Widen the first column to make the text clearer.
worksheet.set_column('A:A', 20)

# Add a bold format to use to highlight cells.
bold = workbook.add_format({'bold': True})

# Write some simple text.
worksheet.write('A1', 'Hello')

# Text with formatting.
worksheet.write('A2', 'World', bold)

# Write some numbers, with row/column notation.
worksheet.write(2, 0, 123)
worksheet.write(3, 0, 123.456)

# Insert an image.
worksheet.insert_image('B5', 'logo.png')

workbook.close()


2

OpenPyxl Excel 2010 xlsx / xlsm 파일을 읽거나 쓰도록 작성된 훌륭한 라이브러리입니다.

https://openpyxl.readthedocs.io/en/stable

다른 답변 은 deperciated 함수 ( get_sheet_by_name)를 사용하고 있습니다. 이것이없는 방법입니다.

import openpyxl

wbkName = 'New.xlsx'        #The file should be created before running the code.
wbk = openpyxl.load_workbook(wbkName)
wks = wbk['test1']
someValue = 1337
wks.cell(row=10, column=1).value = someValue
wbk.save(wbkName)
wbk.close

1
위의 코드는 오류가 발생합니다FileNotFoundError: [Errno 2] No such file or directory: 'New.xlsx'
Atinesh

@Atinesh-의견 주셔서 감사합니다- openpyxl.load_workbook이미 존재하는 통합 문서를로드합니다. New.xlsx이 오류를 피하려면 파일 을 작성하십시오 .
Vityata

1
OK 제안 해 주셔서 감사합니다
Atinesh

openpyxl은 이전 'xls'형식을 지원하지 않습니다.
디모데 C. 퀸

2

xlsxwriter라이브러리 만들기에 좋은 곳입니다 .xlsx파일을. 다음 코드 조각 .xlsx순서표시된 이름을 표시 하면서 dicts 목록에서 파일을 생성합니다 .

from xlsxwriter import Workbook


def create_xlsx_file(file_path: str, headers: dict, items: list):
    with Workbook(file_path) as workbook:
        worksheet = workbook.add_worksheet()
        worksheet.write_row(row=0, col=0, data=headers.values())
        header_keys = list(headers.keys())
        for index, item in enumerate(items):
            row = map(lambda field_id: item.get(field_id, ''), header_keys)
            worksheet.write_row(row=index + 1, col=0, data=row)


headers = {
    'id': 'User Id',
    'name': 'Full Name',
    'rating': 'Rating',
}

items = [
    {'id': 1, 'name': "Ilir Meta", 'rating': 0.06},
    {'id': 2, 'name': "Abdelmadjid Tebboune", 'rating': 4.0},
    {'id': 3, 'name': "Alexander Lukashenko", 'rating': 3.1},
    {'id': 4, 'name': "Miguel Díaz-Canel", 'rating': 0.32}
]

create_xlsx_file("my-xlsx-file.xlsx", headers, items)

여기에 이미지 설명을 입력하십시오


💡 참고 1-OP가 제시 한 정확한 사례에 의도적으로 응답하지 않습니다. 대신, 나는 대부분의 방문자들이 추구하는 더 일반적인 솔루션 IMHO를 제시하고 있습니다. 이 질문의 제목은 검색 엔진에서 잘 색인되어 있으며 많은 트래픽을 추적합니다.

여기에 이미지 설명을 입력하십시오

💡 참고 2- Python3.6 이상을 사용 하지 않는 경우 OrderedDictin 사용 을 고려하십시오 headers. Python3.6 이전에는 순서 dict가 유지되지 않았습니다.



0

정확한 숫자를 가져 오는 가장 쉬운 방법은 l1및 의 숫자 뒤에 소수를 추가하는 것 l2입니다. 파이썬은이 소수점을 정확한 숫자를 포함시키는 지시로 해석합니다. 소수점 이하 자릿수로 제한해야하는 경우 다음과 같이 출력을 제한하는 인쇄 명령을 작성할 수 있어야합니다.

print variable_example[:13]

데이터에 소수점 왼쪽에 두 개의 정수가 있다고 가정하면 소수점 이하 10 자리로 제한합니다.


0

당신이 시도 할 수 hfexcel 을 기반으로 인간 친화적 객체 지향 파이썬 라이브러리 XlsxWriter를 :

from hfexcel import HFExcel

hf_workbook = HFExcel.hf_workbook('example.xlsx', set_default_styles=False)

hf_workbook.add_style(
    "headline", 
    {
       "bold": 1,
        "font_size": 14,
        "font": "Arial",
        "align": "center"
    }
)

sheet1 = hf_workbook.add_sheet("sheet1", name="Example Sheet 1")

column1, _ = sheet1.add_column('headline', name='Column 1', width=2)
column1.add_row(data='Column 1 Row 1')
column1.add_row(data='Column 1 Row 2')

column2, _ = sheet1.add_column(name='Column 2')
column2.add_row(data='Column 2 Row 1')
column2.add_row(data='Column 2 Row 2')


column3, _ = sheet1.add_column(name='Column 3')
column3.add_row(data='Column 3 Row 1')
column3.add_row(data='Column 3 Row 2')

# In order to get a row with coordinates:
# sheet[column_index][row_index] => row
print(sheet1[1][1].data)
assert(sheet1[1][1].data == 'Column 2 Row 2')

hf_workbook.save()

0

기존 통합 문서를 수정해야하는 경우 가장 안전한 방법은 pyoo 을 사용하는 입니다. 일부 라이브러리가 설치되어 있어야하며 몇 번의 이동이 필요하지만 일단 설정되면 LibreOffice / OpenOffice의 광범위하고 견고한 API를 활용하므로 방탄이됩니다.

리눅스 시스템을 설정하고 pyoo을 사용하여 기본 코딩을 수행하는 방법에 대해서는 내 요지 를 참조하십시오 .

코드의 예는 다음과 같습니다.

#!/usr/local/bin/python3
import pyoo
# Connect to LibreOffice using a named pipe 
# (named in the soffice process startup)
desktop = pyoo.Desktop(pipe='oo_pyuno')
wkbk = desktop.open_spreadsheet("<xls_file_name>")
sheet = wkbk.sheets['Sheet1']
# Write value 'foo' to cell E5 on Sheet1
sheet[4,4].value='foo'
wkbk.save()
wkbk.close()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.