pyexcel 0.7.2__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.
Files changed (308) hide show
  1. {pyexcel-0.7.2 → pyexcel-0.7.4}/CHANGELOG.rst +18 -0
  2. {pyexcel-0.7.2 → pyexcel-0.7.4}/PKG-INFO +71 -44
  3. {pyexcel-0.7.2 → pyexcel-0.7.4}/README.rst +51 -42
  4. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/conf.py +2 -2
  5. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/quickstart.rst +56 -47
  6. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/sources.rst +2 -2
  7. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/two-liners.rst +4 -3
  8. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/__init__.py +12 -10
  9. pyexcel-0.7.4/pyexcel/__version__.py +2 -0
  10. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/_compact.py +16 -15
  11. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/book.py +9 -8
  12. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/constants.py +6 -5
  13. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/cookbook.py +58 -52
  14. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/core.py +17 -5
  15. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/deprecated.py +9 -6
  16. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/docstrings/__init__.py +7 -6
  17. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/docstrings/core.py +6 -5
  18. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/docstrings/keywords.py +6 -5
  19. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/docstrings/meta.py +6 -5
  20. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/exceptions.py +5 -5
  21. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/internal/__init__.py +6 -5
  22. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/internal/attributes.py +6 -5
  23. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/internal/common.py +7 -6
  24. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/internal/core.py +9 -8
  25. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/internal/garbagecollector.py +7 -8
  26. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/internal/generators.py +8 -7
  27. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/internal/meta.py +33 -20
  28. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/internal/plugins.py +6 -8
  29. pyexcel-0.7.4/pyexcel/internal/sheets/__init__.py +12 -0
  30. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/internal/sheets/_shared.py +10 -11
  31. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/internal/sheets/column.py +18 -11
  32. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/internal/sheets/extended_list.py +0 -3
  33. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/internal/sheets/formatters.py +7 -6
  34. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/internal/sheets/matrix.py +47 -47
  35. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/internal/sheets/row.py +6 -5
  36. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/internal/source_plugin.py +27 -11
  37. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/parser.py +7 -6
  38. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/plugins/__init__.py +18 -11
  39. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/plugins/parsers/__init__.py +8 -6
  40. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/plugins/parsers/django.py +14 -7
  41. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/plugins/parsers/excel.py +20 -9
  42. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/plugins/parsers/sqlalchemy.py +14 -7
  43. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/plugins/renderers/__init__.py +8 -6
  44. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/plugins/renderers/_texttable.py +7 -6
  45. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/plugins/renderers/django.py +12 -6
  46. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/plugins/renderers/excel.py +17 -7
  47. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/plugins/renderers/sqlalchemy.py +18 -7
  48. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/plugins/sources/__init__.py +6 -5
  49. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/plugins/sources/db_sources.py +14 -12
  50. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/plugins/sources/django.py +11 -6
  51. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/plugins/sources/file_input.py +8 -6
  52. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/plugins/sources/file_output.py +15 -9
  53. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/plugins/sources/http.py +8 -10
  54. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/plugins/sources/memory_input.py +10 -7
  55. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/plugins/sources/output_to_memory.py +12 -7
  56. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/plugins/sources/params.py +6 -5
  57. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/plugins/sources/pydata/arraysource.py +6 -5
  58. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/plugins/sources/pydata/bookdict.py +8 -8
  59. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/plugins/sources/pydata/common.py +11 -10
  60. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/plugins/sources/pydata/dictsource.py +14 -7
  61. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/plugins/sources/pydata/records.py +6 -5
  62. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/plugins/sources/querysets.py +6 -5
  63. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/plugins/sources/sheet_stream_source.py +6 -5
  64. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/plugins/sources/sqlalchemy.py +12 -6
  65. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/renderer.py +28 -10
  66. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/sheet.py +7 -8
  67. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/source.py +8 -7
  68. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel.egg-info/PKG-INFO +71 -44
  69. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel.egg-info/SOURCES.txt +1 -0
  70. {pyexcel-0.7.2 → pyexcel-0.7.4}/setup.py +4 -4
  71. pyexcel-0.7.4/tests/_compact.py +4 -0
  72. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/test_bug_fixes.py +5 -2
  73. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/test_cookbook.py +3 -1
  74. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/test_examples.py +19 -23
  75. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/test_exploitation.py +15 -5
  76. pyexcel-0.7.4/tests/test_fileio.py +75 -0
  77. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/test_gabagecollector.py +3 -2
  78. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/test_http_source.py +3 -9
  79. pyexcel-0.7.4/tests/test_internals.py +10 -0
  80. pyexcel-0.7.4/tests/test_pathlib_path.py +29 -0
  81. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/test_reader.py +4 -2
  82. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/test_sheet_stream.py +3 -1
  83. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/test_signature_fuction.py +135 -35
  84. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/test_sources.py +4 -1
  85. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/test_sql.py +6 -2
  86. pyexcel-0.7.2/pyexcel/__version__.py +0 -2
  87. pyexcel-0.7.2/pyexcel/internal/sheets/__init__.py +0 -11
  88. pyexcel-0.7.2/tests/_compact.py +0 -14
  89. pyexcel-0.7.2/tests/test_fileio.py +0 -40
  90. pyexcel-0.7.2/tests/test_internals.py +0 -15
  91. {pyexcel-0.7.2 → pyexcel-0.7.4}/CONTRIBUTORS.rst +0 -0
  92. {pyexcel-0.7.2 → pyexcel-0.7.4}/LICENSE +0 -0
  93. {pyexcel-0.7.2 → pyexcel-0.7.4}/MANIFEST.in +0 -0
  94. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/Makefile +0 -0
  95. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/make.bat +0 -0
  96. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/requirements.txt +0 -0
  97. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/_static/handsontable.full.min.css +0 -0
  98. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/_static/handsontable.full.min.js +0 -0
  99. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/_static/images/architecture.svg +0 -0
  100. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/_static/theme_overrides.css +0 -0
  101. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/_templates/layout.html +0 -0
  102. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/answers.rst +0 -0
  103. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/api.rst +0 -0
  104. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/architecture.rst +0 -0
  105. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/attributes.rst +0 -0
  106. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/bigdata.rst +0 -0
  107. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/book.rst +0 -0
  108. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/capability.rst +0 -0
  109. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/changelog.rst +0 -0
  110. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/coffee.csv +0 -0
  111. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/cookbook.rst +0 -0
  112. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/database.rst +0 -0
  113. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/design.rst +0 -0
  114. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/entity-relationship-diagram.dia +0 -0
  115. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/entity-relationship-diagram.png +0 -0
  116. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Book.bookdict.rst +0 -0
  117. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Book.csv.rst +0 -0
  118. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Book.csvz.rst +0 -0
  119. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Book.number_of_sheets.rst +0 -0
  120. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Book.ods.rst +0 -0
  121. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Book.rst +0 -0
  122. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Book.save_as.rst +0 -0
  123. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Book.save_to_database.rst +0 -0
  124. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Book.save_to_django_models.rst +0 -0
  125. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Book.save_to_memory.rst +0 -0
  126. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Book.sheet_names.rst +0 -0
  127. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Book.stream.rst +0 -0
  128. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Book.tsv.rst +0 -0
  129. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Book.tsvz.rst +0 -0
  130. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Book.url.rst +0 -0
  131. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Book.xls.rst +0 -0
  132. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Book.xlsm.rst +0 -0
  133. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Book.xlsx.rst +0 -0
  134. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.__getitem__.rst +0 -0
  135. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.array.rst +0 -0
  136. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.cell_value.rst +0 -0
  137. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.colnames.rst +0 -0
  138. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.column_at.rst +0 -0
  139. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.column_range.rst +0 -0
  140. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.content.rst +0 -0
  141. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.csv.rst +0 -0
  142. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.csvz.rst +0 -0
  143. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.cut.rst +0 -0
  144. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.delete_columns.rst +0 -0
  145. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.delete_named_column_at.rst +0 -0
  146. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.delete_named_row_at.rst +0 -0
  147. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.delete_rows.rst +0 -0
  148. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.dict.rst +0 -0
  149. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.extend_columns.rst +0 -0
  150. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.extend_rows.rst +0 -0
  151. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.filter.rst +0 -0
  152. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.format.rst +0 -0
  153. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.map.rst +0 -0
  154. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.name_columns_by_row.rst +0 -0
  155. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.name_rows_by_column.rst +0 -0
  156. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.named_column_at.rst +0 -0
  157. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.named_row_at.rst +0 -0
  158. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.number_of_columns.rst +0 -0
  159. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.number_of_rows.rst +0 -0
  160. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.ods.rst +0 -0
  161. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.paste.rst +0 -0
  162. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.project.rst +0 -0
  163. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.records.rst +0 -0
  164. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.region.rst +0 -0
  165. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.row_at.rst +0 -0
  166. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.row_range.rst +0 -0
  167. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.rownames.rst +0 -0
  168. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.rst +0 -0
  169. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.save_as.rst +0 -0
  170. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.save_to_database.rst +0 -0
  171. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.save_to_django_model.rst +0 -0
  172. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.save_to_memory.rst +0 -0
  173. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.set_column_at.rst +0 -0
  174. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.set_named_column_at.rst +0 -0
  175. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.set_named_row_at.rst +0 -0
  176. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.set_row_at.rst +0 -0
  177. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.stream.rst +0 -0
  178. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.transpose.rst +0 -0
  179. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.tsv.rst +0 -0
  180. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.tsvz.rst +0 -0
  181. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.url.rst +0 -0
  182. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.xls.rst +0 -0
  183. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.xlsm.rst +0 -0
  184. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.Sheet.xlsx.rst +0 -0
  185. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.extract_a_sheet_from_a_book.rst +0 -0
  186. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.free_resources.rst +0 -0
  187. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.get_array.rst +0 -0
  188. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.get_book.rst +0 -0
  189. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.get_book_dict.rst +0 -0
  190. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.get_dict.rst +0 -0
  191. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.get_records.rst +0 -0
  192. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.get_sheet.rst +0 -0
  193. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.iget_array.rst +0 -0
  194. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.iget_book.rst +0 -0
  195. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.iget_records.rst +0 -0
  196. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.isave_as.rst +0 -0
  197. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.isave_book_as.rst +0 -0
  198. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.merge_all_to_a_book.rst +0 -0
  199. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.merge_csv_to_a_book.rst +0 -0
  200. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.save_as.rst +0 -0
  201. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.save_book_as.rst +0 -0
  202. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/generated/pyexcel.split_a_book.rst +0 -0
  203. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/guide.rst +0 -0
  204. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/iapi/pyexcel.internal.generators.BookStream.rst +0 -0
  205. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/iapi/pyexcel.internal.generators.SheetStream.rst +0 -0
  206. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/iapi/pyexcel.internal.sheets.Column.rst +0 -0
  207. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/iapi/pyexcel.internal.sheets.Matrix.rst +0 -0
  208. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/iapi/pyexcel.internal.sheets.Row.rst +0 -0
  209. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/iapi.rst +0 -0
  210. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/index.rst +0 -0
  211. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/logging.rst +0 -0
  212. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/migration_guide.rst +0 -0
  213. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/note_on_pypy.rst +0 -0
  214. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/plugin_howto.rst +0 -0
  215. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/pyinstaller.rst +0 -0
  216. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/renderers.rst +0 -0
  217. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/sheet.rst +0 -0
  218. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/showcases/db_injection.rst +0 -0
  219. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/spelling_wordlist.txt +0 -0
  220. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/tutorial.rst +0 -0
  221. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/tutorial02.rst +0 -0
  222. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/tutorial03.rst +0 -0
  223. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/tutorial04.rst +0 -0
  224. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/tutorial05.rst +0 -0
  225. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/tutorial06.rst +0 -0
  226. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/tutorial_data_conversion.rst +0 -0
  227. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/tutorial_file.rst +0 -0
  228. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/uml/architecture.uml +0 -0
  229. {pyexcel-0.7.2 → pyexcel-0.7.4}/docs/source/webdev.rst +0 -0
  230. {pyexcel-0.7.2 → pyexcel-0.7.4}/examples/README.rst +0 -0
  231. {pyexcel-0.7.2 → pyexcel-0.7.4}/examples/basics/convert_xls_to_xlsx.py +0 -0
  232. {pyexcel-0.7.2 → pyexcel-0.7.4}/examples/basics/example.csv +0 -0
  233. {pyexcel-0.7.2 → pyexcel-0.7.4}/examples/basics/example.xls +0 -0
  234. {pyexcel-0.7.2 → pyexcel-0.7.4}/examples/basics/example.xlsm +0 -0
  235. {pyexcel-0.7.2 → pyexcel-0.7.4}/examples/basics/example.xlsx +0 -0
  236. {pyexcel-0.7.2 → pyexcel-0.7.4}/examples/basics/example_series.xls +0 -0
  237. {pyexcel-0.7.2 → pyexcel-0.7.4}/examples/basics/example_series_filter.xls +0 -0
  238. {pyexcel-0.7.2 → pyexcel-0.7.4}/examples/basics/jsonify.py +0 -0
  239. {pyexcel-0.7.2 → pyexcel-0.7.4}/examples/basics/multiple-sheets-example.xls +0 -0
  240. {pyexcel-0.7.2 → pyexcel-0.7.4}/examples/basics/multiple-sheets.xls +0 -0
  241. {pyexcel-0.7.2 → pyexcel-0.7.4}/examples/basics/multiple-sheets.xlsx +0 -0
  242. {pyexcel-0.7.2 → pyexcel-0.7.4}/examples/basics/read_cell_by_cell.py +0 -0
  243. {pyexcel-0.7.2 → pyexcel-0.7.4}/examples/basics/read_column_by_column.py +0 -0
  244. {pyexcel-0.7.2 → pyexcel-0.7.4}/examples/basics/read_excel_book.py +0 -0
  245. {pyexcel-0.7.2 → pyexcel-0.7.4}/examples/basics/read_row_by_row.py +0 -0
  246. {pyexcel-0.7.2 → pyexcel-0.7.4}/examples/basics/series.py +0 -0
  247. {pyexcel-0.7.2 → pyexcel-0.7.4}/examples/basics/write_excel_book.py +0 -0
  248. {pyexcel-0.7.2 → pyexcel-0.7.4}/examples/cookbook/merge_sheets.py +0 -0
  249. {pyexcel-0.7.2 → pyexcel-0.7.4}/examples/cookbook/scattered-csv-files/1.csv +0 -0
  250. {pyexcel-0.7.2 → pyexcel-0.7.4}/examples/cookbook/scattered-csv-files/2.csv +0 -0
  251. {pyexcel-0.7.2 → pyexcel-0.7.4}/examples/cookbook/scattered-csv-files/3.csv +0 -0
  252. {pyexcel-0.7.2 → pyexcel-0.7.4}/examples/database/import_xls_into_database_via_sqlalchemy.py +0 -0
  253. {pyexcel-0.7.2 → pyexcel-0.7.4}/examples/formatting/formatter01.py +0 -0
  254. {pyexcel-0.7.2 → pyexcel-0.7.4}/examples/formatting/formatter02.py +0 -0
  255. {pyexcel-0.7.2 → pyexcel-0.7.4}/examples/formatting/tutorial_datatype_01.xls +0 -0
  256. {pyexcel-0.7.2 → pyexcel-0.7.4}/examples/formatting/tutorial_datatype_02.xls +0 -0
  257. {pyexcel-0.7.2 → pyexcel-0.7.4}/examples/memoryfile/README.rst +0 -0
  258. {pyexcel-0.7.2 → pyexcel-0.7.4}/examples/memoryfile/pyexcel_server.py +0 -0
  259. {pyexcel-0.7.2 → pyexcel-0.7.4}/examples/memoryfile/templates/upload.html +0 -0
  260. {pyexcel-0.7.2 → pyexcel-0.7.4}/examples/simple/multiple-sheets.xls +0 -0
  261. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/docstrings/garbagecollector.py +0 -0
  262. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/internal/utils.py +0 -0
  263. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel/plugins/sources/pydata/__init__.py +0 -0
  264. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel.egg-info/dependency_links.txt +0 -0
  265. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel.egg-info/not-zip-safe +0 -0
  266. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel.egg-info/requires.txt +0 -0
  267. {pyexcel-0.7.2 → pyexcel-0.7.4}/pyexcel.egg-info/top_level.txt +0 -0
  268. {pyexcel-0.7.2 → pyexcel-0.7.4}/setup.cfg +0 -0
  269. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/__init__.py +0 -0
  270. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/base.py +0 -0
  271. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/db.py +0 -0
  272. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/fixtures/bug_01.csv +0 -0
  273. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/fixtures/bug_176.xlsx +0 -0
  274. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/fixtures/date_field.xls +0 -0
  275. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/fixtures/empty.csv +0 -0
  276. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/fixtures/file_with_an_empty_sheet.xlsx +0 -0
  277. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/fixtures/force_type.txt +0 -0
  278. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/fixtures/issue_241/1.csv +0 -0
  279. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/fixtures/issue_241/2.csv +0 -0
  280. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/fixtures/non-uniform-rows.csv +0 -0
  281. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/fixtures/ods_formats.ods +0 -0
  282. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/fixtures/test-multiple.csvz +0 -0
  283. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/fixtures/test-single.csvz +0 -0
  284. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/fixtures/test_cook_book_merge_alphabets.csv +0 -0
  285. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/fixtures/test_cook_book_merge_alphabets_2.csv +0 -0
  286. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/fixtures/test_cook_book_merge_numbers.csv +0 -0
  287. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/fixtures/test_cook_book_merge_numbers_2.csv +0 -0
  288. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/requirements.txt +0 -0
  289. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/test_book.py +0 -0
  290. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/test_book_stream.py +0 -0
  291. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/test_django_related_functions.py +0 -0
  292. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/test_file_type_as_attribute.py +0 -0
  293. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/test_formatters.py +0 -0
  294. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/test_iterator.py +0 -0
  295. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/test_multiple_sheets.py +0 -0
  296. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/test_parser.py +0 -0
  297. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/test_presentation.py +0 -0
  298. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/test_pyexcel_list.py +0 -0
  299. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/test_renderer.py +0 -0
  300. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/test_sheet.py +0 -0
  301. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/test_sheet_access.py +0 -0
  302. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/test_sheet_attributes.py +0 -0
  303. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/test_sheet_column.py +0 -0
  304. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/test_sheet_row.py +0 -0
  305. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/test_sheet_update.py +0 -0
  306. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/test_sheets.py +0 -0
  307. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/test_stringio.py +0 -0
  308. {pyexcel-0.7.2 → pyexcel-0.7.4}/tests/test_utils.py +0 -0
