Skip to main content
https://raw.githubusercontent.com/pyexcel/pyexcel.github.io/master/images/patreon.png https://api.travis-ci.org/pyexcel/pyexcel-ods.svg?branch=master https://codecov.io/gh/pyexcel/pyexcel-ods/branch/master/graph/badge.svg https://img.shields.io/gitter/room/gitterHQ/gitter.svg

pyexcel-ods is a tiny wrapper library to read, manipulate and write data in ods format using python 2.6 and python 2.7. You are likely to use it with pyexcel. pyexcel-ods3 is a sister library that depends on ezodf and lxml. pyexcel-odsr is the other sister library that has no external dependency but do ods reading only

Known constraints

Fonts, colors and charts are not supported.

Installation

You can install it via pip:

$ pip install pyexcel-ods

or clone it and install it:

$ git clone https://github.com/pyexcel/pyexcel-ods.git
$ cd pyexcel-ods
$ python setup.py install

Support the project

If your company has embedded pyexcel and its components into a revenue generating product, please support me on patreon to maintain the project and develop it further.

If you are an individual, you are welcome to support me too on patreon and for however long you feel like to. As a patreon, you will receive early access to pyexcel related contents.

With your financial support, I will be able to invest a little bit more time in coding, documentation and writing interesting posts.

Usage

As a standalone library

Write to an ods file

Here’s the sample code to write a dictionary to an ods file:

>>> from pyexcel_ods import save_data
>>> data = OrderedDict() # from collections import OrderedDict
>>> data.update({"Sheet 1": [[1, 2, 3], [4, 5, 6]]})
>>> data.update({"Sheet 2": [["row 1", "row 2", "row 3"]]})
>>> save_data("your_file.ods", data)

Read from an ods file

Here’s the sample code:

>>> from pyexcel_ods import get_data
>>> data = get_data("your_file.ods")
>>> import json
>>> print(json.dumps(data))
{"Sheet 1": [[1, 2, 3], [4, 5, 6]], "Sheet 2": [["row 1", "row 2", "row 3"]]}

Write an ods to memory

Here’s the sample code to write a dictionary to an ods file:

>>> from pyexcel_ods import save_data
>>> data = OrderedDict()
>>> data.update({"Sheet 1": [[1, 2, 3], [4, 5, 6]]})
>>> data.update({"Sheet 2": [[7, 8, 9], [10, 11, 12]]})
>>> io = StringIO()
>>> save_data(io, data)
>>> # do something with the io
>>> # In reality, you might give it to your http response
>>> # object for downloading

Read from an ods from memory

Continue from previous example:

>>> # This is just an illustration
>>> # In reality, you might deal with ods file upload
>>> # where you will read from requests.FILES['YOUR_ODS_FILE']
>>> data = get_data(io)
>>> print(json.dumps(data))
{"Sheet 1": [[1, 2, 3], [4, 5, 6]], "Sheet 2": [[7, 8, 9], [10, 11, 12]]}

Pagination feature

Special notice 30/01/2017: due to the constraints of the underlying 3rd party library, it will read the whole file before returning the paginated data. So at the end of day, the only benefit is less data returned from the reading function. No major performance improvement will be seen.

With that said, please install pyexcel-odsr and it gives better performance in pagination.

Let’s assume the following file is a huge ods file:

>>> huge_data = [
...     [1, 21, 31],
...     [2, 22, 32],
...     [3, 23, 33],
...     [4, 24, 34],
...     [5, 25, 35],
...     [6, 26, 36]
... ]
>>> sheetx = {
...     "huge": huge_data
... }
>>> save_data("huge_file.ods", sheetx)

And let’s pretend to read partial data:

>>> partial_data = get_data("huge_file.ods", start_row=2, row_limit=3)
>>> print(json.dumps(partial_data))
{"huge": [[3, 23, 33], [4, 24, 34], [5, 25, 35]]}

And you could as well do the same for columns:

>>> partial_data = get_data("huge_file.ods", start_column=1, column_limit=2)
>>> print(json.dumps(partial_data))
{"huge": [[21, 31], [22, 32], [23, 33], [24, 34], [25, 35], [26, 36]]}

Obvious, you could do both at the same time:

>>> partial_data = get_data("huge_file.ods",
...     start_row=2, row_limit=3,
...     start_column=1, column_limit=2)
>>> print(json.dumps(partial_data))
{"huge": [[23, 33], [24, 34], [25, 35]]}

As a pyexcel plugin

