Excelスプレッドシートへの書き込み


149

私はPythonが初めてです。プログラムからスプレッドシートにデータを書き込む必要があります。私はオンラインで検索しましたが、利用可能なパッケージが多数あるようです(xlwt、XlsXcessive、openpyxl)。他の人は.csvファイルに書き込むことを提案します(CSVを使用したことがなく、CSVが何であるか本当に理解していない)。

プログラムは非常に簡単です。2つのリスト(float)と3つの変数(string)があります。2つのリストの長さがわかりません。おそらく同じ長さではありません。

下の図のようなレイアウトにしたい:

レイアウトサンプル

ピンク色の列は最初のリストの値を持ち、緑の列は2番目のリストの値を持ちます。

これを行うための最良の方法は何ですか?

PS 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ファイルがどのようなものかがわかります。tsvを使用する主な利点は、Office 2010のExcelだけでなく、基本的にどのバージョンのスプレッドシートプログラムでも開くことができると確信できることです
goncalopp

Pythonで文字列形式を使用して、数値データの表示を制御します。
Fred Mitchell

openpyxlをチェックして.xlsxファイルを操作する
サンティアゴ

回答:


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を直接制御できることを説明します。
マイケルディロン

1
リンクは非常に役に立ちました。ありがとう
Jey

3
.xlsファイルはその数の行しかサポートしないため、このコードの最大行数の制限は65536行です
Shreyas Pimpalgaonkar

1
明確に言うxlwt.xls、Excel 2003以前の古いファイルを書き込むためだけのものです。これは古くなっている可能性があります(ニーズによって異なります)。
カウリネーター

openpyxlをチェックして.xlsxファイルを操作できます
サンティアゴ

140

pandasのDataFrame.to_excelを使用します。パンダを使用すると、機能が豊富なデータ構造でデータを表すことができ、 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、

いい
感じ

2
かなり確信してパンダを使用していますxlrd / xlwtライブラリのExcelの機能のためには、pandas.pydata.org/pandas-docs/stable/io.html#excel-files
mrmagooey

6
私もそれが使用されていると想定していxlwtましたが、openpyxlエラーが発生しました。これで混乱する他の人のために-それはあなたが望むファイルタイプにすべてあります。パンダ(0.12)のドキュメントでは、「.xls拡張子のあるファイルはxlwtを使用して記述され、拡張子のあるファイルはopenpyxlを使用して.xlsx記述されます」と記載されています。
Racing Tadpole

5
なぜ人々はそれがやり過ぎだと言っているのかわかりません。私の目的のために、それは私が探していたものでした。ありがとう!
阿部

35
  • xlrd / xlwt(標準):Pythonの標準ライブラリにはこの機能はありませんが、xlrd / xlwtはExcelファイルを読み書きするための「標準」の方法だと思います。ワークブックの作成、シートの追加、データ/数式の書き込み、セルの書式設定はかなり簡単です。これらすべてが必要な場合は、このライブラリで最も成功する可能性があります。代わりにopenpyxlを選択してもかまいませんが、かなり似ていますが、使用していません。

    セルをxlwtでフォーマットするには、を定義XFStyleし、シートに書き込むときにスタイルを含めます。これは、多くの数値フォーマットの例です。以下のコード例を参照してください。

  • Tablib(強力で直感的):Tablibは、表形式のデータを操作するためのより強力で直感的なライブラリです。複数のシートや、csv、json、yamlなどの他の形式のExcelワークブックを作成できます。フォーマットされたセル(背景色など)が必要ない場合は、このライブラリを使用することをお勧めします。これにより、長い目で見るとさらに遠くまで行けるようになります。

  • csv(簡単):コンピュータ上のファイルは、テキストまたはバイナリです。テキストファイルは、改行やタブなどの特別なファイルを含む単なる文字であり、どこでも簡単に開くことができます(メモ帳、Webブラウザー、Office製品など)。csvファイルは、特定の方法でフォーマットされたテキストファイルです。各行は、コンマで区切られた値のリストです。Pythonプログラムはテキストを簡単に読み書きできるので、csvファイルは、PythonプログラムからExcel(または別のPythonプログラム)にデータをエクスポートする最も簡単で最速の方法です。

    Excelファイルはバイナリであり、ファイル形式を知っている特別なライブラリが必要です。そのため、それらを読み書きするには、Python用の追加ライブラリ、または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 2013

1
特に重要ではありませんが、Tablibは、他の多くの高レベルパッケージと同様に、xlwtを使用してExcelファイルを出力します。
John Y

13

Python用のいくつかのExcelモジュールを調査したところ、openpyxlが最適であることがわかりました。

無料の本「Pythonで退屈なものを自動化する」には、openpyxlに関する詳細ながあり、Read the Docsサイトチェックすることもできます。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 2013

@Flimmどうやって単純に異なるセルに書き込むのですか?
オールドボーイ

あなたは、Python 3を使用していて、ファイルが非ASCII文字が含まれている、などの場合éまたは、あなたはもっと良いf.write('\xEF\xBB\xBF')の後に右をopen()。これは、MicrosoftソフトウェアがUTF-8エンコーディングを認識するために必要なBOM(バイトオーダーマーク、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()

7

次のライブラリも見てみてください。

xlwings -Pythonからスプレッドシートにデータを出し入れしたり、ワークブックやグラフを操作したりするため

ExcelPython -VBAの代わりにPythonでユーザー定義関数(UDF)とマクロを作成するためのExcelアドイン


2

OpenPyxl Excel 2010のxlsx / xlsmファイルを読み書きするために構築された、非常に優れたライブラリです。

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

もう1つの答えは、それを参照することは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 '19

@Atinesh-フィードバックをありがとう- openpyxl.load_workbookすでに存在するワークブックをロードします。New.xlsxこのエラーを回避するためにファイルを作成します。
Vityata 2018

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です。Pythonは、この小数点を、正確な数を含めるようにユーザーからの指示として解釈します。小数点以下の桁数を制限する必要がある場合は、出力を制限する印刷コマンドを作成できるはずです。

print variable_example[:13]

データに小数点の左側に2つの整数があると仮定すると、小数点以下10桁に制限されます。


0

あなたは試すことができますhfexcelに基づいて人間にやさしいオブジェクト指向のPythonライブラリを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を活用しているので、これは防弾になります。

私の見てください要旨 Linuxシステムを設定する方法については、いくつかの基本的なコーディング使用して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.