@@ -1,6 +1,24 @@
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
+
12
+ 0.7.3 - 12.04.2025
13
+ --------------------------------------------------------------------------------
14
+
15
+ **Fixed**
16
+
17
+ #. `#263 <https://github.com/pyexcel/pyexcel/issues/263>`_: support pathlib from
18
+ python 3.4
19
+ #. `#267 <https://github.com/pyexcel/pyexcel/issues/267>`_: better error message
20
+ for file_name
21
+
4
22
  0.7.2 - 23.03.2025
5
23
  --------------------------------------------------------------------------------
6
24
 
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyexcel
3
- Version: 0.7.2
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.2.tar.gz
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
- ... 'Sheet 1':
430
+ ... 'Top 3 Aircraft Manufacturers':
431
431
  ... [
432
- ... [1.0, 2.0, 3.0],
433
- ... [4.0, 5.0, 6.0],
434
- ... [7.0, 8.0, 9.0]
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
- ... 'Sheet 2':
437
+ ... 'Top 3 Airlines':
437
438
  ... [
438
- ... ['X', 'Y', 'Z'],
439
- ... [1.0, 2.0, 3.0],
440
- ... [4.0, 5.0, 6.0]
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
- ... 'Sheet 3':
444
+ ... 'Biggest 3 Airoplanes':
443
445
  ... [
444
- ... ['O', 'P', 'Q'],
445
- ... [3.0, 2.0, 1.0],
446
- ... [4.0, 3.0, 2.0]
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['Sheet 2']})
466
- >>> data.update({"Sheet 1": a_dictionary_of_two_dimensional_arrays['Sheet 1']})
467
- >>> data.update({"Sheet 3": a_dictionary_of_two_dimensional_arrays['Sheet 3']})
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": [["X", "Y", "Z"], [1, 2, 3], [4, 5, 6]]}
478
- {"Sheet 1": [[1, 2, 3], [4, 5, 6], [7, 8, 9]]}
479
- {"Sheet 3": [["O", "P", "Q"], [3, 2, 1], [4, 3, 2]]}
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 problem, then python run.
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="birth.xls", dest_file_name="birth.csv")
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="birth.csv")
506
+ >>> sheet = p.get_sheet(file_name="trump_tariffs.csv")
504
507
  >>> sheet
