pyexcel 0.7.3__tar.gz → 0.7.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pyexcel-0.7.3 → pyexcel-0.7.4}/CHANGELOG.rst +8 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/PKG-INFO +61 -44
- {pyexcel-0.7.3 → pyexcel-0.7.4}/README.rst +51 -42
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/conf.py +2 -2
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/quickstart.rst +56 -47
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/sources.rst +2 -2
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/two-liners.rst +4 -3
- pyexcel-0.7.4/pyexcel/__version__.py +2 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/_compact.py +3 -9
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/book.py +2 -2
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/core.py +11 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/internal/core.py +3 -3
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/internal/meta.py +1 -8
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/internal/plugins.py +0 -3
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/internal/sheets/_shared.py +3 -5
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/internal/sheets/extended_list.py +0 -3
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/internal/sheets/formatters.py +1 -1
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/internal/sheets/matrix.py +37 -40
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/plugins/sources/db_sources.py +1 -5
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/plugins/sources/http.py +2 -5
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/plugins/sources/pydata/bookdict.py +2 -3
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/plugins/sources/pydata/common.py +2 -3
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/sheet.py +0 -2
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel.egg-info/PKG-INFO +61 -44
- {pyexcel-0.7.3 → pyexcel-0.7.4}/setup.py +4 -4
- pyexcel-0.7.4/tests/_compact.py +4 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/test_examples.py +15 -22
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/test_http_source.py +3 -9
- pyexcel-0.7.4/tests/test_internals.py +10 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/test_signature_fuction.py +22 -22
- pyexcel-0.7.3/pyexcel/__version__.py +0 -2
- pyexcel-0.7.3/tests/_compact.py +0 -14
- pyexcel-0.7.3/tests/test_internals.py +0 -15
- {pyexcel-0.7.3 → pyexcel-0.7.4}/CONTRIBUTORS.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/LICENSE +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/MANIFEST.in +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/Makefile +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/make.bat +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/requirements.txt +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/_static/handsontable.full.min.css +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/_static/handsontable.full.min.js +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/_static/images/architecture.svg +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/_static/theme_overrides.css +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/_templates/layout.html +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/answers.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/api.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/architecture.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/attributes.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/bigdata.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/book.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/capability.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/changelog.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/coffee.csv +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/cookbook.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/database.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/design.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/entity-relationship-diagram.dia +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/entity-relationship-diagram.png +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Book.bookdict.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Book.csv.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Book.csvz.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Book.number_of_sheets.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Book.ods.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Book.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Book.save_as.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Book.save_to_database.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Book.save_to_django_models.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Book.save_to_memory.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Book.sheet_names.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Book.stream.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Book.tsv.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Book.tsvz.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Book.url.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Book.xls.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Book.xlsm.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Book.xlsx.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.__getitem__.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.array.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.cell_value.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.colnames.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.column_at.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.column_range.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.content.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.csv.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.csvz.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.cut.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.delete_columns.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.delete_named_column_at.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.delete_named_row_at.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.delete_rows.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.dict.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.extend_columns.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.extend_rows.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.filter.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.format.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.map.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.name_columns_by_row.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.name_rows_by_column.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.named_column_at.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.named_row_at.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.number_of_columns.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.number_of_rows.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.ods.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.paste.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.project.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.records.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.region.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.row_at.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.row_range.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.rownames.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.save_as.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.save_to_database.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.save_to_django_model.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.save_to_memory.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.set_column_at.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.set_named_column_at.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.set_named_row_at.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.set_row_at.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.stream.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.transpose.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.tsv.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.tsvz.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.url.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.xls.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.xlsm.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.xlsx.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.extract_a_sheet_from_a_book.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.free_resources.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.get_array.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.get_book.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.get_book_dict.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.get_dict.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.get_records.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.get_sheet.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.iget_array.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.iget_book.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.iget_records.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.isave_as.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.isave_book_as.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.merge_all_to_a_book.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.merge_csv_to_a_book.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.save_as.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.save_book_as.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/generated/pyexcel.split_a_book.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/guide.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/iapi/pyexcel.internal.generators.BookStream.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/iapi/pyexcel.internal.generators.SheetStream.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/iapi/pyexcel.internal.sheets.Column.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/iapi/pyexcel.internal.sheets.Matrix.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/iapi/pyexcel.internal.sheets.Row.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/iapi.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/index.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/logging.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/migration_guide.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/note_on_pypy.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/plugin_howto.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/pyinstaller.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/renderers.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/sheet.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/showcases/db_injection.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/spelling_wordlist.txt +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/tutorial.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/tutorial02.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/tutorial03.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/tutorial04.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/tutorial05.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/tutorial06.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/tutorial_data_conversion.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/tutorial_file.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/uml/architecture.uml +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/docs/source/webdev.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/examples/README.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/examples/basics/convert_xls_to_xlsx.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/examples/basics/example.csv +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/examples/basics/example.xls +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/examples/basics/example.xlsm +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/examples/basics/example.xlsx +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/examples/basics/example_series.xls +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/examples/basics/example_series_filter.xls +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/examples/basics/jsonify.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/examples/basics/multiple-sheets-example.xls +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/examples/basics/multiple-sheets.xls +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/examples/basics/multiple-sheets.xlsx +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/examples/basics/read_cell_by_cell.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/examples/basics/read_column_by_column.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/examples/basics/read_excel_book.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/examples/basics/read_row_by_row.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/examples/basics/series.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/examples/basics/write_excel_book.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/examples/cookbook/merge_sheets.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/examples/cookbook/scattered-csv-files/1.csv +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/examples/cookbook/scattered-csv-files/2.csv +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/examples/cookbook/scattered-csv-files/3.csv +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/examples/database/import_xls_into_database_via_sqlalchemy.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/examples/formatting/formatter01.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/examples/formatting/formatter02.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/examples/formatting/tutorial_datatype_01.xls +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/examples/formatting/tutorial_datatype_02.xls +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/examples/memoryfile/README.rst +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/examples/memoryfile/pyexcel_server.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/examples/memoryfile/templates/upload.html +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/examples/simple/multiple-sheets.xls +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/__init__.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/constants.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/cookbook.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/deprecated.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/docstrings/__init__.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/docstrings/core.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/docstrings/garbagecollector.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/docstrings/keywords.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/docstrings/meta.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/exceptions.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/internal/__init__.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/internal/attributes.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/internal/common.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/internal/garbagecollector.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/internal/generators.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/internal/sheets/__init__.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/internal/sheets/column.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/internal/sheets/row.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/internal/source_plugin.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/internal/utils.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/parser.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/plugins/__init__.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/plugins/parsers/__init__.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/plugins/parsers/django.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/plugins/parsers/excel.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/plugins/parsers/sqlalchemy.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/plugins/renderers/__init__.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/plugins/renderers/_texttable.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/plugins/renderers/django.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/plugins/renderers/excel.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/plugins/renderers/sqlalchemy.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/plugins/sources/__init__.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/plugins/sources/django.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/plugins/sources/file_input.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/plugins/sources/file_output.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/plugins/sources/memory_input.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/plugins/sources/output_to_memory.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/plugins/sources/params.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/plugins/sources/pydata/__init__.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/plugins/sources/pydata/arraysource.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/plugins/sources/pydata/dictsource.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/plugins/sources/pydata/records.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/plugins/sources/querysets.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/plugins/sources/sheet_stream_source.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/plugins/sources/sqlalchemy.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/renderer.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel/source.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel.egg-info/SOURCES.txt +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel.egg-info/dependency_links.txt +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel.egg-info/not-zip-safe +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel.egg-info/requires.txt +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/pyexcel.egg-info/top_level.txt +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/setup.cfg +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/__init__.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/base.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/db.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/fixtures/bug_01.csv +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/fixtures/bug_176.xlsx +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/fixtures/date_field.xls +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/fixtures/empty.csv +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/fixtures/file_with_an_empty_sheet.xlsx +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/fixtures/force_type.txt +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/fixtures/issue_241/1.csv +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/fixtures/issue_241/2.csv +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/fixtures/non-uniform-rows.csv +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/fixtures/ods_formats.ods +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/fixtures/test-multiple.csvz +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/fixtures/test-single.csvz +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/fixtures/test_cook_book_merge_alphabets.csv +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/fixtures/test_cook_book_merge_alphabets_2.csv +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/fixtures/test_cook_book_merge_numbers.csv +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/fixtures/test_cook_book_merge_numbers_2.csv +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/requirements.txt +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/test_book.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/test_book_stream.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/test_bug_fixes.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/test_cookbook.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/test_django_related_functions.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/test_exploitation.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/test_file_type_as_attribute.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/test_fileio.py +1 -1
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/test_formatters.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/test_gabagecollector.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/test_iterator.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/test_multiple_sheets.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/test_parser.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/test_pathlib_path.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/test_presentation.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/test_pyexcel_list.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/test_reader.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/test_renderer.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/test_sheet.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/test_sheet_access.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/test_sheet_attributes.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/test_sheet_column.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/test_sheet_row.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/test_sheet_stream.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/test_sheet_update.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/test_sheets.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/test_sources.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/test_sql.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/test_stringio.py +0 -0
- {pyexcel-0.7.3 → pyexcel-0.7.4}/tests/test_utils.py +0 -0
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
Change log
|
|
2
2
|
================================================================================
|
|
3
3
|
|
|
4
|
+
0.7.4 - 25.10.2025
|
|
5
|
+
--------------------------------------------------------------------------------
|
|
6
|
+
|
|
7
|
+
**Fixed**
|
|
8
|
+
|
|
9
|
+
#. `#257 <https://github.com/pyexcel/pyexcel/issues/257>`_: provide meaningful
|
|
10
|
+
error messages where dest_* params are missing in save_as and isave_as
|
|
11
|
+
|
|
4
12
|
0.7.3 - 12.04.2025
|
|
5
13
|
--------------------------------------------------------------------------------
|
|
6
14
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pyexcel
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.4
|
|
4
4
|
Summary: A wrapper library that provides one API to read, manipulate and writedata in different excel formats
|
|
5
5
|
Home-page: https://github.com/pyexcel/pyexcel
|
|
6
|
-
Download-URL: https://github.com/pyexcel/pyexcel/archive/0.7.
|
|
6
|
+
Download-URL: https://github.com/pyexcel/pyexcel/archive/0.7.4.tar.gz
|
|
7
7
|
Author: C.W.
|
|
8
8
|
Author-email: info@pyexcel.org
|
|
9
9
|
License: New BSD
|
|
@@ -427,23 +427,26 @@ Suppose you want to save the below dictionary to an excel file :
|
|
|
427
427
|
.. code-block:: python
|
|
428
428
|
|
|
429
429
|
>>> a_dictionary_of_two_dimensional_arrays = {
|
|
430
|
-
... '
|
|
430
|
+
... 'Top 3 Aircraft Manufacturers':
|
|
431
431
|
... [
|
|
432
|
-
... [
|
|
433
|
-
... [
|
|
434
|
-
... [
|
|
432
|
+
... ['Name', 'Revenue'],
|
|
433
|
+
... ['Lockheed Martin', '65.4 billion USD'],
|
|
434
|
+
... ['Airbus', '78.9 billion USD'],
|
|
435
|
+
... ['Boeing', '58.16 billion USD']
|
|
435
436
|
... ],
|
|
436
|
-
... '
|
|
437
|
+
... 'Top 3 Airlines':
|
|
437
438
|
... [
|
|
438
|
-
... ['
|
|
439
|
-
... [
|
|
440
|
-
... [
|
|
439
|
+
... ['Name', 'Country', 'Revenue'],
|
|
440
|
+
... ['Delta Air Lines', 'US', 61.6],
|
|
441
|
+
... ['American Airlines Holdings', 'US', 57.1],
|
|
442
|
+
... ['American Airlines Group', 'US', 54.2]
|
|
441
443
|
... ],
|
|
442
|
-
... '
|
|
444
|
+
... 'Biggest 3 Airoplanes':
|
|
443
445
|
... [
|
|
444
|
-
... ['
|
|
445
|
-
... [
|
|
446
|
-
... [
|
|
446
|
+
... ['Model', 'Passenger limt'],
|
|
447
|
+
... ['Airbus A380-800', 853],
|
|
448
|
+
... ['Boeing 747-400', 660],
|
|
449
|
+
... ['Boeing 747-8', 605]
|
|
447
450
|
... ]
|
|
448
451
|
... }
|
|
449
452
|
|
|
@@ -462,9 +465,9 @@ pass on an ordered dictionary to the function itself. For example:
|
|
|
462
465
|
.. code-block:: python
|
|
463
466
|
|
|
464
467
|
>>> data = OrderedDict()
|
|
465
|
-
>>> data.update({"Sheet 2": a_dictionary_of_two_dimensional_arrays['
|
|
466
|
-
>>> data.update({"Sheet 1": a_dictionary_of_two_dimensional_arrays['
|
|
467
|
-
>>> data.update({"Sheet 3": a_dictionary_of_two_dimensional_arrays['
|
|
468
|
+
>>> data.update({"Sheet 2": a_dictionary_of_two_dimensional_arrays['Top 3 Airlines']})
|
|
469
|
+
>>> data.update({"Sheet 1": a_dictionary_of_two_dimensional_arrays['Top 3 Aircraft Manufacturers']})
|
|
470
|
+
>>> data.update({"Sheet 3": a_dictionary_of_two_dimensional_arrays['Biggest 3 Airoplanes']})
|
|
468
471
|
>>> p.save_book_as(bookdict=data, dest_file_name="book.xls")
|
|
469
472
|
|
|
470
473
|
Let's verify its order:
|
|
@@ -474,9 +477,9 @@ Let's verify its order:
|
|
|
474
477
|
>>> book_dict = p.get_book_dict(file_name="book.xls")
|
|
475
478
|
>>> for key, item in book_dict.items():
|
|
476
479
|
... print(json.dumps({key: item}))
|
|
477
|
-
{"Sheet 2": [["
|
|
478
|
-
{"Sheet 1": [[
|
|
479
|
-
{"Sheet 3": [["
|
|
480
|
+
{"Sheet 2": [["Name", "Country", "Revenue"], ["Delta Air Lines", "US", 61.6], ["American Airlines Holdings", "US", 57.1], ["American Airlines Group", "US", 54.2]]}
|
|
481
|
+
{"Sheet 1": [["Name", "Revenue"], ["Lockheed Martin", "65.4 billion USD"], ["Airbus", "78.9 billion USD"], ["Boeing", "58.16 billion USD"]]}
|
|
482
|
+
{"Sheet 3": [["Model", "Passenger limt"], ["Airbus A380-800", 853], ["Boeing 747-400", 660], ["Boeing 747-8", 605]]}
|
|
480
483
|
|
|
481
484
|
Please notice that "Sheet 2" is the first item in the *book_dict*, meaning the order of sheets are preserved.
|
|
482
485
|
|
|
@@ -487,29 +490,32 @@ Transcoding
|
|
|
487
490
|
.. note::
|
|
488
491
|
|
|
489
492
|
Please note that `pyexcel-cli` can perform file transcoding at command line.
|
|
490
|
-
No need to open your editor, save the
|
|
493
|
+
No need to open your editor, save the code, then python run.
|
|
491
494
|
|
|
492
495
|
|
|
493
496
|
The following code does a simple file format transcoding from xls to csv:
|
|
494
497
|
|
|
495
498
|
.. code-block:: python
|
|
496
499
|
|
|
497
|
-
>>> p.save_as(file_name="
|
|
500
|
+
>>> p.save_as(file_name="trump_tariffs.xls", dest_file_name="trump_tariffs.csv")
|
|
498
501
|
|
|
499
502
|
Again it is really simple. Let's verify what we have gotten:
|
|
500
503
|
|
|
501
504
|
.. code-block:: python
|
|
502
505
|
|
|
503
|
-
>>> sheet = p.get_sheet(file_name="
|
|
506
|
+
>>> sheet = p.get_sheet(file_name="trump_tariffs.csv")
|
|
504
507
|
>>> sheet
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
|
508
|
-
|
|
509
|
-
|
|
|
510
|
-
|
|
511
|
-
|
|
|
512
|
-
|
|
508
|
+
trump_tariffs.csv:
|
|
509
|
+
+----------------+-------------------+----------------------------+
|
|
510
|
+
| Country | New US tariffs, % | Tariffs charged to the USA |
|
|
511
|
+
+----------------+-------------------+----------------------------+
|
|
512
|
+
| China | 34 | 67 |
|
|
513
|
+
+----------------+-------------------+----------------------------+
|
|
514
|
+
| EU | 20 | 39 |
|
|
515
|
+
+----------------+-------------------+----------------------------+
|
|
516
|
+
| United Kingdom | 10 | 10 |
|
|
517
|
+
+----------------+-------------------+----------------------------+
|
|
518
|
+
|
|
513
519
|
|
|
514
520
|
.. NOTE::
|
|
515
521
|
|
|
@@ -520,23 +526,25 @@ Let use previous example and save it as xlsx instead
|
|
|
520
526
|
|
|
521
527
|
.. code-block:: python
|
|
522
528
|
|
|
523
|
-
>>> p.save_as(file_name="
|
|
524
|
-
... dest_file_name="
|
|
529
|
+
>>> p.save_as(file_name="trump_tariffs.xls",
|
|
530
|
+
... dest_file_name="trump_tariffs.xlsx") # change the file extension
|
|
525
531
|
|
|
526
532
|
Again let's verify what we have gotten:
|
|
527
533
|
|
|
528
534
|
.. code-block:: python
|
|
529
535
|
|
|
530
|
-
>>> sheet = p.get_sheet(file_name="
|
|
536
|
+
>>> sheet = p.get_sheet(file_name="trump_tariffs.xlsx")
|
|
531
537
|
>>> sheet
|
|
532
538
|
pyexcel_sheet1:
|
|
533
|
-
|
|
534
|
-
|
|
|
535
|
-
|
|
536
|
-
|
|
|
537
|
-
|
|
538
|
-
|
|
|
539
|
-
|
|
539
|
+
+----------------+-------------------+----------------------------+
|
|
540
|
+
| Country | New US tariffs, % | Tariffs charged to the USA |
|
|
541
|
+
+----------------+-------------------+----------------------------+
|
|
542
|
+
| China | 34 | 67 |
|
|
543
|
+
+----------------+-------------------+----------------------------+
|
|
544
|
+
| EU | 20 | 39 |
|
|
545
|
+
+----------------+-------------------+----------------------------+
|
|
546
|
+
| United Kingdom | 10 | 10 |
|
|
547
|
+
+----------------+-------------------+----------------------------+
|
|
540
548
|
|
|
541
549
|
|
|
542
550
|
Excel book merge and split operation in one line
|
|
@@ -824,7 +832,7 @@ And let's check what do we have:
|
|
|
824
832
|
grande(16 oz.) of Starbucks Coffee Pike Place Roast has 310 mg
|
|
825
833
|
regular(16 oz.) of Panera Coffee Light Roast has 300 mg
|
|
826
834
|
|
|
827
|
-
Please do not
|
|
835
|
+
Please do not forget the second line to close the opened file handle:
|
|
828
836
|
|
|
829
837
|
.. code-block:: python
|
|
830
838
|
|
|
@@ -844,7 +852,7 @@ Instead, what if you have to use `pyexcel.get_array` to do the same:
|
|
|
844
852
|
grande(16 oz.) of Starbucks Coffee Pike Place Roast has 310 mg
|
|
845
853
|
regular(16 oz.) of Panera Coffee Light Roast has 300 mg
|
|
846
854
|
|
|
847
|
-
Again, do not
|
|
855
|
+
Again, do not forget the second line:
|
|
848
856
|
|
|
849
857
|
.. code-block:: python
|
|
850
858
|
|
|
@@ -920,7 +928,8 @@ Export a list of dictionaries
|
|
|
920
928
|
>>> records = [
|
|
921
929
|
... {"year": 1903, "country": "Germany", "speed": "206.7km/h"},
|
|
922
930
|
... {"year": 1964, "country": "Japan", "speed": "210km/h"},
|
|
923
|
-
... {"year": 2008, "country": "China", "speed": "350km/h"}
|
|
931
|
+
... {"year": 2008, "country": "China", "speed": "350km/h"},
|
|
932
|
+
... {"year": 2025, "country": "China", "speed": "400km/h"}
|
|
924
933
|
... ]
|
|
925
934
|
>>> p.isave_as(records=records, dest_file_name='high_speed_rail.xls')
|
|
926
935
|
|
|
@@ -1244,6 +1253,14 @@ In alphabetical order:
|
|
|
1244
1253
|
Change log
|
|
1245
1254
|
================================================================================
|
|
1246
1255
|
|
|
1256
|
+
0.7.4 - 25.10.2025
|
|
1257
|
+
--------------------------------------------------------------------------------
|
|
1258
|
+
|
|
1259
|
+
**Fixed**
|
|
1260
|
+
|
|
1261
|
+
#. `#257 <https://github.com/pyexcel/pyexcel/issues/257>`_: provide meaningful
|
|
1262
|
+
error messages where dest_* params are missing in save_as and isave_as
|
|
1263
|
+
|
|
1247
1264
|
0.7.3 - 12.04.2025
|
|
1248
1265
|
--------------------------------------------------------------------------------
|
|
1249
1266
|
|
|
@@ -384,23 +384,26 @@ Suppose you want to save the below dictionary to an excel file :
|
|
|
384
384
|
.. code-block:: python
|
|
385
385
|
|
|
386
386
|
>>> a_dictionary_of_two_dimensional_arrays = {
|
|
387
|
-
... '
|
|
387
|
+
... 'Top 3 Aircraft Manufacturers':
|
|
388
388
|
... [
|
|
389
|
-
... [
|
|
390
|
-
... [
|
|
391
|
-
... [
|
|
389
|
+
... ['Name', 'Revenue'],
|
|
390
|
+
... ['Lockheed Martin', '65.4 billion USD'],
|
|
391
|
+
... ['Airbus', '78.9 billion USD'],
|
|
392
|
+
... ['Boeing', '58.16 billion USD']
|
|
392
393
|
... ],
|
|
393
|
-
... '
|
|
394
|
+
... 'Top 3 Airlines':
|
|
394
395
|
... [
|
|
395
|
-
... ['
|
|
396
|
-
... [
|
|
397
|
-
... [
|
|
396
|
+
... ['Name', 'Country', 'Revenue'],
|
|
397
|
+
... ['Delta Air Lines', 'US', 61.6],
|
|
398
|
+
... ['American Airlines Holdings', 'US', 57.1],
|
|
399
|
+
... ['American Airlines Group', 'US', 54.2]
|
|
398
400
|
... ],
|
|
399
|
-
... '
|
|
401
|
+
... 'Biggest 3 Airoplanes':
|
|
400
402
|
... [
|
|
401
|
-
... ['
|
|
402
|
-
... [
|
|
403
|
-
... [
|
|
403
|
+
... ['Model', 'Passenger limt'],
|
|
404
|
+
... ['Airbus A380-800', 853],
|
|
405
|
+
... ['Boeing 747-400', 660],
|
|
406
|
+
... ['Boeing 747-8', 605]
|
|
404
407
|
... ]
|
|
405
408
|
... }
|
|
406
409
|
|
|
@@ -419,9 +422,9 @@ pass on an ordered dictionary to the function itself. For example:
|
|
|
419
422
|
.. code-block:: python
|
|
420
423
|
|
|
421
424
|
>>> data = OrderedDict()
|
|
422
|
-
>>> data.update({"Sheet 2": a_dictionary_of_two_dimensional_arrays['
|
|
423
|
-
>>> data.update({"Sheet 1": a_dictionary_of_two_dimensional_arrays['
|
|
424
|
-
>>> data.update({"Sheet 3": a_dictionary_of_two_dimensional_arrays['
|
|
425
|
+
>>> data.update({"Sheet 2": a_dictionary_of_two_dimensional_arrays['Top 3 Airlines']})
|
|
426
|
+
>>> data.update({"Sheet 1": a_dictionary_of_two_dimensional_arrays['Top 3 Aircraft Manufacturers']})
|
|
427
|
+
>>> data.update({"Sheet 3": a_dictionary_of_two_dimensional_arrays['Biggest 3 Airoplanes']})
|
|
425
428
|
>>> p.save_book_as(bookdict=data, dest_file_name="book.xls")
|
|
426
429
|
|
|
427
430
|
Let's verify its order:
|
|
@@ -431,9 +434,9 @@ Let's verify its order:
|
|
|
431
434
|
>>> book_dict = p.get_book_dict(file_name="book.xls")
|
|
432
435
|
>>> for key, item in book_dict.items():
|
|
433
436
|
... print(json.dumps({key: item}))
|
|
434
|
-
{"Sheet 2": [["
|
|
435
|
-
{"Sheet 1": [[
|
|
436
|
-
{"Sheet 3": [["
|
|
437
|
+
{"Sheet 2": [["Name", "Country", "Revenue"], ["Delta Air Lines", "US", 61.6], ["American Airlines Holdings", "US", 57.1], ["American Airlines Group", "US", 54.2]]}
|
|
438
|
+
{"Sheet 1": [["Name", "Revenue"], ["Lockheed Martin", "65.4 billion USD"], ["Airbus", "78.9 billion USD"], ["Boeing", "58.16 billion USD"]]}
|
|
439
|
+
{"Sheet 3": [["Model", "Passenger limt"], ["Airbus A380-800", 853], ["Boeing 747-400", 660], ["Boeing 747-8", 605]]}
|
|
437
440
|
|
|
438
441
|
Please notice that "Sheet 2" is the first item in the *book_dict*, meaning the order of sheets are preserved.
|
|
439
442
|
|
|
@@ -444,29 +447,32 @@ Transcoding
|
|
|
444
447
|
.. note::
|
|
445
448
|
|
|
446
449
|
Please note that `pyexcel-cli` can perform file transcoding at command line.
|
|
447
|
-
No need to open your editor, save the
|
|
450
|
+
No need to open your editor, save the code, then python run.
|
|
448
451
|
|
|
449
452
|
|
|
450
453
|
The following code does a simple file format transcoding from xls to csv:
|
|
451
454
|
|
|
452
455
|
.. code-block:: python
|
|
453
456
|
|
|
454
|
-
>>> p.save_as(file_name="
|
|
457
|
+
>>> p.save_as(file_name="trump_tariffs.xls", dest_file_name="trump_tariffs.csv")
|
|
455
458
|
|
|
456
459
|
Again it is really simple. Let's verify what we have gotten:
|
|
457
460
|
|
|
458
461
|
.. code-block:: python
|
|
459
462
|
|
|
460
|
-
>>> sheet = p.get_sheet(file_name="
|
|
463
|
+
>>> sheet = p.get_sheet(file_name="trump_tariffs.csv")
|
|
461
464
|
>>> sheet
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
|
465
|
-
|
|
466
|
-
|
|
|
467
|
-
|
|
468
|
-
|
|
|
469
|
-
|
|
465
|
+
trump_tariffs.csv:
|
|
466
|
+
+----------------+-------------------+----------------------------+
|
|
467
|
+
| Country | New US tariffs, % | Tariffs charged to the USA |
|
|
468
|
+
+----------------+-------------------+----------------------------+
|
|
469
|
+
| China | 34 | 67 |
|
|
470
|
+
+----------------+-------------------+----------------------------+
|
|
471
|
+
| EU | 20 | 39 |
|
|
472
|
+
+----------------+-------------------+----------------------------+
|
|
473
|
+
| United Kingdom | 10 | 10 |
|
|
474
|
+
+----------------+-------------------+----------------------------+
|
|
475
|
+
|
|
470
476
|
|
|
471
477
|
.. NOTE::
|
|
472
478
|
|
|
@@ -477,23 +483,25 @@ Let use previous example and save it as xlsx instead
|
|
|
477
483
|
|
|
478
484
|
.. code-block:: python
|
|
479
485
|
|
|
480
|
-
>>> p.save_as(file_name="
|
|
481
|
-
... dest_file_name="
|
|
486
|
+
>>> p.save_as(file_name="trump_tariffs.xls",
|
|
487
|
+
... dest_file_name="trump_tariffs.xlsx") # change the file extension
|
|
482
488
|
|
|
483
489
|
Again let's verify what we have gotten:
|
|
484
490
|
|
|
485
491
|
.. code-block:: python
|
|
486
492
|
|
|
487
|
-
>>> sheet = p.get_sheet(file_name="
|
|
493
|
+
>>> sheet = p.get_sheet(file_name="trump_tariffs.xlsx")
|
|
488
494
|
>>> sheet
|
|
489
495
|
pyexcel_sheet1:
|
|
490
|
-
|
|
491
|
-
|
|
|
492
|
-
|
|
493
|
-
|
|
|
494
|
-
|
|
495
|
-
|
|
|
496
|
-
|
|
496
|
+
+----------------+-------------------+----------------------------+
|
|
497
|
+
| Country | New US tariffs, % | Tariffs charged to the USA |
|
|
498
|
+
+----------------+-------------------+----------------------------+
|
|
499
|
+
| China | 34 | 67 |
|
|
500
|
+
+----------------+-------------------+----------------------------+
|
|
501
|
+
| EU | 20 | 39 |
|
|
502
|
+
+----------------+-------------------+----------------------------+
|
|
503
|
+
| United Kingdom | 10 | 10 |
|
|
504
|
+
+----------------+-------------------+----------------------------+
|
|
497
505
|
|
|
498
506
|
|
|
499
507
|
Excel book merge and split operation in one line
|
|
@@ -781,7 +789,7 @@ And let's check what do we have:
|
|
|
781
789
|
grande(16 oz.) of Starbucks Coffee Pike Place Roast has 310 mg
|
|
782
790
|
regular(16 oz.) of Panera Coffee Light Roast has 300 mg
|
|
783
791
|
|
|
784
|
-
Please do not
|
|
792
|
+
Please do not forget the second line to close the opened file handle:
|
|
785
793
|
|
|
786
794
|
.. code-block:: python
|
|
787
795
|
|
|
@@ -801,7 +809,7 @@ Instead, what if you have to use `pyexcel.get_array` to do the same:
|
|
|
801
809
|
grande(16 oz.) of Starbucks Coffee Pike Place Roast has 310 mg
|
|
802
810
|
regular(16 oz.) of Panera Coffee Light Roast has 300 mg
|
|
803
811
|
|
|
804
|
-
Again, do not
|
|
812
|
+
Again, do not forget the second line:
|
|
805
813
|
|
|
806
814
|
.. code-block:: python
|
|
807
815
|
|
|
@@ -877,7 +885,8 @@ Export a list of dictionaries
|
|
|
877
885
|
>>> records = [
|
|
878
886
|
... {"year": 1903, "country": "Germany", "speed": "206.7km/h"},
|
|
879
887
|
... {"year": 1964, "country": "Japan", "speed": "210km/h"},
|
|
880
|
-
... {"year": 2008, "country": "China", "speed": "350km/h"}
|
|
888
|
+
... {"year": 2008, "country": "China", "speed": "350km/h"},
|
|
889
|
+
... {"year": 2025, "country": "China", "speed": "400km/h"}
|
|
881
890
|
... ]
|
|
882
891
|
>>> p.isave_as(records=records, dest_file_name='high_speed_rail.xls')
|
|
883
892
|
|
|
@@ -26,9 +26,9 @@ project = 'pyexcel'
|
|
|
26
26
|
copyright = '2014-2025 Onni Software Ltd.'
|
|
27
27
|
author = 'C.W.'
|
|
28
28
|
# The short X.Y version
|
|
29
|
-
version = '0.7.
|
|
29
|
+
version = '0.7.4'
|
|
30
30
|
# The full version, including alpha/beta/rc tags
|
|
31
|
-
release = '0.7.
|
|
31
|
+
release = '0.7.4'
|
|
32
32
|
|
|
33
33
|
# -- General configuration ---------------------------------------------------
|
|
34
34
|
|
|
@@ -327,23 +327,26 @@ Suppose you want to save the below dictionary to an excel file :
|
|
|
327
327
|
.. code-block:: python
|
|
328
328
|
|
|
329
329
|
>>> a_dictionary_of_two_dimensional_arrays = {
|
|
330
|
-
... '
|
|
330
|
+
... 'Top 3 Aircraft Manufacturers':
|
|
331
331
|
... [
|
|
332
|
-
... [
|
|
333
|
-
... [
|
|
334
|
-
... [
|
|
332
|
+
... ['Name', 'Revenue'],
|
|
333
|
+
... ['Lockheed Martin', '65.4 billion USD'],
|
|
334
|
+
... ['Airbus', '78.9 billion USD'],
|
|
335
|
+
... ['Boeing', '58.16 billion USD']
|
|
335
336
|
... ],
|
|
336
|
-
... '
|
|
337
|
+
... 'Top 3 Airlines':
|
|
337
338
|
... [
|
|
338
|
-
... ['
|
|
339
|
-
... [
|
|
340
|
-
... [
|
|
339
|
+
... ['Name', 'Country', 'Revenue'],
|
|
340
|
+
... ['Delta Air Lines', 'US', 61.6],
|
|
341
|
+
... ['American Airlines Holdings', 'US', 57.1],
|
|
342
|
+
... ['American Airlines Group', 'US', 54.2]
|
|
341
343
|
... ],
|
|
342
|
-
... '
|
|
344
|
+
... 'Biggest 3 Airoplanes':
|
|
343
345
|
... [
|
|
344
|
-
... ['
|
|
345
|
-
... [
|
|
346
|
-
... [
|
|
346
|
+
... ['Model', 'Passenger limt'],
|
|
347
|
+
... ['Airbus A380-800', 853],
|
|
348
|
+
... ['Boeing 747-400', 660],
|
|
349
|
+
... ['Boeing 747-8', 605]
|
|
347
350
|
... ]
|
|
348
351
|
... }
|
|
349
352
|
|
|
@@ -362,9 +365,9 @@ pass on an ordered dictionary to the function itself. For example:
|
|
|
362
365
|
.. code-block:: python
|
|
363
366
|
|
|
364
367
|
>>> data = OrderedDict()
|
|
365
|
-
>>> data.update({"Sheet 2": a_dictionary_of_two_dimensional_arrays['
|
|
366
|
-
>>> data.update({"Sheet 1": a_dictionary_of_two_dimensional_arrays['
|
|
367
|
-
>>> data.update({"Sheet 3": a_dictionary_of_two_dimensional_arrays['
|
|
368
|
+
>>> data.update({"Sheet 2": a_dictionary_of_two_dimensional_arrays['Top 3 Airlines']})
|
|
369
|
+
>>> data.update({"Sheet 1": a_dictionary_of_two_dimensional_arrays['Top 3 Aircraft Manufacturers']})
|
|
370
|
+
>>> data.update({"Sheet 3": a_dictionary_of_two_dimensional_arrays['Biggest 3 Airoplanes']})
|
|
368
371
|
>>> p.save_book_as(bookdict=data, dest_file_name="book.xls")
|
|
369
372
|
|
|
370
373
|
Let's verify its order:
|
|
@@ -374,9 +377,9 @@ Let's verify its order:
|
|
|
374
377
|
>>> book_dict = p.get_book_dict(file_name="book.xls")
|
|
375
378
|
>>> for key, item in book_dict.items():
|
|
376
379
|
... print(json.dumps({key: item}))
|
|
377
|
-
{"Sheet 2": [["
|
|
378
|
-
{"Sheet 1": [[
|
|
379
|
-
{"Sheet 3": [["
|
|
380
|
+
{"Sheet 2": [["Name", "Country", "Revenue"], ["Delta Air Lines", "US", 61.6], ["American Airlines Holdings", "US", 57.1], ["American Airlines Group", "US", 54.2]]}
|
|
381
|
+
{"Sheet 1": [["Name", "Revenue"], ["Lockheed Martin", "65.4 billion USD"], ["Airbus", "78.9 billion USD"], ["Boeing", "58.16 billion USD"]]}
|
|
382
|
+
{"Sheet 3": [["Model", "Passenger limt"], ["Airbus A380-800", 853], ["Boeing 747-400", 660], ["Boeing 747-8", 605]]}
|
|
380
383
|
|
|
381
384
|
Please notice that "Sheet 2" is the first item in the *book_dict*, meaning the order of sheets are preserved.
|
|
382
385
|
|
|
@@ -387,40 +390,44 @@ Transcoding
|
|
|
387
390
|
.. note::
|
|
388
391
|
|
|
389
392
|
Please note that `pyexcel-cli` can perform file transcoding at command line.
|
|
390
|
-
No need to open your editor, save the
|
|
393
|
+
No need to open your editor, save the code, then python run.
|
|
391
394
|
|
|
392
395
|
.. testcode::
|
|
393
396
|
:hide:
|
|
394
397
|
|
|
395
398
|
>>> import datetime
|
|
396
399
|
>>> data = [
|
|
397
|
-
... ["
|
|
398
|
-
... ["
|
|
399
|
-
... ["
|
|
400
|
+
... ["Country", "New US tariffs, %", "Tariffs charged to the USA"],
|
|
401
|
+
... ["China", 34, 67],
|
|
402
|
+
... ["EU", 20, 39],
|
|
403
|
+
... ["United Kingdom", 10, 10]
|
|
400
404
|
... ]
|
|
401
|
-
>>> p.save_as(array=data, dest_file_name="
|
|
405
|
+
>>> p.save_as(array=data, dest_file_name="trump_tariffs.xls")
|
|
402
406
|
|
|
403
407
|
|
|
404
408
|
The following code does a simple file format transcoding from xls to csv:
|
|
405
409
|
|
|
406
410
|
.. code-block:: python
|
|
407
411
|
|
|
408
|
-
>>> p.save_as(file_name="
|
|
412
|
+
>>> p.save_as(file_name="trump_tariffs.xls", dest_file_name="trump_tariffs.csv")
|
|
409
413
|
|
|
410
414
|
Again it is really simple. Let's verify what we have gotten:
|
|
411
415
|
|
|
412
416
|
.. code-block:: python
|
|
413
417
|
|
|
414
|
-
>>> sheet = p.get_sheet(file_name="
|
|
418
|
+
>>> sheet = p.get_sheet(file_name="trump_tariffs.csv")
|
|
415
419
|
>>> sheet
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
|
419
|
-
|
|
420
|
-
|
|
|
421
|
-
|
|
422
|
-
|
|
|
423
|
-
|
|
420
|
+
trump_tariffs.csv:
|
|
421
|
+
+----------------+-------------------+----------------------------+
|
|
422
|
+
| Country | New US tariffs, % | Tariffs charged to the USA |
|
|
423
|
+
+----------------+-------------------+----------------------------+
|
|
424
|
+
| China | 34 | 67 |
|
|
425
|
+
+----------------+-------------------+----------------------------+
|
|
426
|
+
| EU | 20 | 39 |
|
|
427
|
+
+----------------+-------------------+----------------------------+
|
|
428
|
+
| United Kingdom | 10 | 10 |
|
|
429
|
+
+----------------+-------------------+----------------------------+
|
|
430
|
+
|
|
424
431
|
|
|
425
432
|
.. NOTE::
|
|
426
433
|
|
|
@@ -431,23 +438,25 @@ Let use previous example and save it as xlsx instead
|
|
|
431
438
|
|
|
432
439
|
.. code-block:: python
|
|
433
440
|
|
|
434
|
-
>>> p.save_as(file_name="
|
|
435
|
-
... dest_file_name="
|
|
441
|
+
>>> p.save_as(file_name="trump_tariffs.xls",
|
|
442
|
+
... dest_file_name="trump_tariffs.xlsx") # change the file extension
|
|
436
443
|
|
|
437
444
|
Again let's verify what we have gotten:
|
|
438
445
|
|
|
439
446
|
.. code-block:: python
|
|
440
447
|
|
|
441
|
-
>>> sheet = p.get_sheet(file_name="
|
|
448
|
+
>>> sheet = p.get_sheet(file_name="trump_tariffs.xlsx")
|
|
442
449
|
>>> sheet
|
|
443
450
|
pyexcel_sheet1:
|
|
444
|
-
|
|
445
|
-
|
|
|
446
|
-
|
|
447
|
-
|
|
|
448
|
-
|
|
449
|
-
|
|
|
450
|
-
|
|
451
|
+
+----------------+-------------------+----------------------------+
|
|
452
|
+
| Country | New US tariffs, % | Tariffs charged to the USA |
|
|
453
|
+
+----------------+-------------------+----------------------------+
|
|
454
|
+
| China | 34 | 67 |
|
|
455
|
+
+----------------+-------------------+----------------------------+
|
|
456
|
+
| EU | 20 | 39 |
|
|
457
|
+
+----------------+-------------------+----------------------------+
|
|
458
|
+
| United Kingdom | 10 | 10 |
|
|
459
|
+
+----------------+-------------------+----------------------------+
|
|
451
460
|
|
|
452
461
|
|
|
453
462
|
Excel book merge and split operation in one line
|
|
@@ -550,12 +559,12 @@ for the output file, you can specify any of the supported formats
|
|
|
550
559
|
.. testcode::
|
|
551
560
|
:hide:
|
|
552
561
|
|
|
562
|
+
>>> os.unlink("high_speed_rail.xls")
|
|
553
563
|
>>> os.unlink("Sheet 1_output.xls")
|
|
554
564
|
>>> os.unlink("megabook.xls")
|
|
555
|
-
>>> os.unlink('
|
|
556
|
-
>>> os.unlink('
|
|
557
|
-
>>> os.unlink('
|
|
558
|
-
>>> os.unlink('high_speed_rail.xls')
|
|
565
|
+
>>> os.unlink('trump_tariffs.xls')
|
|
566
|
+
>>> os.unlink('trump_tariffs.csv')
|
|
567
|
+
>>> os.unlink('trump_tariffs.xlsx')
|
|
559
568
|
>>> os.unlink('henley.xlsx')
|
|
560
569
|
>>> os.unlink('ccs.csv')
|
|
561
570
|
>>> os.unlink("book.xls")
|
|
@@ -163,10 +163,10 @@ book dict
|
|
|
163
163
|
|
|
164
164
|
>>> from unittest.mock import patch, MagicMock
|
|
165
165
|
>>> import pyexcel as pe
|
|
166
|
-
>>> from pyexcel._compact import StringIO,
|
|
166
|
+
>>> from pyexcel._compact import StringIO, BytesIO
|
|
167
167
|
>>> patcher = patch('pyexcel._compact.request.urlopen')
|
|
168
168
|
>>> urlopen = patcher.start()
|
|
169
|
-
>>> io =
|
|
169
|
+
>>> io = BytesIO("1,2,3".encode('utf-8'))
|
|
170
170
|
>>> x = MagicMock()
|
|
171
171
|
>>> x.type.return_value = "text/csv"
|
|
172
172
|
>>> io.info = x
|
|
@@ -61,7 +61,7 @@ And let's check what do we have:
|
|
|
61
61
|
grande(16 oz.) of Starbucks Coffee Pike Place Roast has 310 mg
|
|
62
62
|
regular(16 oz.) of Panera Coffee Light Roast has 300 mg
|
|
63
63
|
|
|
64
|
-
Please do not
|
|
64
|
+
Please do not forget the second line to close the opened file handle:
|
|
65
65
|
|
|
66
66
|
.. code-block:: python
|
|
67
67
|
|
|
@@ -81,7 +81,7 @@ Instead, what if you have to use `pyexcel.get_array` to do the same:
|
|
|
81
81
|
grande(16 oz.) of Starbucks Coffee Pike Place Roast has 310 mg
|
|
82
82
|
regular(16 oz.) of Panera Coffee Light Roast has 300 mg
|
|
83
83
|
|
|
84
|
-
Again, do not
|
|
84
|
+
Again, do not forget the second line:
|
|
85
85
|
|
|
86
86
|
.. code-block:: python
|
|
87
87
|
|
|
@@ -164,7 +164,8 @@ Export a list of dictionaries
|
|
|
164
164
|
>>> records = [
|
|
165
165
|
... {"year": 1903, "country": "Germany", "speed": "206.7km/h"},
|
|
166
166
|
... {"year": 1964, "country": "Japan", "speed": "210km/h"},
|
|
167
|
-
... {"year": 2008, "country": "China", "speed": "350km/h"}
|
|
167
|
+
... {"year": 2008, "country": "China", "speed": "350km/h"},
|
|
168
|
+
... {"year": 2025, "country": "China", "speed": "400km/h"}
|
|
168
169
|
... ]
|
|
169
170
|
>>> p.isave_as(records=records, dest_file_name='high_speed_rail.xls')
|
|
170
171
|
|