No longer, explicit import is needed since pyexcel version 0.2.2. Instead, this library is auto-loaded. So if you want to read data in ods format, installing it is enough.

Reading from an ods file

Here is the sample code:

>>> import pyexcel as pe
>>> sheet = pe.get_book(file_name="your_file.ods")
>>> sheet
Sheet 1:
+---+---+---+
| 1 | 2 | 3 |
+---+---+---+
| 4 | 5 | 6 |
+---+---+---+
Sheet 2:
+-------+-------+-------+
| row 1 | row 2 | row 3 |
+-------+-------+-------+

Writing to an ods file

Here is the sample code:

>>> sheet.save_as("another_file.ods")

Reading from a IO instance

You got to wrap the binary content with stream to get ods working:

>>> # This is just an illustration
>>> # In reality, you might deal with ods file upload
>>> # where you will read from requests.FILES['YOUR_ODS_FILE']
>>> odsfile = "another_file.ods"
>>> with open(odsfile, "rb") as f:
...     content = f.read()
...     r = pe.get_book(file_type="ods", file_content=content)
...     print(r)
...
Sheet 1:
+---+---+---+
| 1 | 2 | 3 |
+---+---+---+
| 4 | 5 | 6 |
+---+---+---+
Sheet 2:
+-------+-------+-------+
| row 1 | row 2 | row 3 |
+-------+-------+-------+

Writing to a StringIO instance

You need to pass a StringIO instance to Writer:

>>> data = [
...     [1, 2, 3],
...     [4, 5, 6]
... ]
>>> io = StringIO()
>>> sheet = pe.Sheet(data)
>>> io = sheet.save_to_memory("ods", io)
>>> # then do something with io
>>> # In reality, you might give it to your http response
>>> # object for downloading

License

New BSD License

Developer guide

Development steps for code changes

  1. git clone https://github.com/pyexcel/pyexcel-ods.git

  2. cd pyexcel-ods

Upgrade your setup tools and pip. They are needed for development and testing only:

  1. pip install –upgrade setuptools pip

Then install relevant development requirements:

  1. pip install -r rnd_requirements.txt # if such a file exists

  2. pip install -r requirements.txt

  3. pip install -r tests/requirements.txt

Once you have finished your changes, please provide test case(s), relevant documentation and update CHANGELOG.rst.

How to test your contribution

Although nose and doctest are both used in code testing, it is adviable that unit tests are put in tests. doctest is incorporated only to make sure the code examples in documentation remain valid across different development releases.

On Linux/Unix systems, please launch your tests like this:

$ make

On Windows systems, please issue this command:

> test.bat

How to update test environment and update documentation

Additional steps are required:

  1. pip install moban

  2. git clone https://github.com/moremoban/setupmobans.git # generic setup

  3. git clone https://github.com/pyexcel/pyexcel-commons.git commons

  4. make your changes in .moban.d directory, then issue command moban

What is pyexcel-commons

Many information that are shared across pyexcel projects, such as: this developer guide, license info, etc. are stored in pyexcel-commons project.

What is .moban.d

.moban.d stores the specific meta data for the library.

Acceptance criteria

  1. Has Test cases written

  2. Has all code lines tested

  3. Passes all Travis CI builds

  4. Has fair amount of documentation if your change is complex

  5. Please update CHANGELOG.rst

  6. Please add yourself to CONTRIBUTORS.rst

  7. Agree on NEW BSD License for your contribution

Credits

ODSReader is originally written by Marco Conti

Change log

0.5.0 - 30.08.2017

Updated

  1. put dependency on pyexcel-io 0.5.0, which uses cStringIO instead of StringIO. Hence, there will be performance boost in handling files in memory.

Relocated

  1. All ods type conversion code lives in pyexcel_io.service module

0.4.1 - 25.08.2017

Updated

  1. #23, handle unseekable stream given by http response

  2. PR #22, hanle white spaces in a cell.

0.4.0 - 19.06.2017

Updated

  1. #14, close file handle

  2. pyexcel-io plugin interface now updated to use lml.

0.3.3 - 07.05.2017

Updated

  1. issue #19, not all texts in a multi-node cell were extracted.

0.3.2 - 13.04.2017

Updated

  1. issue #17, empty new line is ignored

  2. issue #6, PT288H00M00S is valid duration

0.3.1 - 02.02.2017

Added

  1. Recognize currency type

0.3.0 - 22.12.2016

Updated

  1. Code refactoring with pyexcel-io v 0.3.0