505
- birth.csv:
506
- +-------+--------+----------+
507
- | name | weight | birth |
508
- +-------+--------+----------+
509
- | Adam | 3.4 | 03/02/15 |
510
- +-------+--------+----------+
511
- | Smith | 4.2 | 12/11/14 |
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="birth.xls",
524
- ... dest_file_name="birth.xlsx") # change the file extension
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="birth.xlsx")
536
+ >>> sheet = p.get_sheet(file_name="trump_tariffs.xlsx")
531
537
  >>> sheet
532
538
  pyexcel_sheet1:
533
- +-------+--------+----------+
534
- | name | weight | birth |
535
- +-------+--------+----------+
536
- | Adam | 3.4 | 03/02/15 |
537
- +-------+--------+----------+
538
- | Smith | 4.2 | 12/11/14 |
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 forgot the second line to close the opened file handle:
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 forgot the second line:
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,24 @@ 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
+
1264
+ 0.7.3 - 12.04.2025
1265
+ --------------------------------------------------------------------------------
1266
+
1267
+ **Fixed**
1268
+
1269
+ #. `#263 <https://github.com/pyexcel/pyexcel/issues/263>`_: support pathlib from
1270
+ python 3.4
1271
+ #. `#267 <https://github.com/pyexcel/pyexcel/issues/267>`_: better error message
1272
+ for file_name
1273
+
1247
1274
  0.7.2 - 23.03.2025
