542 lines
16 KiB
Plaintext
542 lines
16 KiB
Plaintext
Metadata-Version: 2.1
|
|
Name: pyexcel-ods3
|
|
Version: 0.6.1
|
|
Summary: A wrapper library to read, manipulate and write data in ods format
|
|
Home-page: https://github.com/pyexcel/pyexcel-ods3
|
|
Author: C.W.
|
|
Author-email: info@pyexcel.org
|
|
License: New BSD
|
|
Download-URL: https://github.com/pyexcel/pyexcel-ods3/archive/0.6.1.tar.gz
|
|
Keywords: python,ods
|
|
Platform: UNKNOWN
|
|
Classifier: Topic :: Software Development :: Libraries
|
|
Classifier: Programming Language :: Python
|
|
Classifier: Intended Audience :: Developers
|
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
Classifier: Programming Language :: Python :: 3.6
|
|
Classifier: Programming Language :: Python :: 3.7
|
|
Classifier: Programming Language :: Python :: 3.8
|
|
Classifier: License :: OSI Approved :: BSD License
|
|
Requires-Python: >=3.6
|
|
License-File: LICENSE
|
|
Requires-Dist: pyexcel-io (>=0.6.2)
|
|
Requires-Dist: lxml
|
|
Requires-Dist: pyexcel-ezodf (>=0.3.3)
|
|
|
|
================================================================================
|
|
pyexcel-ods3 - Let you focus on data, instead of ods format
|
|
================================================================================
|
|
|
|
.. image:: https://raw.githubusercontent.com/pyexcel/pyexcel.github.io/master/images/patreon.png
|
|
:target: https://www.patreon.com/chfw
|
|
|
|
.. image:: https://raw.githubusercontent.com/pyexcel/pyexcel-mobans/master/images/awesome-badge.svg
|
|
:target: https://awesome-python.com/#specific-formats-processing
|
|
|
|
.. image:: https://github.com/pyexcel/pyexcel-ods3/workflows/run_tests/badge.svg
|
|
:target: http://github.com/pyexcel/pyexcel-ods3/actions
|
|
|
|
.. image:: https://codecov.io/gh/pyexcel/pyexcel-ods3/branch/master/graph/badge.svg
|
|
:target: https://codecov.io/gh/pyexcel/pyexcel-ods3
|
|
|
|
.. image:: https://badge.fury.io/py/pyexcel-ods3.svg
|
|
:target: https://pypi.org/project/pyexcel-ods3
|
|
|
|
.. image:: https://anaconda.org/conda-forge/pyexcel-ods3/badges/version.svg
|
|
:target: https://anaconda.org/conda-forge/pyexcel-ods3
|
|
|
|
.. image:: https://pepy.tech/badge/pyexcel-ods3/month
|
|
:target: https://pepy.tech/project/pyexcel-ods3
|
|
|
|
.. image:: https://anaconda.org/conda-forge/pyexcel-ods3/badges/downloads.svg
|
|
:target: https://anaconda.org/conda-forge/pyexcel-ods3
|
|
|
|
.. image:: https://img.shields.io/gitter/room/gitterHQ/gitter.svg
|
|
:target: https://gitter.im/pyexcel/Lobby
|
|
|
|
.. image:: https://img.shields.io/static/v1?label=continuous%20templating&message=%E6%A8%A1%E7%89%88%E6%9B%B4%E6%96%B0&color=blue&style=flat-square
|
|
:target: https://moban.readthedocs.io/en/latest/#at-scale-continous-templating-for-open-source-projects
|
|
|
|
.. image:: https://img.shields.io/static/v1?label=coding%20style&message=black&color=black&style=flat-square
|
|
:target: https://github.com/psf/black
|
|
|
|
**pyexcel-ods3** is a tiny wrapper library to read, manipulate and write data in ods
|
|
format. You are likely to use `pyexcel <https://github.com/pyexcel/pyexcel>`__ together
|
|
with this library. `pyexcel-ods <https://github.com/pyexcel/pyexcel-ods>`__ is a sister
|
|
library that depends on GPL licensed odfpy.
|
|
`pyexcel-odsr <https://github.com/pyexcel/pyexcel-odsr>`_ is the other sister library
|
|
that has no external dependency but do ods reading only
|
|
|
|
Support the project
|
|
================================================================================
|
|
|
|
If your company has embedded pyexcel and its components into a revenue generating
|
|
product, please support me on github, `patreon <https://www.patreon.com/bePatron?u=5537627>`_
|
|
or `bounty source <https://salt.bountysource.com/teams/chfw-pyexcel>`_ to maintain
|
|
the project and develop it further.
|
|
|
|
If you are an individual, you are welcome to support me too and for however long
|
|
you feel like. As my backer, you will receive
|
|
`early access to pyexcel related contents <https://www.patreon.com/pyexcel/posts>`_.
|
|
|
|
And your issues will get prioritized if you would like to become my patreon as `pyexcel pro user`.
|
|
|
|
With your financial support, I will be able to invest
|
|
a little bit more time in coding, documentation and writing interesting posts.
|
|
|
|
|
|
Known constraints
|
|
==================
|
|
|
|
Fonts, colors and charts are not supported.
|
|
|
|
Nor to read password protected xls, xlsx and ods files.
|
|
|
|
Installation
|
|
================================================================================
|
|
|
|
|
|
You can install pyexcel-ods3 via pip:
|
|
|
|
.. code-block:: bash
|
|
|
|
$ pip install pyexcel-ods3
|
|
|
|
|
|
or clone it and install it:
|
|
|
|
.. code-block:: bash
|
|
|
|
$ git clone https://github.com/pyexcel/pyexcel-ods3.git
|
|
$ cd pyexcel-ods3
|
|
$ python setup.py install
|
|
|
|
Usage
|
|
================================================================================
|
|
|
|
As a standalone library
|
|
--------------------------------------------------------------------------------
|
|
|
|
Write to an ods file
|
|
********************************************************************************
|
|
|
|
|
|
|
|
Here's the sample code to write a dictionary to an ods file:
|
|
|
|
.. code-block:: python
|
|
|
|
>>> from pyexcel_ods3 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:
|
|
|
|
.. code-block:: python
|
|
|
|
>>> from pyexcel_ods3 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:
|
|
|
|
.. code-block:: python
|
|
|
|
>>> from pyexcel_ods3 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:
|
|
|
|
.. code-block:: python
|
|
|
|
>>> # 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 <https://github.com/pyexcel/pyexcel-odsr>`_
|
|
and it gives better performance in pagination.
|
|
|
|
Let's assume the following file is a huge ods file:
|
|
|
|
.. code-block:: python
|
|
|
|
>>> 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:
|
|
|
|
.. code-block:: python
|
|
|
|
>>> 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:
|
|
|
|
.. code-block:: python
|
|
|
|
>>> 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:
|
|
|
|
.. code-block:: python
|
|
|
|
>>> 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:
|
|
|
|
.. code-block:: python
|
|
|
|
>>> 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:
|
|
|
|
.. code-block:: python
|
|
|
|
>>> sheet.save_as("another_file.ods")
|
|
|
|
|
|
Reading from a IO instance
|
|
********************************************************************************
|
|
|
|
You got to wrap the binary content with stream to get ods working:
|
|
|
|
.. code-block:: python
|
|
|
|
>>> # 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:
|
|
|
|
.. code-block:: python
|
|
|
|
>>> 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
|
|
|
|
#. git clone https://github.com/pyexcel/pyexcel-ods3.git
|
|
#. cd pyexcel-ods3
|
|
|
|
Upgrade your setup tools and pip. They are needed for development and testing only:
|
|
|
|
#. pip install --upgrade setuptools pip
|
|
|
|
Then install relevant development requirements:
|
|
|
|
#. pip install -r rnd_requirements.txt # if such a file exists
|
|
#. pip install -r requirements.txt
|
|
#. pip install -r tests/requirements.txt
|
|
|
|
Once you have finished your changes, please provide test case(s), relevant documentation
|
|
and update changelog.yml
|
|
|
|
.. note::
|
|
|
|
As to rnd_requirements.txt, usually, it is created when a dependent
|
|
library is not released. Once the dependecy is installed
|
|
(will be released), the future
|
|
version of the dependency in the requirements.txt will be valid.
|
|
|
|
|
|
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, please issue this command::
|
|
|
|
> test.bat
|
|
|
|
|
|
Before you commit
|
|
------------------------------
|
|
|
|
Please run::
|
|
|
|
$ make format
|
|
|
|
so as to beautify your code otherwise your build may fail your unit test.
|
|
|
|
|
|
Installation Note
|
|
================================================================================
|
|
The installation of `lxml` will be tricky on Windows platform. It is recommended that you download a lxml's own windows installer instead of using pip.
|
|
|
|
|
|
|
|
|
|
5 contributors
|
|
================================================================================
|
|
|
|
In alphabetical order:
|
|
|
|
* `Benedikt Waldvogel <https://github.com/bwaldvogel>`_
|
|
* `Mateusz Konieczny <https://github.com/matkoniecz>`_
|
|
* `Michael K. <https://github.com/michael-k>`_
|
|
* `Stephen J. Fuhry <https://github.com/fuhrysteve>`_
|
|
* `Vincent Raspal <https://github.com/vinraspa>`_
|
|
|
|
Change log
|
|
================================================================================
|
|
|
|
0.6.1 - 1.2.2022
|
|
--------------------------------------------------------------------------------
|
|
|
|
**added**
|
|
|
|
#. `#28 <https://github.com/pyexcel/pyexcel-ods3/issues/28>`_: support datetime
|
|
|
|
0.6.0 - 8.10.2020
|
|
--------------------------------------------------------------------------------
|
|
|
|
**added**
|
|
|
|
#. new style reader and writer plugins. works with pyexcel-io v0.6.2
|
|
|
|
0.5.3 - 27.11.2018
|
|
--------------------------------------------------------------------------------
|
|
|
|
**added**
|
|
|
|
#. `pyexcel#57 <https://github.com/pyexcel/pyexcel/issues/57>`_, long type will
|
|
not be written in ods. please use string type. And if the integer is equal or
|
|
greater than 10 to the power of 16, it will not be written either in ods. In
|
|
both situation, IntegerPrecisionLossError will be raised.
|
|
|
|
0.5.2 - 23.10.2017
|
|
--------------------------------------------------------------------------------
|
|
|
|
**updated**
|
|
|
|
#. pyexcel `pyexcel#105 <https://github.com/pyexcel/pyexcel/issues/105>`_,
|
|
remove gease from setup_requires, introduced by 0.5.1.
|
|
#. remove python2.6 test support
|
|
#. update its dependecy on pyexcel-io to 0.5.3
|
|
|
|
0.5.1 - 20.10.2017
|
|
--------------------------------------------------------------------------------
|
|
|
|
**added**
|
|
|
|
#. `pyexcel#103 <https://github.com/pyexcel/pyexcel/issues/103>`_, include
|
|
LICENSE file in MANIFEST.in, meaning LICENSE file will appear in the released
|
|
tar ball.
|
|
|
|
0.5.0 - 30.08.2017
|
|
--------------------------------------------------------------------------------
|
|
|
|
**Updated**
|
|
|
|
#. 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**
|
|
|
|
#. All ods type conversion code lives in pyexcel_io.service module
|
|
|
|
0.4.1 - 17.08.2017
|
|
--------------------------------------------------------------------------------
|
|
|
|
**Updated**
|
|
|
|
#. update dependency to use pyexcel-ezodf v0.3.3 as ezodf 0.3.2 has `the bug
|
|
<https://github.com/pyexcel/pyexcel-ezodf/issues/1>`_, cannot handle file
|
|
alike objects and has not been updated for 2 years.
|
|
|
|
0.4.0 - 19.06.2017
|
|
--------------------------------------------------------------------------------
|
|
|
|
**Updated**
|
|
|
|
#. `pyexcel#14 <https://github.com/pyexcel/pyexcel/issues/14>`_, close file
|
|
handle
|
|
#. pyexcel-io plugin interface now updated to use `lml
|
|
<https://github.com/chfw/lml>`_.
|
|
|
|
0.3.2 - 13.04.2017
|
|
--------------------------------------------------------------------------------
|
|
|
|
**Updated**
|
|
|
|
#. issue `pyexcel#8 <https://github.com/pyexcel/pyexcel/issues/8>`_,
|
|
PT288H00M00S is valid duration
|
|
|
|
0.3.1 - 02.02.2017
|
|
--------------------------------------------------------------------------------
|
|
|
|
**Added**
|
|
|
|
#. Recognize currency type
|
|
|
|
0.3.0 - 22.12.2016
|
|
--------------------------------------------------------------------------------
|
|
|
|
**Updated**
|
|
|
|
#. Code refactoring with pyexcel-io v 0.3.0
|
|
|
|
0.2.2 - 05.11.2016
|
|
--------------------------------------------------------------------------------
|
|
|
|
**Updated**
|
|
|
|
#. `pyexcel#11 <https://github.com/pyexcel/pyexcel/issues/11>`_, be able to
|
|
consume a generator of two dimensional arrays.
|
|
|
|
0.2.1 - 31.08.2016
|
|
--------------------------------------------------------------------------------
|
|
|
|
**Added**
|
|
|
|
#. support pagination. two pairs: start_row, row_limit and start_column,
|
|
column_limit help you deal with large files.
|
|
|
|
0.2.0 - 01.06.2016
|
|
--------------------------------------------------------------------------------
|
|
|
|
**Added**
|
|
|
|
#. 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`.
|
|
#. 'library=pyexcel-ods3' was added so as to inform pyexcel to use it instead of
|
|
other libraries, in the situation where multiple plugins for the same file
|
|
type are installed
|
|
|
|
**Updated**
|
|
|
|
#. support the auto-import feature of pyexcel-io 0.2.0
|
|
#. compatibility with pyexcel-io 0.1.0
|
|
|
|
0.1.0 - 17.01.2016
|
|
--------------------------------------------------------------------------------
|
|
|
|
**Updated**
|
|
|
|
#. support the auto-import feature of pyexcel-io 0.2.0
|
|
#. compatibility with pyexcel-io 0.1.0
|
|
|
|
|
|
|