Package: pyexcel-ods
pyexcel-odsis 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 withpyexcel.pyexcel-ods3is a sister library that
depends on ezodf and lxml.pyexcel-odsris the other sister library that has no external dependency but do ods reading onlySupport the projectIf your company has embedded pyexcel and its components into a revenue generating
product, please support me on github,patreonorbounty sourceto 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 receiveearly access to pyexcel related contents.And your issues will get prioritized if you would like to become my patreon aspyexcel 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 constraintsFonts, colors and charts are not supported.InstallationYou can install pyexcel-ods via pip:$pipinstallpyexcel-odsor clone it and install it:$gitclonehttps://github.com/pyexcel/pyexcel-ods.git$cdpyexcel-ods$pythonsetup.pyinstallUsageAs a standalone libraryWrite to an ods fileHere’s the sample code to write a dictionary to an ods file:>>>frompyexcel_odsimportsave_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 fileHere’s the sample code:>>>frompyexcel_odsimportget_data>>>data=get_data("your_file.ods")>>>importjson>>>print(json.dumps(data)){"Sheet 1":[[1,2,3],[4,5,6]],"Sheet 2":[["row 1","row 2","row 3"]]}Write an ods to memoryHere’s the sample code to write a dictionary to an ods file:>>>frompyexcel_odsimportsave_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 downloadingRead from an ods from memoryContinue 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 featureSpecial 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 installpyexcel-odsrand 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 pluginNo 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 fileHere is the sample code:>>>importpyexcelaspe>>>sheet=pe.get_book(file_name="your_file.ods")>>>sheetSheet1:+---+---+---+|1|2|3|+---+---+---+|4|5|6|+---+---+---+Sheet2:+-------+-------+-------+|row1|row2|row3|+-------+-------+-------+Writing to an ods fileHere is the sample code:>>>sheet.save_as("another_file.ods")Reading from a IO instanceYou 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">>>withopen(odsfile,"rb")asf:...content=f.read()...r=pe.get_book(file_type="ods",file_content=content)...print(r)...Sheet1:+---+---+---+|1|2|3|+---+---+---+|4|5|6|+---+---+---+Sheet2:+-------+-------+-------+|row1|row2|row3|+-------+-------+-------+Writing to a StringIO instanceYou 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 downloadingLicenseNew BSD LicenseDeveloper guideDevelopment steps for code changesgit clonehttps://github.com/pyexcel/pyexcel-ods.gitcd pyexcel-odsUpgrade your setup tools and pip. They are needed for development and testing only:pip install –upgrade setuptools pipThen install relevant development requirements:pip install -r rnd_requirements.txt # if such a file existspip install -r requirements.txtpip install -r tests/requirements.txtOnce you have finished your changes, please provide test case(s), relevant documentation
and update CHANGELOG.rst.NoteAs 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 contributionAlthoughnoseanddoctestare both used in code testing, it is adviable that unit tests are put in tests.doctestis 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:$ makeOn Windows systems, please issue this command:> test.batBefore you commitPlease run:$ make formatso as to beautify your code otherwise travis-ci may fail your unit test.CreditsODSReader is originally written byMarco ContiChange log0.6.0 - 9.10.2020addednew style reader and writer plugins. works with pyexcel-io v0.6.20.5.6 - 19.03.2019added#32, fix odfpy pinning#33, fix
IntegerAccuracyLossError on i5860.5.5 - 16.03.2019added#32, fix odfpy pinning0.5.4 - 27.11.2018added#30, 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.3 - unreleasedadded#24, ignore
comments(<office:comment>) in cell#27, exception raised
when currency type is missingfix odfpy version on 1.3.5.0.5.2 - 23.10.2017updatedpyexcelpyexcel#105,
remove gease from setup_requires, introduced by 0.5.1.remove python2.6 test support0.5.1 - 20.10.2017addedpyexcel#103, include
LICENSE file in MANIFEST.in, meaning LICENSE file will appear in the released
tar ball.0.5.0 - 30.08.2017Updatedput dependency on pyexcel-io 0.5.0, which uses cStringIO instead of StringIO.
Hence, there will be performance boost in handling files in memory.RelocatedAll ods type conversion code lives in pyexcel_io.service module0.4.1 - 25.08.2017Updatedpyexcel#23, handle
unseekable stream given by http responsePR#22, hanle white
spaces in a cell.0.4.0 - 19.06.2017Updatedpyexcel#14, close file
handlepyexcel-io plugin interface now updated to uselml.0.3.3 - 07.05.2017Updatedissuepyexcel#19, not all
texts in a multi-node cell were extracted.0.3.2 - 13.04.2017Updatedissuepyexcel#17, empty new
line is ignoredissuepyexcel#6,
PT288H00M00S is valid duration0.3.1 - 02.02.2017AddedRecognize currency type0.3.0 - 22.12.2016UpdatedCode refactoring with pyexcel-io v 0.3.00.2.2 - 24.10.2016Updatedissuepyexcel#14, index
error when reading a ods file that has non-uniform columns repeated property.0.2.1 - 31.08.2016Addedsupport pagination. two pairs: start_row, row_limit and start_column,
column_limit help you deal with large files.use odfpy 1.3.3 as compulsory package. offically support python 30.2.0 - 01.06.2016AddedBy default,floatwill be converted tointwhere fits.auto_detect_int,
a flag to switch off the autoatic conversion fromfloattoint.‘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.Updatedsupport the auto-import feature of pyexcel-io 0.2.00.1.1 - 30.01.2016Added‘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.uses yield in to_array and returns a generatorsupport multi-line text cell #5feature migration from pyexcel-ods3 pyexcel/pyexcel-ods3#5Updatedcompatibility with pyexcel-io 0.1.10.0.12 - 10.10.2015UpdatedBug fix: excessive trailing columns with empty values0.0.11 - 26.09.2015UpdatedComplete fix for libreoffice datetime field0.0.10 - 15.09.2015UpdatedBug fix: date field could have datetime from libreoffice0.0.9 - 21.08.2015UpdatedBug fix: utf-8 string throw unicode exceptions0.0.8 - 28.06.2015UpdatedPin dependency odfpy 0.9.6 to avoid buggy odfpy 1.3.00.0.7 - 28.05.2015UpdatedBug fix: “number-columns-repeated” is now respected0.0.6 - 21.05.2015Updatedget_data and save_data are seen across pyexcel-* extensions. remember them
once and use them across all extensions.0.0.5 - 22.02.2015AddedLoads only one sheet from a multiple sheet bookUse New BSD License0.0.4 - 14.12.2014UpdatedIO interface update as pyexcel-io introduced keywords.initial release0.0.3 - 08.12.2014UpdatedIO interface update as pyexcel-io introduced keywords.initial release