1248
1275
  --------------------------------------------------------------------------------
1249
1276
 
@@ -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
- ... 'Sheet 1':
387
+ ... 'Top 3 Aircraft Manufacturers':
388
388
  ... [
389
- ... [1.0, 2.0, 3.0],
390
- ... [4.0, 5.0, 6.0],
391
- ... [7.0, 8.0, 9.0]
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
- ... 'Sheet 2':
394
+ ... 'Top 3 Airlines':
394
395
  ... [
395
- ... ['X', 'Y', 'Z'],
396
- ... [1.0, 2.0, 3.0],
397
- ... [4.0, 5.0, 6.0]
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
- ... 'Sheet 3':
401
+ ... 'Biggest 3 Airoplanes':
400
402
  ... [
401
- ... ['O', 'P', 'Q'],
402
- ... [3.0, 2.0, 1.0],
403
- ... [4.0, 3.0, 2.0]
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['Sheet 2']})
423
- >>> data.update({"Sheet 1": a_dictionary_of_two_dimensional_arrays['Sheet 1']})
424
- >>> data.update({"Sheet 3": a_dictionary_of_two_dimensional_arrays['Sheet 3']})
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": [["X", "Y", "Z"], [1, 2, 3], [4, 5, 6]]}
435
- {"Sheet 1": [[1, 2, 3], [4, 5, 6], [7, 8, 9]]}
436
- {"Sheet 3": [["O", "P", "Q"], [3, 2, 1], [4, 3, 2]]}
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 problem, then python run.
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="birth.xls", dest_file_name="birth.csv")
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="birth.csv")
463
+ >>> sheet = p.get_sheet(file_name="trump_tariffs.csv")
461
464
  >>> sheet
