Python Module for Tabular Datasets in XLS, CSV, JSON, YAML, &c.

Overview

Tablib: format-agnostic tabular dataset library

Jazzband PyPI version Supported Python versions PyPI downloads GitHub Actions status codecov GitHub

_____         ______  ___________ ______
__  /_______ ____  /_ ___  /___(_)___  /_
_  __/_  __ `/__  __ \__  / __  / __  __ \
/ /_  / /_/ / _  /_/ /_  /  _  /  _  /_/ /
\__/  \__,_/  /_.___/ /_/   /_/   /_.___/

Tablib is a format-agnostic tabular dataset library, written in Python.

Output formats supported:

  • Excel (Sets + Books)
  • JSON (Sets + Books)
  • YAML (Sets + Books)
  • Pandas DataFrames (Sets)
  • HTML (Sets)
  • Jira (Sets)
  • TSV (Sets)
  • ODS (Sets)
  • CSV (Sets)
  • DBF (Sets)

Note that tablib purposefully excludes XML support. It always will. (Note: This is a joke. Pull requests are welcome.)

Tablib documentation is graciously hosted on https://tablib.readthedocs.io

It is also available in the docs directory of the source distribution.

Make sure to check out Tablib on PyPI!

Contribute

Please see the contributing guide.

Comments
  • Need for 2nd maintainer

    Need for 2nd maintainer

    As @hugovk mentioned in PR #310, we have a maintainer issue with tablib (similarly with records).

    Facts:

    • @kennethreitz is Development Lead (592 commits)
    • @iurisilvio is Core Contributor (14 commits)
    • There are 20 authors mentioned in AUTHORS.
      • @lbeltrame and @durden 13 commits
      • @f4nt, @claudep and @msabramo 5 commits or more
      • 10 other with 3 commits
      • 6 others with 2 commits
      • 47 other with 1 commit
    • Issues: 107 closed, 68 open
      • last 25 open issues are younger than 12 months
    • PR 135 closed, 18 open
      • 16 open PRs are younger than 12 months
      • good number of those PRs seem to fix open issues
      • last PR accepted is around 7 month old
    • downloads/pip installs
      • 48 thousands in last 30 days (see table in PR #310)
    • last version is 0.12.1 released on Sep 1, 2017

    To summarize:

    • There is clear interest on tablib from users as well as from contributors.
    • Maintenance got somehow stuck since September last year.

    Proposal for next actions:

    • @kennethreitz , @iurisilvio are you willing to accept another maintainer or even hand over to someone?
    • others: is there anyone feeling like becoming maintainer?
    opened by vlcinsky 41
  • Implement Jazzband guidelines for tablib

    Implement Jazzband guidelines for tablib

    This issue tracks the implementation of the Jazzband guidelines for the project tablib

    It was initiated by @vinayak-mehta who was automatically assigned in addition to the Jazzband roadies.

    See the TODO list below for the generally required tasks, but feel free to update it in case the project requires it.

    Feel free to ping a Jazzband roadie if you have any question.

    TODOs

    • [x] Fix all links in the docs (and README file etc) from old to new repo
    • [x] Add the Jazzband badge to the README file
    • [x] Add the Jazzband contributing guideline to the CONTRIBUTING.md or CONTRIBUTING.rst file
    • [x] Check if continuous testing works (e.g. Travis-CI, CircleCI, AppVeyor, etc)
    • [x] Check if test coverage services work (e.g. Coveralls, Codecov, etc)
    • [x] Add jazzband account to PyPI project as maintainer role (e.g. URL: https://pypi.org/manage/project/tablib/collaboration/)
    • [x] Add jazzband-bot as maintainer to the Read the Docs project (e.g. URL: https://readthedocs.org/dashboard/tablib/users/)
    • [x] Add incoming GitHub webhook integration to Read the Docs project (e.g. URL: https://readthedocs.org/dashboard/tablib/integrations/)
    • [x] Fix project URL in GitHub project description
    • [x] Review project if other services are used and port them to Jazzband
    • [x] Decide who is project lead for the project (if at all)
    • [x] Set up CI for Jazzband project releases if needed and open ticket if yes
    • [x] Remove the call for financial help that is currently included in the README
    • [x] Figure out what to do with the develop branch that has some changes but is outdated. @claudep @hugovk

    Project details

    Description Python Module for Tabular Datasets in XLS, CSV, JSON, YAML, &c.
    Homepage python-tablib.org
    Stargazers 3544
    Open issues 84
    Forks 533
    Default branch master
    Is a fork False
    Has Wiki True
    Has Pages False
    opened by jazzband-bot 24
  • Import ascii characters not valid.

    Import ascii characters not valid.

    I tried to add data to the tablib Dataset. I use django import export to do so. Everything goes well with the data until it is in the dataset. Once it is added and I try to read the data I get the following error.

    UnicodeEncodeError encountred while trying to read file: 'ascii' codec can't encode character u'\xc6' in position 241: ordinal not in range(128)
    

    It is about the text Ævar. This name will fail when you try to read the data from the Dataset.

    bug 
    opened by JostCrow 18
  • Origin and licenses issues

    Origin and licenses issues

    While tablib is MIT-licensed, there are several potential provenance and license issues with Oo, XLS and XLSX formats that tablib embeds. I have collected some of these potential issues here. This is at best ... byzantine.

    It feels a tad overwhelming: I am just raising the issue and I would like to help to fix this.

    There are some things to consider with regards to implementations of Excel formats read and write (in xlrt, xlwt and openpyxl) as there may be issues with components that support XLS or XLSX formats in general.

    See the discussion on these:

    • https://github.com/python-excel/xlrd/issues/32
    • https://github.com/Niggler/js-xls/issues/1
    • https://github.com/stephen-hardy/xlsx.js/issues/8
    • https://github.com/stephen-hardy/xlsx.js/blob/master/LICENSE.txt

    See also Apache guidelines for POI: http://poi.apache.org/guidelines.html

    openpxyl

    https://bitbucket.org/ericgazoni/openpyxl/ is reported as being derived from PHPExcel which is LGPL-licensed at https://github.com/PHPOffice/PHPExcel but openpyxl is not LGPL but MIT-licensed. If this is really derived then there is a possible issue as the license may be that of the original not of the derivative. It also contains code from other origins such as http://lethain.com/entry/2009/jan/22/handling-very-large-csv-and-xml-files-in-python/ PHPExcel in turns claims to contain code from these origins:

    • PEAR::SpreadsheetExcelWriter (http://pear.php.net/package/Spreadsheet_Excel_Writer also LGPL
    • JavaScript Excel Formula Parser (http://ewbi.blogs.com/develops/2007/03/excel_formula_p.html )
    • PHP-ExcelReader (http://sourceforge.net/projects/phpexcelreader itself also based on http://www.andykhan.com/excelread/ or jexcelapi see below )
    • FPDF (http://www.fpdf.org/) (probably not relevant here)
    • TCPDF (http://www.tcpdf.org/) (probably not relevant here)
    • PHP port of polyfit (http://www.phpmath.com/home?op=cat&cid=17) (probably not relevant here)
    • PHP port of JAMA matrix library (http://www.phpmath.com/build03/JAMA/docs/) (probably not relevant here)

    XLRD

    Uses a combo of a BSD license and a BSD original license. XLRD itself is based on a BSD-original-licensed component written in C called xlreader at http://www.giffin.org/xlreader.php released circa fall 2001. This is turn is based on a LGPL 2.0-licensed component at http://www.andykhan.com/excelread/ released circa fall 2001 at http://web.archive.org/web/20011117133717/http://www.andykhan.com/excelread/ . ExcelRead later became jExcelAPI http://jexcelapi.sourceforge.net/, still LGPL-licensed.

    The xlrd license history is confusing at best, because if the C xlreader is really a derivative of the Java LGPL-licensed excelread, then its BSD original license might be moot, as the license may be that of the original not of the derivative. If this was just used for ideas, then only the BSD original license issue may stand (with its extensive advertising clause being an issue and making it not GPL-compatible among other things and a pain with MIT or Apache-licensed code).

    XLWT

    Uses a combo of bsd-modified and bsd-original-license at https://github.com/python-excel/xlwt/blob/master/licences.py . It started as a fork of PyExcelerator by Roman V. Kiseliov that was also BSD-original at http://sourceforge.net/projects/pyexcelerator/ . Pyexcelerator in turn has this notice: http://ftp-master.metadata.debian.org/changelogs//main/p/pyexcelerator/pyexcelerator_0.6.4.1-1_copyright . And per https://github.com/python-excel/xlwt/commit/be268c8a01f1738c39aa3486802972ae6c7f34d1 and https://github.com/python-excel/xlwt/blob/master/licences.py ... this is a partial port of pyXLWriter http://pyxlwriter.sourceforge.net/ LGPL-2.0-licensed, but itself claiming to be a port of a Perl module by John McNamara (Perl Spreadsheet::WriteExcel which was Perl-licensed.)

    The combo of BSD, BSD original, Perl and LGPL may not mesh well. The Perl issue may have been addressed here: https://launchpad.net/ubuntu/raring/+source/xlwt/+copyright

    Other components:

    • ODF/OpenOffice : this is LGPL-licensed. The license text is missing.
    • omnijson : has code derived from simplejson and notice/license text is missing; it also includes ordereddict from Raymond Hettinger.
    • unicodecsv (v0.8.0) from https://pypi.python.org/pypi/unicodecsv/ https://github.com/jdunck/python-unicodecsv is BSD-licensed and the notice is missing
    • PyYAML : '3.09' from http://pyyaml.org/download/pyyaml/PyYAML-3.09.tar.gz is MIT licensed and the notice/license is missing
    • markup is from http://markup.sourceforge.net/ is Public Domain

    See also: http://ftp-master.metadata.debian.org/changelogs//main/p/python-tablib/python-tablib_0.9.11-1_copyright

    opened by pombredanne 18
  • xls and xlsx import support

    xls and xlsx import support

    Added import_set to formats/_xls.py using xlrd Added import_set and import_book to formats/_xlsx.py using openpyxl Also added a sheets() method to Databook, without that I couldn't find a way to access the sheets in a book.

    opened by djv 16
  • Removed the vendorized packages

    Removed the vendorized packages

    I've removed the vendorized versions of xlwt, xlrd, openpyxl, ominjson, unicodecsv, and pyyaml and replaced them by installing them in setup.py.

    If there's a reason this hasn't been done already, I'd love to know and see if there's anything we can do to update the vendorized versions to newer releases.

    Edit: Ok, I now see it fails on python 3.2. Not sure how important that is, but if that's why this hasn't been done this can be closed I guess.

    idea 
    opened by tommyanthony 13
  • Support python3

    Support python3

    Trying to install tablib on python 3 fails:

    Alexanders-MacBook-Pro:openstack-quantumclient alex_gaynor$ mktmpenv -p `which python3.3`
    Running virtualenv with interpreter /usr/local/bin/python3.3
    Using base prefix '/usr/local/Cellar/python3/3.3.2/Frameworks/Python.framework/Versions/3.3'
    New python executable in fa1de240e7969a2b/bin/python3.3
    Also creating executable in fa1de240e7969a2b/bin/python
    Installing Setuptools..............................................................................................................................................................................................................................done.
    Installing Pip.....................................................................................................................................................................................................................................................................................................................................done.
    Downloading/unpacking wheel
      Using download cache from /Users/alex_gaynor/.pip/cache/https%3A%2F%2Fpypi.python.org%2Fpackages%2F2.7%2Fw%2Fwheel%2Fwheel-0.21.0-py2.py3-none-any.whl
    Installing collected packages: wheel
    Successfully installed wheel
    Cleaning up...
    This is a temporary environment. It will be deleted when you run 'deactivate'.
    (fa1de240e7969a2b)Alexanders-MacBook-Pro:fa1de240e7969a2b alex_gaynor$ pip install tablib
    Downloading/unpacking tablib
      Using download cache from /Users/alex_gaynor/.pip/cache/https%3A%2F%2Fpypi.python.org%2Fpackages%2Fsource%2Ft%2Ftablib%2Ftablib-0.9.11.tar.gz
      Running setup.py egg_info for package tablib
        Traceback (most recent call last):
          File "<string>", line 16, in <module>
          File "/Users/alex_gaynor/.virtualenvs/fa1de240e7969a2b/build/tablib/setup.py", line 7, in <module>
            import tablib
          File "./tablib/__init__.py", line 3, in <module>
            from tablib.core import (
          File "./tablib/core.py", line 15, in <module>
            from tablib import formats
          File "./tablib/formats/__init__.py", line 6, in <module>
            from . import _csv as csv
          File "./tablib/formats/_csv.py", line 6, in <module>
            from tablib.compat import is_py3, csv, StringIO
          File "./tablib/compat.py", line 25, in <module>
            import tablib.packages.xlwt3 as xlwt
          File "./tablib/packages/xlwt3/__init__.py", line 5, in <module>
            from .Row import Row
          File "./tablib/packages/xlwt3/Row.py", line 7, in <module>
            from . import ExcelFormula
          File "./tablib/packages/xlwt3/ExcelFormula.py", line 6, in <module>
            class Formula(object):
        ValueError: '__init__' in __slots__ conflicts with class variable
        Complete output from command python setup.py egg_info:
        Traceback (most recent call last):
    
      File "<string>", line 16, in <module>
    
      File "/Users/alex_gaynor/.virtualenvs/fa1de240e7969a2b/build/tablib/setup.py", line 7, in <module>
    
        import tablib
    
      File "./tablib/__init__.py", line 3, in <module>
    
        from tablib.core import (
    
      File "./tablib/core.py", line 15, in <module>
    
        from tablib import formats
    
      File "./tablib/formats/__init__.py", line 6, in <module>
    
        from . import _csv as csv
    
      File "./tablib/formats/_csv.py", line 6, in <module>
    
        from tablib.compat import is_py3, csv, StringIO
    
      File "./tablib/compat.py", line 25, in <module>
    
        import tablib.packages.xlwt3 as xlwt
    
      File "./tablib/packages/xlwt3/__init__.py", line 5, in <module>
    
        from .Row import Row
    
      File "./tablib/packages/xlwt3/Row.py", line 7, in <module>
    
        from . import ExcelFormula
    
      File "./tablib/packages/xlwt3/ExcelFormula.py", line 6, in <module>
    
        class Formula(object):
    
    ValueError: '__init__' in __slots__ conflicts with class variable
    
    ----------------------------------------
    Cleaning up...
    Command python setup.py egg_info failed with error code 1 in /Users/alex_gaynor/.virtualenvs/fa1de240e7969a2b/build/tablib
    Storing complete log in /Users/alex_gaynor/.pip/pip.log
    
    opened by alex 13
  • preserve leading zero's on xlsx output

    preserve leading zero's on xlsx output

    Trying to determine the best way to handle this. Tablib is keeping them correctly. However, openpyxl needs an alternate syntax if you want to assign a literal.

    An example is if I have a column of zip codes or social security numbers that I do not want to be interpreted as numeric.

    opened by slestak 13
  • Update documentation, elucidate the use of filters (and, or).

    Update documentation, elucidate the use of filters (and, or).

    Hi,

    Concerning the issue #251 that I closed some minutes ago, I update the docs to clarify the usage of filters to generate filters type (or, and).

    Regards,

    opened by xdanielsb 12
  • Add support for Python 3.7 and drop 3.4

    Add support for Python 3.7 and drop 3.4

    Some dependencies need updating to support Python 3.7, including pandas.

    There's no release of pandas which supports both 3.4 and 3.7.

    So let's drop 3.4, it's very nearly EOL, on 2019-03-16.

    https://en.wikipedia.org/wiki/CPython#Version_history

    needs BDFL approval 
    opened by hugovk 11
  • Framework for adding input/output formats

    Framework for adding input/output formats

    Right now, the list of formats is more or less hardcoded into the formats.available tuple, and it's not straightforward to extend (at least not to me).

    It would be great if you could subclass an abstract Formatter class, and then either have it magically register (using some kind of metaclass magic, I suppose) with the available formats list or introduce a function and/or class decorator to explicitly register the new format.

    Is that something you'd be interested in working on in the near term? I'd be happy to contribute some of my own time for it.

    opened by gwerbin 11
  • KeyError reading yaml file

    KeyError reading yaml file

    yaml file:

    mylist:
      - 1
      - 2
      - 3
    
    with open("config/aa.yaml","rb")as f:
         data.load(f,'yaml')
    
    ---------------------------------------------------------------------------
    KeyError                                  Traceback (most recent call last)
    Input In [21], in <module>
          1 with open("config/aa.yaml","rb")as f:
    ----> 2      data.load(f,'yaml')
    
    File ~/anaconda3/envs/py3/lib/python3.9/site-packages/tablib/core.py:414, in Dataset.load(self, in_stream, format, **kwargs)
        411 if not import_set:
        412     raise UnsupportedFormat(f'Format {format} cannot be imported.')
    --> 414 fmt.import_set(self, stream, **kwargs)
        415 return self
    
    File ~/anaconda3/envs/py3/lib/python3.9/site-packages/tablib/formats/_yaml.py:32, in YAMLFormat.import_set(cls, dset, in_stream)
         29 """Returns dataset from YAML stream."""
         31 dset.wipe()
    ---> 32 dset.dict = yaml.safe_load(in_stream)
    
    File ~/anaconda3/envs/py3/lib/python3.9/site-packages/tablib/core.py:341, in Dataset._set_dict(self, pickle)
        338     return
        340 # if list of rows
    --> 341 if isinstance(pickle[0], list):
        342     self.wipe()
        343     for row in pickle:
    
    KeyError: 0
    
    documentation 
    opened by roderick-liu 3
  • Databook unable to load xls

    Databook unable to load xls

    I'm trying to load an xls file however it fails with the following error

    with open("xls_file", "rb") as fh: 
        imported_data = Databook().load(fh, "xls")
    
    Traceback (most recent call last):
      File ".\test.py", line 5, in <module>
        imported_data = Databook().load(fh, "xls")
      File "lib\site-packages\tablib\core.py", line 872, in load
        fmt.import_book(self, stream, **kwargs)
      File "lib\site-packages\tablib\formats\_xls.py", line 103, in import_book
        xls_book = xlrd.open_workbook(file_contents=in_stream)
      File "lib\site-packages\xlrd\__init__.py", line 166, in open_workbook
        file_format = inspect_format(filename, file_contents)
      File "lib\site-packages\xlrd\__init__.py", line 57, in inspect_format
        peek = content[:PEEK_SIZE]
    TypeError: '_io.BufferedReader' object is not subscriptable
    
    opened by wanmi59 1
  • feat: support column_width in xlsx format

    feat: support column_width in xlsx format

    This PR allows user to specify column width in XLXS format. For it has a default value, which is not suitable for long values in dataset. As a result, it is not convenient to look these tables. Also, it eliminates questions like #318 in future

    I didn't find tests for exporting, so omitted this. Let me know if they are required

    opened by Birdi7 5
  • Suggestion: Option to normalize treatment of missing values

    Suggestion: Option to normalize treatment of missing values

    A Dataset from an Excel file will store None for any empty cell. In CSV the convention is to not distinguish between ,, and ,"", and treat all empty cells as empty strings. It would be nice to add a feature like that in pandas.read_csv() where ,, is treated as NaN, but None here for symmetry with Excel. I know that toggling the na_filter argument in read_csv() is one way to govern this in pandas.

    Anyways, thanks for the useful tool.

    opened by rosensama 0
  • Different file formats require user to know if file should be opened binary or not

    Different file formats require user to know if file should be opened binary or not

    From the docs, I think this is working as designed, but wanted to check. There's a decent chance I'm doing something wrong.

    File auto-detection becomes less useful to library consumer like me if I have to check the type of file I'm using and take different branches for it. It's still great to get a normalized representation of various formats . . . thanks for that.

    If you open an Excel file (.xlsx) with just mode r, you get an error zipfile.BadZipFile: File is not a zip file. Doesn't matter if I specify the format in the second parameter to load() when calling open() myself. You must specify mode rb.

    This in on Ubuntu 20.04, python3.9, openpyxl 3.0.9

    # zipfile.BadZipFile: File is not a zip file
    with open("mySheet.xlsx", "r") as fh:
        data.load(fh)
    
    # OK
    with open("mySheet.xlsx", "rb") as fh:
        data.load(fh)
    

    If you pass the file path, it cannot determine the file type. If you specify the type, it doesn't open binary.

    # zipfile.BadZipFile: File is not a zip file
    data.load("mySheet.xlsx", "xlsx")
    
    # tablib.exceptions.UnsupportedFormat: Tablib has no format 'None' or it is not registered.
    data.load("mySheet.xlsx")
    

    I think the issue in data.load("mySheet.xlsx", "xlsx") is because core.normalize_input() converts the path given as a str to a StringIO. And when openpyxl passes it to zipfile, zipfile would call open() with mode rb if it was still a string. I'm not sure zipfile is ready for StringIO at all. It hits this code block which doesn't seem to expect a StringIO: https://github.com/python/cpython/blob/main/Lib/zipfile.py#L1273

    Now if I shift to CSV, I can't use mode rb. It does give instructions in the exception if you give it the file type hint. And it does get it right if you leave the call to open() to tablib and give it the format hint.

    # tablib.exceptions.UnsupportedFormat: Tablib has no format 'None' or it is not registered.
    with open("myCsv.csv", "rb") as fh:
        data.load(fh)
    
    # _csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)
    with open("myCsv.csv", "rb") as fh:
        data.load(fh, "csv")
    
    # tablib.exceptions.UnsupportedFormat: Tablib has no format 'None' or it is not registered.
    data.load("myCsv.csv")
    
    # OK
    data.load("myCsv.csv", "csv")
    
    opened by rosensama 1
  • Initialize a Dataset from plain python dicts

    Initialize a Dataset from plain python dicts

    I'd like to be able to create a Dataset from plain python dicts. I read through just about everything in the docs and some of the code, and can't seem to find a way to do this directly.

    What I'd like to be able to do is something like:

    source_data = [
         {'column_1': 'value_1A',  'column_2':  'value_2A'},
         {'column_1': 'value_1B',  'column_2':  'value_2B'},
    ]
    data = Dataset().load(*source_data)
    

    Or maybe:

    data = import_set(source_data, format='dict')
    

    Current workarounds:

    • json.dumps the data first before loading
    • Register a custom format class
    • Separately add headers and row values:
      data = DataSet()
      data.headers = source_data[0].keys()
      data.extend([item.values() for item in source_data])
      

    So I guess my questions are:

    • Is there currently a better way to do this?
    • If not, would you be interested in a PR for this?
    opened by JWCook 3
Releases(v3.3.0)
  • v3.3.0(Dec 10, 2022)

    What's Changed

    • Add support for Python 3.11 by @hugovk in https://github.com/jazzband/tablib/pull/525
    • Export integers/floats as numbers in ODS format by @claudep in https://github.com/jazzband/tablib/pull/528
    • Upgrade unit tests by @hugovk in https://github.com/jazzband/tablib/pull/520
    • History for 3.3.0 by @hugovk in https://github.com/jazzband/tablib/pull/529

    Full Changelog: https://github.com/jazzband/tablib/compare/v3.2.1...v3.3.0

    Source code(tar.gz)
    Source code(zip)
  • v3.2.1(Apr 9, 2022)

    What's Changed

    • Add newline to StringIO by @matthewhegarty in https://github.com/jazzband/tablib/pull/518
    • CI: Add workflow_dispatch to add a UI button for triggering builds by @hugovk in https://github.com/jazzband/tablib/pull/519
    • History for 3.2.1 by @hugovk in https://github.com/jazzband/tablib/pull/521

    New Contributors

    • @matthewhegarty made their first contribution in https://github.com/jazzband/tablib/pull/518

    Full Changelog: https://github.com/jazzband/tablib/compare/v3.2.0...v3.2.1

    Source code(tar.gz)
    Source code(zip)
  • v3.2.0(Jan 27, 2022)

    What's Changed

    • Test Python 3.10 on all operating systems by @hugovk in https://github.com/jazzband/tablib/pull/508
    • Upgrade Sphinx used by Read the Docs by @hugovk in https://github.com/jazzband/tablib/pull/509
    • Correct order of arguments to a regex call in safe_xlsx_sheet_title by @marisn in https://github.com/jazzband/tablib/pull/510
    • Drop support for EOL Python 3.6 by @hugovk in https://github.com/jazzband/tablib/pull/513
    • History for 3.2.0 by @hugovk in https://github.com/jazzband/tablib/pull/514

    New Contributors

    • @marisn made their first contribution in https://github.com/jazzband/tablib/pull/510

    Full Changelog: https://github.com/jazzband/tablib/compare/v3.1.0...v3.2.0

    Source code(tar.gz)
    Source code(zip)
  • v3.1.0(Oct 26, 2021)

    What's Changed

    • Update release checklist by @hugovk in https://github.com/jazzband/tablib/pull/486
    • Better exceptions by @nuno-andre in https://github.com/jazzband/tablib/pull/487
    • Fix "Invalid character / found in sheet title" during export to XLSX by @mpasternak in https://github.com/jazzband/tablib/pull/490
    • Avoided mutable parameter defaults by @claudep in https://github.com/jazzband/tablib/pull/494
    • Fixes #496 - Allow skipping lines when reading xls/xlsx/csv files by @claudep in https://github.com/jazzband/tablib/pull/497
    • Specify build backend for editable installs by @hugovk in https://github.com/jazzband/tablib/pull/501
    • Add support for Python 3.10 by @hugovk in https://github.com/jazzband/tablib/pull/504
    • doubled sample size passed to csv.Sniffer() in _csv.detect() by @julianebeli in https://github.com/jazzband/tablib/pull/503
    • [pre-commit.ci] pre-commit autoupdate by @pre-commit-ci in https://github.com/jazzband/tablib/pull/500
    • Jazzband: Synced file(s) with jazzband/.github by @jazzband-bot in https://github.com/jazzband/tablib/pull/505
    • History for 3.1.0 by @hugovk in https://github.com/jazzband/tablib/pull/507

    New Contributors

    • @nuno-andre made their first contribution in https://github.com/jazzband/tablib/pull/487
    • @mpasternak made their first contribution in https://github.com/jazzband/tablib/pull/490
    • @julianebeli made their first contribution in https://github.com/jazzband/tablib/pull/503
    • @pre-commit-ci made their first contribution in https://github.com/jazzband/tablib/pull/500
    • @jazzband-bot made their first contribution in https://github.com/jazzband/tablib/pull/505

    Full Changelog: https://github.com/jazzband/tablib/compare/v3.0.0...v3.1.0

    Source code(tar.gz)
    Source code(zip)
  • v0.14.0(Oct 19, 2019)

A Python module for creating Excel XLSX files.

XlsxWriter XlsxWriter is a Python module for writing files in the Excel 2007+ XLSX file format. XlsxWriter can be used to write text, numbers, formula

John McNamara 3.1k Dec 29, 2022
Single API for reading, manipulating and writing data in csv, ods, xls, xlsx and xlsm files

pyexcel - Let you focus on data, instead of file formats Support the project If your company has embedded pyexcel and its components into a revenue ge

1.1k Dec 29, 2022
Upload an Excel/CSV file ( < 200 MB) and produce a short summary of the data.

Data-Analysis-Report Deployed App 1. What is this app? Upload an excel/csv file and produce a summary report of the data. 2. Where to upload? How to p

Easwaran T H 0 Feb 26, 2022
ExcelPeek is a tool designed to help investigate potentially malicious Microsoft Excel files.

ExcelPeek is a tool designed to help investigate potentially malicious Microsoft Excel files.

James Slaughter 37 Apr 16, 2022
Use a docx as a jinja2 template

python-docx-template Use a docx as a jinja2 template Introduction This package uses 2 major packages : python-docx for reading, writing and creating s

Eric Lapouyade 1.4k Dec 28, 2022
xlwings is a BSD-licensed Python library that makes it easy to call Python from Excel and vice versa. It works with Microsoft Excel on Windows and macOS. Sign up for the newsletter or follow us on twitter via

xlwings - Make Excel fly with Python! xlwings CE xlwings CE is a BSD-licensed Python library that makes it easy to call Python from Excel and vice ver

xlwings 2.5k Jan 06, 2023
Reads Data from given Excel File and exports Single PDFs and a complete PDF grouped by Gateway

E-Shelter Excel2QR Reads Data from given Excel File and exports Single PDFs and a complete PDF grouped by Gateway Features Reads Excel 2021 Export Sin

Stefan Knaak 1 Nov 13, 2021
According to the received excel file (.xlsx,.xlsm,.xltx,.xltm), it converts to word format with a given table structure and formatting

According to the received excel file (.xlsx,.xlsm,.xltx,.xltm), it converts to word format with a given table structure and formatting

Diakonov Andrey 2 Feb 18, 2022
Please use openpyxl where you can...

xlrd xlrd is a library for reading data and formatting information from Excel files in the historical .xls format. Warning This library will no longer

2k Dec 29, 2022
PowerShell module to import/export Excel spreadsheets, without Excel

PowerShell + Excel = Better Together Automate Excel via PowerShell without having Excel installed. Runs on Windows, Linux and MAC. Creating Tables, Pi

Doug Finke 2k Dec 30, 2022
Create Open XML PowerPoint documents in Python

python-pptx is a Python library for creating and updating PowerPoint (.pptx) files. A typical use would be generating a customized PowerPoint presenta

Steve Canny 1.7k Jan 05, 2023
A suite of utilities for converting to and working with CSV, the king of tabular file formats.

csvkit is a suite of command-line tools for converting to and working with CSV, the king of tabular file formats. It is inspired by pdftk, GDAL and th

wireservice 5.2k Dec 31, 2022
ObjTables: Tools for creating and reusing high-quality spreadsheets

ObjTables: Tools for creating and reusing high-quality spreadsheets ObjTables is a toolkit which makes it easy to use spreadsheets (e.g., XLSX workboo

Karr whole-cell modeling lab 7 Jun 14, 2021
BoobSnail allows generating Excel 4.0 XLM macro.

BoobSnail allows generating Excel 4.0 XLM macro. Its purpose is to support the RedTeam and BlueTeam in XLM macro generation.

STM Cyber 232 Nov 21, 2022
Universal Office Converter - Convert between any document format supported by LibreOffice/OpenOffice.

Automated conversion and styling using LibreOffice Universal Office Converter (unoconv) is a command line tool to convert any document format that Lib

2.4k Jan 03, 2023
Transpiler for Excel formula like language to Python. Support script and module mode

Transpiler for Excel formula like language to Python. Support script and module mode (formulas are functions).

Edward Villegas-Pulgarin 1 Dec 07, 2021
Xiaobo Zhang 30 Jan 08, 2023
Python Module for Tabular Datasets in XLS, CSV, JSON, YAML, &c.

Tablib: format-agnostic tabular dataset library _____ ______ ___________ ______ __ /_______ ____ /_ ___ /___(_)___ /_ _ __/_ __ `/__ _

Jazzband 4.2k Dec 30, 2022
Excel-report-evaluator - A simple Python GUI application to aid with bulk evaluation of Microsoft Excel reports.

Excel Report Evaluator Simple Python GUI with Tkinter for evaluating Microsoft Excel reports (.xlsx-Files). Usage Start main.py and choose one of the

Alexander H. 1 Dec 29, 2021
A set of Python scripts for finding threats in Office365

Py365 A collection of scripts for finding threats in Office365 Risky Rules A tool for finding risky or suspicious inbox rules - more detail in this po

Martin Rothe 49 May 18, 2022