{"id":13469367,"url":"https://github.com/pyexcel/pyexcel","last_synced_at":"2025-05-13T17:08:17.763Z","repository":{"id":19958315,"uuid":"23225199","full_name":"pyexcel/pyexcel","owner":"pyexcel","description":"Single API for reading, manipulating and writing data in csv, ods, xls, xlsx and xlsm files","archived":false,"fork":false,"pushed_at":"2025-04-22T22:33:27.000Z","size":4132,"stargazers_count":1239,"open_issues_count":13,"forks_count":164,"subscribers_count":43,"default_branch":"dev","last_synced_at":"2025-04-24T01:53:24.315Z","etag":null,"topics":["csv","excel","fods","ods","python","xls","xlsm","xlsx"],"latest_commit_sha":null,"homepage":"http://docs.pyexcel.org","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pyexcel.png","metadata":{"files":{"readme":"README.rst","changelog":"CHANGELOG.rst","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":"chfw","patreon":"chfw"}},"created_at":"2014-08-22T12:52:20.000Z","updated_at":"2025-04-23T11:45:58.000Z","dependencies_parsed_at":"2023-01-13T20:41:48.909Z","dependency_job_id":"896af195-e611-4119-a84d-913a1c4497d5","html_url":"https://github.com/pyexcel/pyexcel","commit_stats":{"total_commits":1856,"total_committers":24,"mean_commits":77.33333333333333,"dds":0.0625,"last_synced_commit":"b8113006a407a923bc8c00d1b2057aa86c5f0cff"},"previous_names":[],"tags_count":65,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pyexcel%2Fpyexcel","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pyexcel%2Fpyexcel/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pyexcel%2Fpyexcel/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pyexcel%2Fpyexcel/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pyexcel","download_url":"https://codeload.github.com/pyexcel/pyexcel/tar.gz/refs/heads/dev","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253990466,"owners_count":21995774,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["csv","excel","fods","ods","python","xls","xlsm","xlsx"],"created_at":"2024-07-31T15:01:36.007Z","updated_at":"2025-05-13T17:08:12.752Z","avatar_url":"https://github.com/pyexcel.png","language":"Python","readme":"================================================================================\npyexcel - Let you focus on data, instead of file formats\n================================================================================\n\n.. image:: https://raw.githubusercontent.com/pyexcel/pyexcel.github.io/master/images/patreon.png\n   :target: https://www.patreon.com/chfw\n\n.. image:: https://raw.githubusercontent.com/pyexcel/pyexcel-mobans/master/images/awesome-badge.svg\n   :target: https://awesome-python.com/#specific-formats-processing\n\n.. image:: https://codecov.io/gh/pyexcel/pyexcel/branch/master/graph/badge.svg\n   :target: https://codecov.io/gh/pyexcel/pyexcel\n\n.. image:: https://badge.fury.io/py/pyexcel.svg\n   :target: https://pypi.org/project/pyexcel\n\n.. image:: https://anaconda.org/conda-forge/pyexcel/badges/version.svg\n   :target: https://anaconda.org/conda-forge/pyexcel\n\n\n.. image:: https://pepy.tech/badge/pyexcel/month\n   :target: https://pepy.tech/project/pyexcel\n\n.. image:: https://anaconda.org/conda-forge/pyexcel/badges/downloads.svg\n   :target: https://anaconda.org/conda-forge/pyexcel\n\n.. image:: https://img.shields.io/gitter/room/gitterHQ/gitter.svg\n   :target: https://gitter.im/pyexcel/Lobby\n\n.. image:: https://img.shields.io/static/v1?label=continuous%20templating\u0026message=%E6%A8%A1%E7%89%88%E6%9B%B4%E6%96%B0\u0026color=blue\u0026style=flat-square\n    :target: https://moban.readthedocs.io/en/latest/#at-scale-continous-templating-for-open-source-projects\n\n.. image:: https://img.shields.io/static/v1?label=coding%20style\u0026message=black\u0026color=black\u0026style=flat-square\n    :target: https://github.com/psf/black\n.. image:: https://readthedocs.org/projects/pyexcel/badge/?version=latest\n   :target: http://pyexcel.readthedocs.org/en/latest/\n\nSupport the project\n================================================================================\n\nIf your company uses pyexcel and its components in a revenue-generating product,\nplease consider supporting the project on GitHub or\n`Patreon \u003chttps://www.patreon.com/bePatron?u=5537627\u003e`_. Your financial\nsupport will enable me to dedicate more time to coding, improving documentation,\nand creating engaging content.\n\n\nKnown constraints\n==================\n\nFonts, colors and charts are not supported.\n\nNor to read password protected xls, xlsx and ods files.\n\nIntroduction\n================================================================================\n\nFeature Highlights\n===================\n\n.. table:: A list of supported file formats\n\n    ============ =======================================================\n    file format  definition\n    ============ =======================================================\n    csv          comma separated values\n    tsv          tab separated values\n    csvz         a zip file that contains one or many csv files\n    tsvz         a zip file that contains one or many tsv files\n    xls          a spreadsheet file format created by\n                 MS-Excel 97-2003 \n    xlsx         MS-Excel Extensions to the Office Open XML\n                 SpreadsheetML File Format.\n    xlsm         an MS-Excel Macro-Enabled Workbook file\n    ods          open document spreadsheet\n    fods         flat open document spreadsheet\n    json         java script object notation\n    html         html table of the data structure\n    simple       simple presentation\n    rst          rStructured Text presentation of the data\n    mediawiki    media wiki table\n    ============ =======================================================\n\n\n.. image:: https://github.com/pyexcel/pyexcel/raw/dev/docs/source/_static/images/architecture.svg\n\n\n1. One application programming interface(API) to handle multiple data sources:\n\n   * physical file\n   * memory file\n   * SQLAlchemy table\n   * Django Model\n   * Python data structures: dictionary, records and array\n\n2. One API to read and write data in various excel file formats.\n3. For large data sets, data streaming are supported. A genenerator can be returned to you. Checkout iget_records, iget_array, isave_as and isave_book_as.\n\n\n\n\nInstallation\n================================================================================\n\nYou can install pyexcel via pip:\n\n.. code-block:: bash\n\n    $ pip install pyexcel\n\n\nor clone it and install it:\n\n.. code-block:: bash\n\n    $ git clone https://github.com/pyexcel/pyexcel.git\n    $ cd pyexcel\n    $ python setup.py install\n\n\n\nOne liners\n================================================================================\n\nThis section shows you how to get data from your excel files and how to\nexport data to excel files in **one line**\n\nRead from the excel files\n--------------------------------------------------------------------------------\n\nGet a list of dictionaries\n********************************************************************************\n\n\nSuppose you want to process `History of Classical Music \u003chttps://www.naxos.com/education/brief_history.asp\u003e`_:\n\n\nHistory of Classical Music:\n\n===============  =============  ====================================\nName             Period         Representative Composers\nMedieval         c.1150-c.1400  Machaut, Landini\nRenaissance      c.1400-c.1600  Gibbons, Frescobaldi\nBaroque          c.1600-c.1750  JS Bach, Vivaldi\nClassical        c.1750-c.1830  Joseph Haydn, Wolfgan Amadeus Mozart\nEarly Romantic   c.1830-c.1860  Chopin, Mendelssohn, Schumann, Liszt\nLate Romantic    c.1860-c.1920  Wagner,Verdi\nModernist        20th century   Sergei Rachmaninoff,Calude Debussy\n===============  =============  ====================================\n\n\nLet's get a list of dictionary out from the xls file:\n\n.. code-block:: python\n\n   \u003e\u003e\u003e records = p.get_records(file_name=\"your_file.xls\")\n\nAnd let's check what do we have:\n\n.. code-block:: python\n\n   \u003e\u003e\u003e for row in records:\n   ...     print(f\"{row['Representative Composers']} are from {row['Name']} period ({row['Period']})\")\n   Machaut, Landini are from Medieval period (c.1150-c.1400)\n   Gibbons, Frescobaldi are from Renaissance period (c.1400-c.1600)\n   JS Bach, Vivaldi are from Baroque period (c.1600-c.1750)\n   Joseph Haydn, Wolfgan Amadeus Mozart are from Classical period (c.1750-c.1830)\n   Chopin, Mendelssohn, Schumann, Liszt are from Early Romantic period (c.1830-c.1860)\n   Wagner,Verdi are from Late Romantic period (c.1860-c.1920)\n   Sergei Rachmaninoff,Calude Debussy are from Modernist period (20th century)\n\n\nGet two dimensional array\n********************************************************************************\n\nInstead, what if you have to use `pyexcel.get_array` to do the same:\n\n.. code-block:: python\n\n   \u003e\u003e\u003e for row in p.get_array(file_name=\"your_file.xls\", start_row=1):\n   ...     print(f\"{row[2]} are from {row[0]} period ({row[1]})\")\n   Machaut, Landini are from Medieval period (c.1150-c.1400)\n   Gibbons, Frescobaldi are from Renaissance period (c.1400-c.1600)\n   JS Bach, Vivaldi are from Baroque period (c.1600-c.1750)\n   Joseph Haydn, Wolfgan Amadeus Mozart are from Classical period (c.1750-c.1830)\n   Chopin, Mendelssohn, Schumann, Liszt are from Early Romantic period (c.1830-c.1860)\n   Wagner,Verdi are from Late Romantic period (c.1860-c.1920)\n   Sergei Rachmaninoff,Calude Debussy are from Modernist period (20th century)\n\n\nwhere `start_row` skips the header row.\n\n\nGet a dictionary\n********************************************************************************\n\nYou can get a dictionary too:\n\n.. code-block:: python\n\n   \u003e\u003e\u003e my_dict = p.get_dict(file_name=\"your_file.xls\", name_columns_by_row=0)\n\nAnd let's have a look inside:\n\n.. code-block:: python\n\n   \u003e\u003e\u003e from pyexcel._compact import OrderedDict\n   \u003e\u003e\u003e isinstance(my_dict, OrderedDict)\n   True\n   \u003e\u003e\u003e for key, values in my_dict.items():\n   ...     print(key + \" : \" + ','.join([str(item) for item in values]))\n   Name : Medieval,Renaissance,Baroque,Classical,Early Romantic,Late Romantic,Modernist\n   Period : c.1150-c.1400,c.1400-c.1600,c.1600-c.1750,c.1750-c.1830,c.1830-c.1860,c.1860-c.1920,20th century\n   Representative Composers : Machaut, Landini,Gibbons, Frescobaldi,JS Bach, Vivaldi,Joseph Haydn, Wolfgan Amadeus Mozart,Chopin, Mendelssohn, Schumann, Liszt,Wagner,Verdi,Sergei Rachmaninoff,Calude Debussy\n\n\nPlease note that my_dict is an OrderedDict.\n\nGet a dictionary of two dimensional array\n********************************************************************************\n\n\nSuppose you have a multiple sheet book as the following:\n\n\nTop Violinist:\n\n=================  =========  ================\nName               Period     Nationality\nAntonio Vivaldi    1678-1741  Italian\nNiccolo Paganini   1782-1840  Italian\nPablo de Sarasate  1852-1904  Spainish\nEugene Ysaye       1858-1931  Belgian\nFritz Kreisler     1875-1962  Astria-American\nJascha Heifetz     1901-1987  Russian-American\nDavid Oistrakh     1908-1974  Russian\nYehundi Menuhin    1916-1999  American\nItzhak Perlman     1945-      Israeli-American\nHilary Hahn        1979-      American\n=================  =========  ================\n\nNoteable Violin Makers:\n\n======================  =========  ================\nMaker                   Period     Country\nAntonio Stradivari      1644-1737  Cremona, Italy\nGiovanni Paolo Maggini  1580-1630  Botticino, Italy\nAmati Family            1500-1740  Cremona, Italy\nGuarneri Family         1626-1744  Cremona, Italy\nRugeri Family           1628-1719  Cremona, Italy\nCarlo Bergonzi          1683-1747  Cremona, Italy\nJacob Stainer           1617-1683  Austria\n======================  =========  ================\n\nMost Expensive Violins:\n\n=====================  ===============  ===================================\nName                   Estimated Value  Location\nMessiah Stradivarious  $ 20,000,000     Ashmolean Museum in Oxford, England\nVieuxtemps Guarneri    $ 16,000,000     On loan to Anne Akiko Meyers\nLady Blunt             $ 15,900,000     Anonymous bidder\n=====================  ===============  ===================================\n\n\nHere is the code to obtain those sheets as a single dictionary:\n\n.. code-block:: python\n\n   \u003e\u003e\u003e book_dict = p.get_book_dict(file_name=\"book.xls\")\n\nAnd check:\n\n.. code-block:: python\n\n   \u003e\u003e\u003e isinstance(book_dict, OrderedDict)\n   True\n   \u003e\u003e\u003e import json\n   \u003e\u003e\u003e for key, item in book_dict.items():\n   ...     print(json.dumps({key: item}))\n   {\"Most Expensive Violins\": [[\"Name\", \"Estimated Value\", \"Location\"], [\"Messiah Stradivarious\", \"$ 20,000,000\", \"Ashmolean Museum in Oxford, England\"], [\"Vieuxtemps Guarneri\", \"$ 16,000,000\", \"On loan to Anne Akiko Meyers\"], [\"Lady Blunt\", \"$ 15,900,000\", \"Anonymous bidder\"]]}\n   {\"Noteable Violin Makers\": [[\"Maker\", \"Period\", \"Country\"], [\"Antonio Stradivari\", \"1644-1737\", \"Cremona, Italy\"], [\"Giovanni Paolo Maggini\", \"1580-1630\", \"Botticino, Italy\"], [\"Amati Family\", \"1500-1740\", \"Cremona, Italy\"], [\"Guarneri Family\", \"1626-1744\", \"Cremona, Italy\"], [\"Rugeri Family\", \"1628-1719\", \"Cremona, Italy\"], [\"Carlo Bergonzi\", \"1683-1747\", \"Cremona, Italy\"], [\"Jacob Stainer\", \"1617-1683\", \"Austria\"]]}\n   {\"Top Violinist\": [[\"Name\", \"Period\", \"Nationality\"], [\"Antonio Vivaldi\", \"1678-1741\", \"Italian\"], [\"Niccolo Paganini\", \"1782-1840\", \"Italian\"], [\"Pablo de Sarasate\", \"1852-1904\", \"Spainish\"], [\"Eugene Ysaye\", \"1858-1931\", \"Belgian\"], [\"Fritz Kreisler\", \"1875-1962\", \"Astria-American\"], [\"Jascha Heifetz\", \"1901-1987\", \"Russian-American\"], [\"David Oistrakh\", \"1908-1974\", \"Russian\"], [\"Yehundi Menuhin\", \"1916-1999\", \"American\"], [\"Itzhak Perlman\", \"1945-\", \"Israeli-American\"], [\"Hilary Hahn\", \"1979-\", \"American\"]]}\n\n\nWrite data\n---------------------------------------------\n\nExport an array\n**********************\n\nSuppose you have the following array:\n\n.. code-block:: python\n\n   \u003e\u003e\u003e data = [['G', 'D', 'A', 'E'], ['Thomastik-Infield Domaints', 'Thomastik-Infield Domaints', 'Thomastik-Infield Domaints', 'Pirastro'], ['Silver wound', '', 'Aluminum wound', 'Gold Label Steel']]\n\nAnd here is the code to save it as an excel file :\n\n.. code-block:: python\n\n   \u003e\u003e\u003e p.save_as(array=data, dest_file_name=\"example.xls\")\n\nLet's verify it:\n\n.. code-block:: python\n\n    \u003e\u003e\u003e p.get_sheet(file_name=\"example.xls\")\n    pyexcel_sheet1:\n    +----------------------------+----------------------------+----------------------------+------------------+\n    | G                          | D                          | A                          | E                |\n    +----------------------------+----------------------------+----------------------------+------------------+\n    | Thomastik-Infield Domaints | Thomastik-Infield Domaints | Thomastik-Infield Domaints | Pirastro         |\n    +----------------------------+----------------------------+----------------------------+------------------+\n    | Silver wound               |                            | Aluminum wound             | Gold Label Steel |\n    +----------------------------+----------------------------+----------------------------+------------------+\n\n\nAnd here is the code to save it as a csv file :\n\n.. code-block:: python\n\n   \u003e\u003e\u003e p.save_as(array=data,\n   ...           dest_file_name=\"example.csv\",\n   ...           dest_delimiter=':')\n\nLet's verify it:\n\n.. code-block:: python\n\n    \u003e\u003e\u003e with open(\"example.csv\") as f:\n    ...     for line in f.readlines():\n    ...         print(line.rstrip())\n    ...\n    G:D:A:E\n    Thomastik-Infield Domaints:Thomastik-Infield Domaints:Thomastik-Infield Domaints:Pirastro\n    Silver wound::Aluminum wound:Gold Label Steel\n\nExport a list of dictionaries\n**********************************\n\n.. code-block:: python\n\n    \u003e\u003e\u003e records = [\n    ...     {\"year\": 1903, \"country\": \"Germany\", \"speed\": \"206.7km/h\"},\n    ...     {\"year\": 1964, \"country\": \"Japan\", \"speed\": \"210km/h\"},\n    ...     {\"year\": 2008, \"country\": \"China\", \"speed\": \"350km/h\"}\n    ... ]\n    \u003e\u003e\u003e p.save_as(records=records, dest_file_name='high_speed_rail.xls')\n\n\nExport a dictionary of single key value pair\n********************************************************************************\n\n.. code-block:: python\n\n    \u003e\u003e\u003e henley_on_thames_facts = {\n    ...     \"area\": \"5.58 square meters\",\n    ...     \"population\": \"11,619\",\n    ...     \"civial parish\": \"Henley-on-Thames\",\n    ...     \"latitude\": \"51.536\",\n    ...     \"longitude\": \"-0.898\"\n    ... }\n    \u003e\u003e\u003e p.save_as(adict=henley_on_thames_facts, dest_file_name='henley.xlsx')\n\n\nExport a dictionary of single dimensonal array\n********************************************************************************\n\n.. code-block:: python\n\n    \u003e\u003e\u003e ccs_insights = {\n    ...     \"year\": [\"2017\", \"2018\", \"2019\", \"2020\", \"2021\"],\n    ...     \"smart phones\": [1.53, 1.64, 1.74, 1.82, 1.90],\n    ...     \"feature phones\": [0.46, 0.38, 0.30, 0.23, 0.17]\n    ... }\n    \u003e\u003e\u003e p.save_as(adict=ccs_insights, dest_file_name='ccs.csv')\n\n\nExport a dictionary of two dimensional array as a book\n********************************************************************************\n\nSuppose you want to save the below dictionary to an excel file :\n\n.. code-block:: python\n\n   \u003e\u003e\u003e a_dictionary_of_two_dimensional_arrays = {\n   ...      'Top 3 Aircraft Manufacturers':\n   ...          [\n   ...              ['Name', 'Revenue'],\n   ...              ['Lockheed Martin', '65.4 billion USD'],\n   ...              ['Airbus', '78.9 billion USD'],\n   ...              ['Boeing', '58.16 billion USD']\n   ...          ],\n   ...      'Top 3 Airlines':\n   ...          [\n   ...              ['Name', 'Country', 'Revenue'],\n   ...              ['Delta Air Lines', 'US', 61.6],\n   ...              ['American Airlines Holdings', 'US', 57.1],\n   ...              ['American Airlines Group', 'US', 54.2]\n   ...          ],\n   ...      'Biggest 3 Airoplanes':\n   ...          [\n   ...              ['Model', 'Passenger limt'],\n   ...              ['Airbus A380-800', 853],\n   ...              ['Boeing 747-400', 660],\n   ...              ['Boeing 747-8', 605]\n   ...          ]\n   ...  }\n\nHere is the code:\n\n.. code-block:: python\n\n   \u003e\u003e\u003e p.save_book_as(\n   ...    bookdict=a_dictionary_of_two_dimensional_arrays,\n   ...    dest_file_name=\"book.xls\"\n   ... )\n\nIf you want to preserve the order of sheets in your dictionary, you have to\npass on an ordered dictionary to the function itself. For example:\n\n.. code-block:: python\n\n   \u003e\u003e\u003e data = OrderedDict()\n   \u003e\u003e\u003e data.update({\"Sheet 2\": a_dictionary_of_two_dimensional_arrays['Top 3 Airlines']})\n   \u003e\u003e\u003e data.update({\"Sheet 1\": a_dictionary_of_two_dimensional_arrays['Top 3 Aircraft Manufacturers']})\n   \u003e\u003e\u003e data.update({\"Sheet 3\": a_dictionary_of_two_dimensional_arrays['Biggest 3 Airoplanes']})\n   \u003e\u003e\u003e p.save_book_as(bookdict=data, dest_file_name=\"book.xls\")\n\nLet's verify its order:\n\n.. code-block:: python\n\n   \u003e\u003e\u003e book_dict = p.get_book_dict(file_name=\"book.xls\")\n   \u003e\u003e\u003e for key, item in book_dict.items():\n   ...     print(json.dumps({key: item}))\n   {\"Sheet 2\": [[\"Name\", \"Country\", \"Revenue\"], [\"Delta Air Lines\", \"US\", 61.6], [\"American Airlines Holdings\", \"US\", 57.1], [\"American Airlines Group\", \"US\", 54.2]]}\n   {\"Sheet 1\": [[\"Name\", \"Revenue\"], [\"Lockheed Martin\", \"65.4 billion USD\"], [\"Airbus\", \"78.9 billion USD\"], [\"Boeing\", \"58.16 billion USD\"]]}\n   {\"Sheet 3\": [[\"Model\", \"Passenger limt\"], [\"Airbus A380-800\", 853], [\"Boeing 747-400\", 660], [\"Boeing 747-8\", 605]]}\n\nPlease notice that \"Sheet 2\" is the first item in the *book_dict*, meaning the order of sheets are preserved.\n\n\nTranscoding\n-------------------------------------------\n\n.. note::\n\n   Please note that `pyexcel-cli` can perform file transcoding at command line.\n   No need to open your editor, save the code, then python run.\n\n\nThe following code does a simple file format transcoding from xls to csv:\n\n.. code-block:: python\n\n   \u003e\u003e\u003e p.save_as(file_name=\"trump_tariffs.xls\", dest_file_name=\"trump_tariffs.csv\")\n\nAgain it is really simple. Let's verify what we have gotten:\n\n.. code-block:: python\n\n   \u003e\u003e\u003e sheet = p.get_sheet(file_name=\"trump_tariffs.csv\")\n   \u003e\u003e\u003e sheet\n   trump_tariffs.csv:\n   +----------------+-------------------+----------------------------+\n   | Country        | New US tariffs, % | Tariffs charged to the USA |\n   +----------------+-------------------+----------------------------+\n   | China          | 34                | 67                         |\n   +----------------+-------------------+----------------------------+\n   | EU             | 20                | 39                         |\n   +----------------+-------------------+----------------------------+\n   | United Kingdom | 10                | 10                         |\n   +----------------+-------------------+----------------------------+\n\n\n.. NOTE::\n\n   Please note that csv(comma separate value) file is pure text file. Formula, charts, images and formatting in xls file will disappear no matter which transcoding tool you use. Hence, pyexcel is a quick alternative for this transcoding job.\n\n\nLet use previous example and save it as xlsx instead\n\n.. code-block:: python\n\n   \u003e\u003e\u003e p.save_as(file_name=\"trump_tariffs.xls\",\n   ...           dest_file_name=\"trump_tariffs.xlsx\") # change the file extension\n\nAgain let's verify what we have gotten:\n\n.. code-block:: python\n\n   \u003e\u003e\u003e sheet = p.get_sheet(file_name=\"trump_tariffs.xlsx\")\n   \u003e\u003e\u003e sheet\n   pyexcel_sheet1:\n   +----------------+-------------------+----------------------------+\n   | Country        | New US tariffs, % | Tariffs charged to the USA |\n   +----------------+-------------------+----------------------------+\n   | China          | 34                | 67                         |\n   +----------------+-------------------+----------------------------+\n   | EU             | 20                | 39                         |\n   +----------------+-------------------+----------------------------+\n   | United Kingdom | 10                | 10                         |\n   +----------------+-------------------+----------------------------+\n\n\nExcel book merge and split operation in one line\n--------------------------------------------------------------------------------\n\nMerge all excel files in directory into  a book where each file become a sheet\n********************************************************************************\n\nThe following code will merge every excel files into one file, say \"output.xls\":\n\n.. code-block:: python\n\n    from pyexcel.cookbook import merge_all_to_a_book\n    import glob\n\n\n    merge_all_to_a_book(glob.glob(\"your_csv_directory\\*.csv\"), \"output.xls\")\n\nYou can mix and match with other excel formats: xls, xlsm and ods. For example, if you are sure you have only xls, xlsm, xlsx, ods and csv files in `your_excel_file_directory`, you can do the following:\n\n.. code-block:: python\n\n    from pyexcel.cookbook import merge_all_to_a_book\n    import glob\n\n\n    merge_all_to_a_book(glob.glob(\"your_excel_file_directory\\*.*\"), \"output.xls\")\n\nSplit a book into single sheet files\n****************************************\n\n\nSuppose you have many sheets in a work book and you would like to separate each into a single sheet excel file. You can easily do this:\n\n.. code-block:: python\n\n   \u003e\u003e\u003e from pyexcel.cookbook import split_a_book\n   \u003e\u003e\u003e split_a_book(\"megabook.xls\", \"output.xls\")\n   \u003e\u003e\u003e import glob\n   \u003e\u003e\u003e outputfiles = glob.glob(\"*_output.xls\")\n   \u003e\u003e\u003e for file in sorted(outputfiles):\n   ...     print(file)\n   ...\n   Sheet 1_output.xls\n   Sheet 2_output.xls\n   Sheet 3_output.xls\n\nfor the output file, you can specify any of the supported formats\n\n\nExtract just one sheet from a book\n*************************************\n\n\nSuppose you just want to extract one sheet from many sheets that exists in a work book and you would like to separate it into a single sheet excel file. You can easily do this:\n\n.. code-block:: python\n\n    \u003e\u003e\u003e from pyexcel.cookbook import extract_a_sheet_from_a_book\n    \u003e\u003e\u003e extract_a_sheet_from_a_book(\"megabook.xls\", \"Sheet 1\", \"output.xls\")\n    \u003e\u003e\u003e if os.path.exists(\"Sheet 1_output.xls\"):\n    ...     print(\"Sheet 1_output.xls exists\")\n    ...\n    Sheet 1_output.xls exists\n\nfor the output file, you can specify any of the supported formats\n\n\nHidden feature: partial read\n===============================================\n\nMost pyexcel users do not know, but other library users were requesting `partial read \u003chttps://github.com/jazzband/tablib/issues/467\u003e`_\n\n\nWhen you are dealing with huge amount of data, e.g. 64GB, obviously you would not\nlike to fill up your memory with those data. What you may want to do is, record\ndata from Nth line, take M records and stop. And you only want to use your memory\nfor the M records, not for beginning part nor for the tail part.\n\nHence partial read feature is developed to read partial data into memory for\nprocessing. \n\nYou can paginate by row, by column and by both, hence you dictate what portion of the\ndata to read back. But remember only row limit features help you save memory. Let's\nyou use this feature to record data from Nth column, take M number of columns and skip\nthe rest. You are not going to reduce your memory footprint.\n\nWhy did not I see above benefit?\n--------------------------------------------------------------------------------\n\nThis feature depends heavily on the implementation details.\n\n`pyexcel-xls`_ (xlrd), `pyexcel-xlsx`_ (openpyxl), `pyexcel-ods`_ (odfpy) and\n`pyexcel-ods3`_ (pyexcel-ezodf) will read all data into memory. Because xls,\nxlsx and ods file are effective a zipped folder, all four will unzip the folder\nand read the content in xml format in **full**, so as to make sense of all details.\n\nHence, during the partial data is been returned, the memory consumption won't\ndiffer from reading the whole data back. Only after the partial\ndata is returned, the memory comsumption curve shall jump the cliff. So pagination\ncode here only limits the data returned to your program.\n\nWith that said, `pyexcel-xlsxr`_, `pyexcel-odsr`_ and `pyexcel-htmlr`_ DOES read\npartial data into memory. Those three are implemented in such a way that they\nconsume the xml(html) when needed. When they have read designated portion of the\ndata, they stop, even if they are half way through.\n\nIn addition, pyexcel's csv readers can read partial data into memory too.\n\n\nLet's assume the following file is a huge csv file:\n\n.. code-block:: python\n\n   \u003e\u003e\u003e import datetime\n   \u003e\u003e\u003e import pyexcel as pe\n   \u003e\u003e\u003e data = [\n   ...     [1, 21, 31],\n   ...     [2, 22, 32],\n   ...     [3, 23, 33],\n   ...     [4, 24, 34],\n   ...     [5, 25, 35],\n   ...     [6, 26, 36]\n   ... ]\n   \u003e\u003e\u003e pe.save_as(array=data, dest_file_name=\"your_file.csv\")\n\n\nAnd let's pretend to read partial data:\n\n\n.. code-block:: python\n\n   \u003e\u003e\u003e pe.get_sheet(file_name=\"your_file.csv\", start_row=2, row_limit=3)\n   your_file.csv:\n   +---+----+----+\n   | 3 | 23 | 33 |\n   +---+----+----+\n   | 4 | 24 | 34 |\n   +---+----+----+\n   | 5 | 25 | 35 |\n   +---+----+----+\n\nAnd you could as well do the same for columns:\n\n.. code-block:: python\n\n   \u003e\u003e\u003e pe.get_sheet(file_name=\"your_file.csv\", start_column=1, column_limit=2)\n   your_file.csv:\n   +----+----+\n   | 21 | 31 |\n   +----+----+\n   | 22 | 32 |\n   +----+----+\n   | 23 | 33 |\n   +----+----+\n   | 24 | 34 |\n   +----+----+\n   | 25 | 35 |\n   +----+----+\n   | 26 | 36 |\n   +----+----+\n\nObvious, you could do both at the same time:\n\n.. code-block:: python\n\n   \u003e\u003e\u003e pe.get_sheet(file_name=\"your_file.csv\",\n   ...     start_row=2, row_limit=3,\n   ...     start_column=1, column_limit=2)\n   your_file.csv:\n   +----+----+\n   | 23 | 33 |\n   +----+----+\n   | 24 | 34 |\n   +----+----+\n   | 25 | 35 |\n   +----+----+\n\n\nThe pagination support is available across all pyexcel plugins.\n\n.. note::\n\n   No column pagination support for query sets as data source. \n\n\nFormatting while transcoding a big data file\n--------------------------------------------------------------------------------\n\nIf you are transcoding a big data set, conventional formatting method would not\nhelp unless a on-demand free RAM is available. However, there is a way to minimize\nthe memory footprint of pyexcel while the formatting is performed.\n\nLet's continue from previous example. Suppose we want to transcode \"your_file.csv\"\nto \"your_file.xls\" but increase each element by 1.\n\nWhat we can do is to define a row renderer function as the following:\n\n.. code-block:: python\n\n   \u003e\u003e\u003e def increment_by_one(row):\n   ...     for element in row:\n   ...         yield element + 1\n\nThen pass it onto save_as function using row_renderer:\n\n.. code-block:: python\n\n   \u003e\u003e\u003e pe.isave_as(file_name=\"your_file.csv\",\n   ...             row_renderer=increment_by_one,\n   ...             dest_file_name=\"your_file.xlsx\")\n\n\n.. note::\n\n   If the data content is from a generator, isave_as has to be used.\n   \nWe can verify if it was done correctly:\n\n.. code-block:: python\n\n   \u003e\u003e\u003e pe.get_sheet(file_name=\"your_file.xlsx\")\n   your_file.csv:\n   +---+----+----+\n   | 2 | 22 | 32 |\n   +---+----+----+\n   | 3 | 23 | 33 |\n   +---+----+----+\n   | 4 | 24 | 34 |\n   +---+----+----+\n   | 5 | 25 | 35 |\n   +---+----+----+\n   | 6 | 26 | 36 |\n   +---+----+----+\n   | 7 | 27 | 37 |\n   +---+----+----+\n\n\nStream APIs for big file : A set of two liners\n================================================================================\n\nWhen you are dealing with **BIG** excel files, you will want **pyexcel** to use\nconstant memory.\n\nThis section shows you how to get data from your **BIG** excel files and how to\nexport data to excel files in **two lines** at most, without eating all\nyour computer memory.\n\n\nTwo liners for get data from big excel files\n--------------------------------------------------------------------------------\n\nGet a list of dictionaries\n********************************************************************************\n\n\n\nSuppose you want to process the following coffee data again:\n\nTop 5 coffeine drinks:\n\n=====================================  ===============  =============\nCoffees                                Serving Size     Caffeine (mg)\nStarbucks Coffee Blonde Roast          venti(20 oz)     475\nDunkin' Donuts Coffee with Turbo Shot  large(20 oz.)    398\nStarbucks Coffee Pike Place Roast      grande(16 oz.)   310\nPanera Coffee Light Roast              regular(16 oz.)  300\n=====================================  ===============  =============\n\n\nLet's get a list of dictionary out from the xls file:\n\n.. code-block:: python\n\n   \u003e\u003e\u003e records = p.iget_records(file_name=\"your_file.xls\")\n\nAnd let's check what do we have:\n\n.. code-block:: python\n\n   \u003e\u003e\u003e for r in records:\n   ...     print(f\"{r['Serving Size']} of {r['Coffees']} has {r['Caffeine (mg)']} mg\")\n   venti(20 oz) of Starbucks Coffee Blonde Roast has 475 mg\n   large(20 oz.) of Dunkin' Donuts Coffee with Turbo Shot has 398 mg\n   grande(16 oz.) of Starbucks Coffee Pike Place Roast has 310 mg\n   regular(16 oz.) of Panera Coffee Light Roast has 300 mg\n\nPlease do not forgot the second line to close the opened file handle:\n\n.. code-block:: python\n\n   \u003e\u003e\u003e p.free_resources()\n\nGet two dimensional array\n********************************************************************************\n\nInstead, what if you have to use `pyexcel.get_array` to do the same:\n\n.. code-block:: python\n\n   \u003e\u003e\u003e for row in p.iget_array(file_name=\"your_file.xls\", start_row=1):\n   ...     print(f\"{row[1]} of {row[0]} has {row[2]} mg\")\n   venti(20 oz) of Starbucks Coffee Blonde Roast has 475 mg\n   large(20 oz.) of Dunkin' Donuts Coffee with Turbo Shot has 398 mg\n   grande(16 oz.) of Starbucks Coffee Pike Place Roast has 310 mg\n   regular(16 oz.) of Panera Coffee Light Roast has 300 mg\n\nAgain, do not forgot the second line:\n\n.. code-block:: python\n\n   \u003e\u003e\u003e p.free_resources()\n\nwhere `start_row` skips the header row.\n\nData export in one liners\n---------------------------------------------\n\nExport an array\n**********************\n\nSuppose you have the following array:\n\n.. code-block:: python\n\n   \u003e\u003e\u003e data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]\n\nAnd here is the code to save it as an excel file :\n\n.. code-block:: python\n\n   \u003e\u003e\u003e p.isave_as(array=data, dest_file_name=\"example.xls\")\n\nBut the following line is not required because the data source\nare not file sources:\n\n.. code-block:: python\n\n   \u003e\u003e\u003e # p.free_resources()\n\nLet's verify it:\n\n.. code-block:: python\n\n    \u003e\u003e\u003e p.get_sheet(file_name=\"example.xls\")\n    pyexcel_sheet1:\n    +---+---+---+\n    | 1 | 2 | 3 |\n    +---+---+---+\n    | 4 | 5 | 6 |\n    +---+---+---+\n    | 7 | 8 | 9 |\n    +---+---+---+\n\n\nAnd here is the code to save it as a csv file :\n\n.. code-block:: python\n\n   \u003e\u003e\u003e p.isave_as(array=data,\n   ...            dest_file_name=\"example.csv\",\n   ...            dest_delimiter=':')\n\nLet's verify it:\n\n.. code-block:: python\n\n   \u003e\u003e\u003e with open(\"example.csv\") as f:\n   ...     for line in f.readlines():\n   ...         print(line.rstrip())\n   ...\n   1:2:3\n   4:5:6\n   7:8:9\n\nExport a list of dictionaries\n**********************************\n\n.. code-block:: python\n\n    \u003e\u003e\u003e records = [\n    ...     {\"year\": 1903, \"country\": \"Germany\", \"speed\": \"206.7km/h\"},\n    ...     {\"year\": 1964, \"country\": \"Japan\", \"speed\": \"210km/h\"},\n    ...     {\"year\": 2008, \"country\": \"China\", \"speed\": \"350km/h\"}\n    ... ]\n    \u003e\u003e\u003e p.isave_as(records=records, dest_file_name='high_speed_rail.xls')\n\nExport a dictionary of single key value pair\n********************************************************************************\n\n.. code-block:: python\n\n    \u003e\u003e\u003e henley_on_thames_facts = {\n    ...     \"area\": \"5.58 square meters\",\n    ...     \"population\": \"11,619\",\n    ...     \"civial parish\": \"Henley-on-Thames\",\n    ...     \"latitude\": \"51.536\",\n    ...     \"longitude\": \"-0.898\"\n    ... }\n    \u003e\u003e\u003e p.isave_as(adict=henley_on_thames_facts, dest_file_name='henley.xlsx')\n\nExport a dictionary of single dimensonal array\n********************************************************************************\n\n.. code-block:: python\n\n    \u003e\u003e\u003e ccs_insights = {\n    ...     \"year\": [\"2017\", \"2018\", \"2019\", \"2020\", \"2021\"],\n    ...     \"smart phones\": [1.53, 1.64, 1.74, 1.82, 1.90],\n    ...     \"feature phones\": [0.46, 0.38, 0.30, 0.23, 0.17]\n    ... }\n    \u003e\u003e\u003e p.isave_as(adict=ccs_insights, dest_file_name='ccs.csv')\n    \u003e\u003e\u003e p.free_resources()\n\nExport a dictionary of two dimensional array as a book\n********************************************************************************\n\nSuppose you want to save the below dictionary to an excel file :\n\n.. code-block:: python\n\n   \u003e\u003e\u003e a_dictionary_of_two_dimensional_arrays = {\n   ...      'Sheet 1':\n   ...          [\n   ...              [1.0, 2.0, 3.0],\n   ...              [4.0, 5.0, 6.0],\n   ...              [7.0, 8.0, 9.0]\n   ...          ],\n   ...      'Sheet 2':\n   ...          [\n   ...              ['X', 'Y', 'Z'],\n   ...              [1.0, 2.0, 3.0],\n   ...              [4.0, 5.0, 6.0]\n   ...          ],\n   ...      'Sheet 3':\n   ...          [\n   ...              ['O', 'P', 'Q'],\n   ...              [3.0, 2.0, 1.0],\n   ...              [4.0, 3.0, 2.0]\n   ...          ]\n   ...  }\n\nHere is the code:\n\n.. code-block:: python\n\n   \u003e\u003e\u003e p.isave_book_as(\n   ...    bookdict=a_dictionary_of_two_dimensional_arrays,\n   ...    dest_file_name=\"book.xls\"\n   ... )\n\nIf you want to preserve the order of sheets in your dictionary, you have to\npass on an ordered dictionary to the function itself. For example:\n\n.. code-block:: python\n\n   \u003e\u003e\u003e from pyexcel._compact import OrderedDict\n   \u003e\u003e\u003e data = OrderedDict()\n   \u003e\u003e\u003e data.update({\"Sheet 2\": a_dictionary_of_two_dimensional_arrays['Sheet 2']})\n   \u003e\u003e\u003e data.update({\"Sheet 1\": a_dictionary_of_two_dimensional_arrays['Sheet 1']})\n   \u003e\u003e\u003e data.update({\"Sheet 3\": a_dictionary_of_two_dimensional_arrays['Sheet 3']})\n   \u003e\u003e\u003e p.isave_book_as(bookdict=data, dest_file_name=\"book.xls\")\n   \u003e\u003e\u003e p.free_resources()\n\nLet's verify its order:\n\n.. code-block:: python\n\n   \u003e\u003e\u003e import json\n   \u003e\u003e\u003e book_dict = p.get_book_dict(file_name=\"book.xls\")\n   \u003e\u003e\u003e for key, item in book_dict.items():\n   ...     print(json.dumps({key: item}))\n   {\"Sheet 2\": [[\"X\", \"Y\", \"Z\"], [1, 2, 3], [4, 5, 6]]}\n   {\"Sheet 1\": [[1, 2, 3], [4, 5, 6], [7, 8, 9]]}\n   {\"Sheet 3\": [[\"O\", \"P\", \"Q\"], [3, 2, 1], [4, 3, 2]]}\n\nPlease notice that \"Sheet 2\" is the first item in the *book_dict*, meaning the order of sheets are preserved.\n\n\nFile format transcoding on one line\n-------------------------------------------\n\n.. note::\n\n   Please note that the following file transcoding could be with zero line. Please\n   install pyexcel-cli and you will do the transcode in one command. No need to\n   open your editor, save the problem, then python run.\n\n\nThe following code does a simple file format transcoding from xls to csv:\n\n.. code-block:: python\n\n   \u003e\u003e\u003e import pyexcel\n   \u003e\u003e\u003e p.save_as(file_name=\"birth.xls\", dest_file_name=\"birth.csv\")\n\nAgain it is really simple. Let's verify what we have gotten:\n\n.. code-block:: python\n\n   \u003e\u003e\u003e sheet = p.get_sheet(file_name=\"birth.csv\")\n   \u003e\u003e\u003e sheet\n   birth.csv:\n   +-------+--------+----------+\n   | name  | weight | birth    |\n   +-------+--------+----------+\n   | Adam  | 3.4    | 03/02/15 |\n   +-------+--------+----------+\n   | Smith | 4.2    | 12/11/14 |\n   +-------+--------+----------+\n\n.. note::\n\n   Please note that csv(comma separate value) file is pure text file. Formula, charts, images and formatting in xls file will disappear no matter which transcoding tool you use. Hence, pyexcel is a quick alternative for this transcoding job.\n\n\nLet use previous example and save it as xlsx instead\n\n.. code-block:: python\n\n   \u003e\u003e\u003e import pyexcel\n   \u003e\u003e\u003e p.isave_as(file_name=\"birth.xls\",\n   ...            dest_file_name=\"birth.xlsx\") # change the file extension\n\nAgain let's verify what we have gotten:\n\n.. code-block:: python\n\n   \u003e\u003e\u003e sheet = p.get_sheet(file_name=\"birth.xlsx\")\n   \u003e\u003e\u003e sheet\n   pyexcel_sheet1:\n   +-------+--------+----------+\n   | name  | weight | birth    |\n   +-------+--------+----------+\n   | Adam  | 3.4    | 03/02/15 |\n   +-------+--------+----------+\n   | Smith | 4.2    | 12/11/14 |\n   +-------+--------+----------+\n\n\nAvailable Plugins\n=================\n\n.. _file-format-list:\n.. _a-map-of-plugins-and-file-formats:\n\n.. table:: A list of file formats supported by external plugins\n\n   ======================== ======================= =================\n   Package name              Supported file formats  Dependencies\n   ======================== ======================= =================\n   `pyexcel-io`_            csv, csvz [#f1]_, tsv,  csvz,tsvz readers depends on `chardet`\n                            tsvz [#f2]_\n   `pyexcel-xls`_           xls, xlsx(read only),   `xlrd`_,\n                            xlsm(read only)         `xlwt`_\n   `pyexcel-xlsx`_          xlsx                    `openpyxl`_\n   `pyexcel-ods3`_          ods                     `pyexcel-ezodf`_,\n                                                    lxml\n   `pyexcel-ods`_           ods                     `odfpy`_\n   ======================== ======================= =================\n\n.. table:: Dedicated file reader and writers\n\n   ======================== ======================= =================\n   Package name              Supported file formats  Dependencies\n   ======================== ======================= =================\n   `pyexcel-xlsxw`_         xlsx(write only)        `XlsxWriter`_\n   `pyexcel-libxlsxw`_      xlsx(write only)        `libxlsxwriter`_\n   `pyexcel-xlsxr`_         xlsx(read only)         lxml\n   `pyexcel-xlsbr`_         xlsb(read only)         pyxlsb\n   `pyexcel-odsr`_          read only for ods, fods lxml\n   `pyexcel-odsw`_          write only for ods      loxun\n   `pyexcel-htmlr`_         html(read only)         lxml,html5lib\n   `pyexcel-pdfr`_          pdf(read only)          camelot\n   ======================== ======================= =================\n\n\nPlugin shopping guide\n------------------------\n\nSince 2020, all pyexcel-io plugins have dropped the support for python versions\nwhich are lower than 3.6. If you want to use any of those Python versions, please use pyexcel-io\nand its plugins versions that are lower than 0.6.0.\n\n\nExcept csv files, xls, xlsx and ods files are a zip of a folder containing a lot of\nxml files\n\nThe dedicated readers for excel files can stream read\n\n\nIn order to manage the list of plugins installed, you need to use pip to add or remove\na plugin. When you use virtualenv, you can have different plugins per virtual\nenvironment. In the situation where you have multiple plugins that does the same thing\nin your environment, you need to tell pyexcel which plugin to use per function call.\nFor example, pyexcel-ods and pyexcel-odsr, and you want to get_array to use pyexcel-odsr.\nYou need to append get_array(..., library='pyexcel-odsr').\n\n\n\n.. _pyexcel-io: https://github.com/pyexcel/pyexcel-io\n.. _pyexcel-xls: https://github.com/pyexcel/pyexcel-xls\n.. _pyexcel-xlsx: https://github.com/pyexcel/pyexcel-xlsx\n.. _pyexcel-ods: https://github.com/pyexcel/pyexcel-ods\n.. _pyexcel-ods3: https://github.com/pyexcel/pyexcel-ods3\n.. _pyexcel-odsr: https://github.com/pyexcel/pyexcel-odsr\n.. _pyexcel-odsw: https://github.com/pyexcel/pyexcel-odsw\n.. _pyexcel-pdfr: https://github.com/pyexcel/pyexcel-pdfr\n\n.. _pyexcel-xlsxw: https://github.com/pyexcel/pyexcel-xlsxw\n.. _pyexcel-libxlsxw: https://github.com/pyexcel/pyexcel-libxlsxw\n.. _pyexcel-xlsxr: https://github.com/pyexcel/pyexcel-xlsxr\n.. _pyexcel-xlsbr: https://github.com/pyexcel/pyexcel-xlsbr\n.. _pyexcel-htmlr: https://github.com/pyexcel/pyexcel-htmlr\n\n.. _xlrd: https://github.com/python-excel/xlrd\n.. _xlwt: https://github.com/python-excel/xlwt\n.. _openpyxl: https://bitbucket.org/openpyxl/openpyxl\n.. _XlsxWriter: https://github.com/jmcnamara/XlsxWriter\n.. _pyexcel-ezodf: https://github.com/pyexcel/pyexcel-ezodf\n.. _odfpy: https://github.com/eea/odfpy\n.. _libxlsxwriter: http://libxlsxwriter.github.io/getting_started.html\n\n.. table:: Other data renderers\n\n   ======================== ======================= ================= ==================\n   Package name              Supported file formats  Dependencies     Python versions\n   ======================== ======================= ================= ==================\n   `pyexcel-text`_          write only:rst,         `tabulate`_       2.6, 2.7, 3.3, 3.4\n                            mediawiki, html,                          3.5, 3.6, pypy\n                            latex, grid, pipe,\n                            orgtbl, plain simple\n                            read only: ndjson\n                            r/w: json\n   `pyexcel-handsontable`_  handsontable in html    `handsontable`_   same as above\n   `pyexcel-pygal`_         svg chart               `pygal`_          2.7, 3.3, 3.4, 3.5\n                                                                      3.6, pypy\n   `pyexcel-sortable`_      sortable table in html  `csvtotable`_     same as above\n   `pyexcel-gantt`_         gantt chart in html     `frappe-gantt`_   except pypy, same\n                                                                      as above\n   ======================== ======================= ================= ==================\n\n.. _pyexcel-text: https://github.com/pyexcel/pyexcel-text\n.. _tabulate: https://bitbucket.org/astanin/python-tabulate\n.. _pyexcel-handsontable: https://github.com/pyexcel/pyexcel-handsontable\n.. _handsontable: https://cdnjs.com/libraries/handsontable\n.. _pyexcel-pygal: https://github.com/pyexcel/pyexcel-chart\n.. _pygal: https://github.com/Kozea/pygal\n.. _pyexcel-matplotlib: https://github.com/pyexcel/pyexcel-matplotlib\n.. _matplotlib: https://matplotlib.org\n.. _pyexcel-sortable: https://github.com/pyexcel/pyexcel-sortable\n.. _csvtotable: https://github.com/vividvilla/csvtotable\n.. _pyexcel-gantt: https://github.com/pyexcel/pyexcel-gantt\n.. _frappe-gantt: https://github.com/frappe/gantt\n\n.. rubric:: Footnotes\n\n.. [#f1] zipped csv file\n.. [#f2] zipped tsv file\n\n\nAcknowledgement\n===============\n\nAll great work have been done by odf, ezodf, xlrd, xlwt, tabulate and other\nindividual developers. This library unites only the data access code.\n\n\n\n\nLicense\n================================================================================\n\nNew BSD License\n","funding_links":["https://github.com/sponsors/chfw","https://patreon.com/chfw","https://www.patreon.com/chfw","https://www.patreon.com/bePatron?u=5537627"],"categories":["Specific Formats Processing","Python","资源列表","特定格式处理","特殊文本格式处理","Specific Formats Processing [🔝](#readme)","📚 فهرست","Awesome Python","Software development"],"sub_categories":["特殊文本格式处理","کار با اکسل","Specific Formats Processing","Libraries"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpyexcel%2Fpyexcel","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpyexcel%2Fpyexcel","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpyexcel%2Fpyexcel/lists"}