462
- birth.csv:
463
- +-------+--------+----------+
464
- | name | weight | birth |
465
- +-------+--------+----------+
466
- | Adam | 3.4 | 03/02/15 |
467
- +-------+--------+----------+
468
- | Smith | 4.2 | 12/11/14 |
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="birth.xls",
481
- ... dest_file_name="birth.xlsx") # change the file extension
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="birth.xlsx")
493
+ >>> sheet = p.get_sheet(file_name="trump_tariffs.xlsx")
488
494
  >>> sheet
489
495
  pyexcel_sheet1:
490
- +-------+--------+----------+
491
- | name | weight | birth |
492
- +-------+--------+----------+
493
- | Adam | 3.4 | 03/02/15 |
494
- +-------+--------+----------+
495
- | Smith | 4.2 | 12/11/14 |
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 forgot the second line to close the opened file handle:
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 forgot the second line:
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.2'
29
+ version = '0.7.4'
30
30
  # The full version, including alpha/beta/rc tags
31
- release = '0.7.2'
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
- ... 'Sheet 1':
330
+ ... 'Top 3 Aircraft Manufacturers':
331
331
  ... [
332
- ... [1.0, 2.0, 3.0],
333
- ... [4.0, 5.0, 6.0],
334
- ... [7.0, 8.0, 9.0]
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
- ... 'Sheet 2':
337
+ ... 'Top 3 Airlines':
337
338
  ... [
338
- ... ['X', 'Y', 'Z'],
339
- ... [1.0, 2.0, 3.0],
340
- ... [4.0, 5.0, 6.0]
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
- ... 'Sheet 3':
344
+ ... 'Biggest 3 Airoplanes':
343
345
  ... [
344
- ... ['O', 'P', 'Q'],
345
- ... [3.0, 2.0, 1.0],
346
- ... [4.0, 3.0, 2.0]
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['Sheet 2']})
366
- >>> data.update({"Sheet 1": a_dictionary_of_two_dimensional_arrays['Sheet 1']})
367
- >>> data.update({"Sheet 3": a_dictionary_of_two_dimensional_arrays['Sheet 3']})
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": [["X", "Y", "Z"], [1, 2, 3], [4, 5, 6]]}
378
- {"Sheet 1": [[1, 2, 3], [4, 5, 6], [7, 8, 9]]}
379
- {"Sheet 3": [["O", "P", "Q"], [3, 2, 1], [4, 3, 2]]}
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 problem, then python run.
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
- ... ["name", "weight", "birth"],
398
- ... ["Adam", 3.4, datetime.date(2015, 2, 3)],
399
- ... ["Smith", 4.2, datetime.date(2014, 11, 12)]
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="birth.xls")
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="birth.xls", dest_file_name="birth.csv")
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="birth.csv")
418
+ >>> sheet = p.get_sheet(file_name="trump_tariffs.csv")
415
419
  >>> sheet