0.2.2 - 24.10.2016

Updated

  1. issue #14, index error when reading a ods file that has non-uniform columns repeated property.

0.2.1 - 31.08.2016

Added

  1. support pagination. two pairs: start_row, row_limit and start_column, column_limit help you deal with large files.

  2. use odfpy 1.3.3 as compulsory package. offically support python 3

0.2.0 - 01.06.2016

Added

  1. By default, float will be converted to int where fits. auto_detect_int, a flag to switch off the autoatic conversion from float to int.

  2. ‘library=pyexcel-ods’ was added so as to inform pyexcel to use it instead of other libraries, in the situation where multiple plugins were installed.

Updated

  1. support the auto-import feature of pyexcel-io 0.2.0

0.1.1 - 30.01.2016

Added

  1. ‘streaming’ is an extra option given to get_data. Only when ‘streaming’ is explicitly set to True, the data will be consisted of generators, hence will break your existing code.

  2. uses yield in to_array and returns a generator

  3. support multi-line text cell #5

  4. feature migration from pyexcel-ods3 pyexcel/pyexcel-ods3#5

Updated

  1. compatibility with pyexcel-io 0.1.1

0.0.12 - 10.10.2015

Updated

  1. Bug fix: excessive trailing columns with empty values

0.0.11 - 26.09.2015

Updated

  1. Complete fix for libreoffice datetime field

0.0.10 - 15.09.2015

Updated

  1. Bug fix: date field could have datetime from libreoffice

0.0.9 - 21.08.2015

Updated

  1. Bug fix: utf-8 string throw unicode exceptions

0.0.8 - 28.06.2015

Updated

  1. Pin dependency odfpy 0.9.6 to avoid buggy odfpy 1.3.0

0.0.7 - 28.05.2015

Updated

  1. Bug fix: “number-columns-repeated” is now respected

0.0.6 - 21.05.2015

Updated

  1. get_data and save_data are seen across pyexcel-* extensions. remember them once and use them across all extensions.

0.0.5 - 22.02.2015

Added

  1. Loads only one sheet from a multiple sheet book

  2. Use New BSD License

0.0.4 - 14.12.2014

Updated

  1. IO interface update as pyexcel-io introduced keywords.

0.0.3 - 08.12.2014

  1. initial release

Metadata

Release files for pyexcel-ods 0.5.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pyexcel-ods 0.5.0
File Size Uploaded
pyexcel-ods-0.5.0.tar.gz 15.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pyexcel-ods 0.5.0
File Interpreter ABI Platform
pyexcel_ods-0.5.0-py2.py3-none-any.whl Python 2, Python 3 none any Details

Total release size: 30.1 kB

Release files / pyexcel-ods-0.5.0.tar.gz

Download URL pyexcel-ods-0.5.0.tar.gz
Size 15.2 kB
Tags Source
SHA-256 checksum
How to use checksums
1e95e2e97e998efba4aa9ef67eadc05f5b62302d7d2a8ac1447ad4968af2ca06
BLAKE2b-256 checksum
How to use checksums
72d5824870e72547a372c8f14eba32c4b19df8a03cbe4d62c76ad622dc251c39
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release files / pyexcel_ods-0.5.0-py2.py3-none-any.whl

Download URL pyexcel_ods-0.5.0-py2.py3-none-any.whl
Size 14.9 kB
Tags Python 2 Python 3
SHA-256 checksum
How to use checksums
d494c3ce7623fcb75574fe038e4b3c7169d403a57956cb5124a335c4240baea6
BLAKE2b-256 checksum
How to use checksums
a1d6e42792c021cb9834bc63b8d6f5c4a64e8772d8fe6260d2b2ded1250ec6c5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release history Release notifications | RSS feed

0.6.0

2 release files

0.5.6

2 release files

0.5.4

2 release files

0.5.3

2 release files

0.5.2

2 release files

0.5.1

2 release files

This release

0.5.0 This release

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.3

2 release files

0.3.2

1 release file

0.3.1

1 release file

0.3.0

1 release file

0.2.3

0.2.2

1 release file

0.2.1

1 release file

0.2.0

1 release file

0.1.1

1 release file

0.1.0

1 release file

0.0.12

1 release file

0.0.11

1 release file

0.0.10

1 release file

0.0.9

1 release file

0.0.8

1 release file

0.0.6

1 release file

0.0.5

1 release file

0.0.4

1 release file

0.0.3

1 release file

0.0.2

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page