416
- birth.csv:
417
- +-------+--------+----------+
418
- | name | weight | birth |
419
- +-------+--------+----------+
420
- | Adam | 3.4 | 03/02/15 |
421
- +-------+--------+----------+
422
- | Smith | 4.2 | 12/11/14 |
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="birth.xls",
435
- ... dest_file_name="birth.xlsx") # change the file extension
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="birth.xlsx")
448
+ >>> sheet = p.get_sheet(file_name="trump_tariffs.xlsx")
442
449
  >>> sheet
443
450
  pyexcel_sheet1:
444
- +-------+--------+----------+
445
- | name | weight | birth |
446
- +-------+--------+----------+
447
- | Adam | 3.4 | 03/02/15 |
448
- +-------+--------+----------+
449
- | Smith | 4.2 | 12/11/14 |
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('birth.xls')
556
- >>> os.unlink('birth.csv')
557
- >>> os.unlink('birth.xlsx')
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, PY2, BytesIO
166
+ >>> from pyexcel._compact import StringIO, BytesIO
167
167
  >>> patcher = patch('pyexcel._compact.request.urlopen')
168
168
  >>> urlopen = patcher.start()
169
- >>> io = StringIO("1,2,3") if PY2 else BytesIO("1,2,3".encode('utf-8'))
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 forgot the second line to close the opened file handle:
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 forgot the second line:
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