spreadsheet_architect 5.0.0 → 5.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (240) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +7 -3
  3. data/README.md +22 -17
  4. data/lib/spreadsheet_architect/class_methods/xlsx.rb +0 -2
  5. data/lib/spreadsheet_architect/utils/xlsx.rb +3 -3
  6. data/lib/spreadsheet_architect/version.rb +1 -1
  7. metadata +5 -540
  8. data/lib/spreadsheet_architect/axlsx_string_width_patch.rb +0 -23
  9. data/test/dummy_app/Rakefile +0 -7
  10. data/test/dummy_app/app/assets/config/manifest.js +0 -3
  11. data/test/dummy_app/app/assets/javascripts/application.js +0 -0
  12. data/test/dummy_app/app/assets/stylesheets/application.css +0 -3
  13. data/test/dummy_app/app/controllers/application_controller.rb +0 -3
  14. data/test/dummy_app/app/controllers/spreadsheets_controller.rb +0 -77
  15. data/test/dummy_app/app/models/active_model_object.rb +0 -15
  16. data/test/dummy_app/app/models/application_record.rb +0 -3
  17. data/test/dummy_app/app/models/custom_columns_method_post.rb +0 -29
  18. data/test/dummy_app/app/models/custom_post.rb +0 -28
  19. data/test/dummy_app/app/models/legacy_plain_ruby_object.rb +0 -14
  20. data/test/dummy_app/app/models/plain_ruby_object.rb +0 -12
  21. data/test/dummy_app/app/models/post.rb +0 -6
  22. data/test/dummy_app/app/views/layouts/application.html.erb +0 -14
  23. data/test/dummy_app/config/application.rb +0 -58
  24. data/test/dummy_app/config/boot.rb +0 -10
  25. data/test/dummy_app/config/database.yml +0 -25
  26. data/test/dummy_app/config/environment.rb +0 -5
  27. data/test/dummy_app/config/environments/test.rb +0 -41
  28. data/test/dummy_app/config/initializers/backtrace_silencers.rb +0 -7
  29. data/test/dummy_app/config/initializers/inflections.rb +0 -10
  30. data/test/dummy_app/config/initializers/mime_types.rb +0 -5
  31. data/test/dummy_app/config/initializers/secret_token.rb +0 -11
  32. data/test/dummy_app/config/initializers/session_store.rb +0 -8
  33. data/test/dummy_app/config/initializers/spreadsheet_architect.rb +0 -11
  34. data/test/dummy_app/config/initializers/wrap_parameters.rb +0 -14
  35. data/test/dummy_app/config/locales/en.yml +0 -5
  36. data/test/dummy_app/config/routes.rb +0 -6
  37. data/test/dummy_app/config/secrets.yml +0 -22
  38. data/test/dummy_app/config.ru +0 -4
  39. data/test/dummy_app/db/migrate/20170103234524_add_posts.rb +0 -10
  40. data/test/dummy_app/db/schema.rb +0 -23
  41. data/test/dummy_app/db/test.sqlite3 +0 -0
  42. data/test/dummy_app/log/test.log +0 -113964
  43. data/test/dummy_app/tmp/2.0.1/integration/alt_xlsx.xlsx +0 -0
  44. data/test/dummy_app/tmp/2.0.1/integration/csv.csv +0 -6
  45. data/test/dummy_app/tmp/2.0.1/integration/ods.ods +0 -0
  46. data/test/dummy_app/tmp/2.0.1/integration/xlsx.xlsx +0 -0
  47. data/test/dummy_app/tmp/2.0.1/kitchen_sink.ods +0 -0
  48. data/test/dummy_app/tmp/2.0.1/kitchen_sink.xlsx +0 -0
  49. data/test/dummy_app/tmp/2.0.1/models/ActiveModelObject/data.csv +0 -3
  50. data/test/dummy_app/tmp/2.0.1/models/ActiveModelObject/data.ods +0 -0
  51. data/test/dummy_app/tmp/2.0.1/models/ActiveModelObject/data.xlsx +0 -0
  52. data/test/dummy_app/tmp/2.0.1/models/ActiveModelObject/empty.csv +0 -1
  53. data/test/dummy_app/tmp/2.0.1/models/ActiveModelObject/empty.ods +0 -0
  54. data/test/dummy_app/tmp/2.0.1/models/ActiveModelObject/empty.xlsx +0 -0
  55. data/test/dummy_app/tmp/2.0.1/models/ActiveModelObject/instances.csv +0 -6
  56. data/test/dummy_app/tmp/2.0.1/models/ActiveModelObject/instances.ods +0 -0
  57. data/test/dummy_app/tmp/2.0.1/models/ActiveModelObject/instances.xlsx +0 -0
  58. data/test/dummy_app/tmp/2.0.1/models/CustomColumnsMethodPost/data.csv +0 -3
  59. data/test/dummy_app/tmp/2.0.1/models/CustomColumnsMethodPost/data.ods +0 -0
  60. data/test/dummy_app/tmp/2.0.1/models/CustomColumnsMethodPost/data.xlsx +0 -0
  61. data/test/dummy_app/tmp/2.0.1/models/CustomColumnsMethodPost/empty.csv +0 -0
  62. data/test/dummy_app/tmp/2.0.1/models/CustomColumnsMethodPost/empty.ods +0 -0
  63. data/test/dummy_app/tmp/2.0.1/models/CustomColumnsMethodPost/empty.xlsx +0 -0
  64. data/test/dummy_app/tmp/2.0.1/models/CustomColumnsMethodPost/instances.csv +0 -6
  65. data/test/dummy_app/tmp/2.0.1/models/CustomColumnsMethodPost/instances.ods +0 -0
  66. data/test/dummy_app/tmp/2.0.1/models/CustomColumnsMethodPost/instances.xlsx +0 -0
  67. data/test/dummy_app/tmp/2.0.1/models/CustomPost/data.csv +0 -3
  68. data/test/dummy_app/tmp/2.0.1/models/CustomPost/data.ods +0 -0
  69. data/test/dummy_app/tmp/2.0.1/models/CustomPost/data.xlsx +0 -0
  70. data/test/dummy_app/tmp/2.0.1/models/CustomPost/empty.csv +0 -1
  71. data/test/dummy_app/tmp/2.0.1/models/CustomPost/empty.ods +0 -0
  72. data/test/dummy_app/tmp/2.0.1/models/CustomPost/empty.xlsx +0 -0
  73. data/test/dummy_app/tmp/2.0.1/models/CustomPost/instances.csv +0 -6
  74. data/test/dummy_app/tmp/2.0.1/models/CustomPost/instances.ods +0 -0
  75. data/test/dummy_app/tmp/2.0.1/models/CustomPost/instances.xlsx +0 -0
  76. data/test/dummy_app/tmp/2.0.1/models/LegacyPlainRubyObject/data.csv +0 -3
  77. data/test/dummy_app/tmp/2.0.1/models/LegacyPlainRubyObject/data.ods +0 -0
  78. data/test/dummy_app/tmp/2.0.1/models/LegacyPlainRubyObject/data.xlsx +0 -0
  79. data/test/dummy_app/tmp/2.0.1/models/LegacyPlainRubyObject/empty.csv +0 -1
  80. data/test/dummy_app/tmp/2.0.1/models/LegacyPlainRubyObject/empty.ods +0 -0
  81. data/test/dummy_app/tmp/2.0.1/models/LegacyPlainRubyObject/empty.xlsx +0 -0
  82. data/test/dummy_app/tmp/2.0.1/models/LegacyPlainRubyObject/instances.csv +0 -6
  83. data/test/dummy_app/tmp/2.0.1/models/LegacyPlainRubyObject/instances.ods +0 -0
  84. data/test/dummy_app/tmp/2.0.1/models/LegacyPlainRubyObject/instances.xlsx +0 -0
  85. data/test/dummy_app/tmp/2.0.1/models/PlainRubyObject/data.csv +0 -3
  86. data/test/dummy_app/tmp/2.0.1/models/PlainRubyObject/data.ods +0 -0
  87. data/test/dummy_app/tmp/2.0.1/models/PlainRubyObject/data.xlsx +0 -0
  88. data/test/dummy_app/tmp/2.0.1/models/PlainRubyObject/empty.csv +0 -1
  89. data/test/dummy_app/tmp/2.0.1/models/PlainRubyObject/empty.ods +0 -0
  90. data/test/dummy_app/tmp/2.0.1/models/PlainRubyObject/empty.xlsx +0 -0
  91. data/test/dummy_app/tmp/2.0.1/models/PlainRubyObject/instances.csv +0 -6
  92. data/test/dummy_app/tmp/2.0.1/models/PlainRubyObject/instances.ods +0 -0
  93. data/test/dummy_app/tmp/2.0.1/models/PlainRubyObject/instances.xlsx +0 -0
  94. data/test/dummy_app/tmp/2.0.1/models/Post/data.csv +0 -3
  95. data/test/dummy_app/tmp/2.0.1/models/Post/data.ods +0 -0
  96. data/test/dummy_app/tmp/2.0.1/models/Post/data.xlsx +0 -0
  97. data/test/dummy_app/tmp/2.0.1/models/Post/empty.csv +0 -0
  98. data/test/dummy_app/tmp/2.0.1/models/Post/empty.ods +0 -0
  99. data/test/dummy_app/tmp/2.0.1/models/Post/empty.xlsx +0 -0
  100. data/test/dummy_app/tmp/2.0.1/models/Post/instances.csv +0 -6
  101. data/test/dummy_app/tmp/2.0.1/models/Post/instances.ods +0 -0
  102. data/test/dummy_app/tmp/2.0.1/models/Post/instances.xlsx +0 -0
  103. data/test/dummy_app/tmp/2.0.1/multi_sheet.ods +0 -0
  104. data/test/dummy_app/tmp/2.0.1/multi_sheet.xlsx +0 -0
  105. data/test/dummy_app/tmp/3.0.0.pre/integration/alt_xlsx.xlsx +0 -0
  106. data/test/dummy_app/tmp/3.0.0.pre/integration/csv.csv +0 -6
  107. data/test/dummy_app/tmp/3.0.0.pre/integration/ods.ods +0 -0
  108. data/test/dummy_app/tmp/3.0.0.pre/integration/xlsx.xlsx +0 -0
  109. data/test/dummy_app/tmp/3.0.0.pre/kitchen_sink.ods +0 -0
  110. data/test/dummy_app/tmp/3.0.0.pre/kitchen_sink.xlsx +0 -0
  111. data/test/dummy_app/tmp/3.0.0.pre/models/ActiveModelObject/data.csv +0 -3
  112. data/test/dummy_app/tmp/3.0.0.pre/models/ActiveModelObject/data.ods +0 -0
  113. data/test/dummy_app/tmp/3.0.0.pre/models/ActiveModelObject/data.xlsx +0 -0
  114. data/test/dummy_app/tmp/3.0.0.pre/models/ActiveModelObject/empty.csv +0 -1
  115. data/test/dummy_app/tmp/3.0.0.pre/models/ActiveModelObject/empty.ods +0 -0
  116. data/test/dummy_app/tmp/3.0.0.pre/models/ActiveModelObject/empty.xlsx +0 -0
  117. data/test/dummy_app/tmp/3.0.0.pre/models/ActiveModelObject/instances.csv +0 -6
  118. data/test/dummy_app/tmp/3.0.0.pre/models/ActiveModelObject/instances.ods +0 -0
  119. data/test/dummy_app/tmp/3.0.0.pre/models/ActiveModelObject/instances.xlsx +0 -0
  120. data/test/dummy_app/tmp/3.0.0.pre/models/CustomColumnsMethodPost/data.csv +0 -3
  121. data/test/dummy_app/tmp/3.0.0.pre/models/CustomColumnsMethodPost/data.ods +0 -0
  122. data/test/dummy_app/tmp/3.0.0.pre/models/CustomColumnsMethodPost/data.xlsx +0 -0
  123. data/test/dummy_app/tmp/3.0.0.pre/models/CustomColumnsMethodPost/empty.csv +0 -0
  124. data/test/dummy_app/tmp/3.0.0.pre/models/CustomColumnsMethodPost/empty.ods +0 -0
  125. data/test/dummy_app/tmp/3.0.0.pre/models/CustomColumnsMethodPost/empty.xlsx +0 -0
  126. data/test/dummy_app/tmp/3.0.0.pre/models/CustomColumnsMethodPost/instances.csv +0 -6
  127. data/test/dummy_app/tmp/3.0.0.pre/models/CustomColumnsMethodPost/instances.ods +0 -0
  128. data/test/dummy_app/tmp/3.0.0.pre/models/CustomColumnsMethodPost/instances.xlsx +0 -0
  129. data/test/dummy_app/tmp/3.0.0.pre/models/CustomPost/data.csv +0 -3
  130. data/test/dummy_app/tmp/3.0.0.pre/models/CustomPost/data.ods +0 -0
  131. data/test/dummy_app/tmp/3.0.0.pre/models/CustomPost/data.xlsx +0 -0
  132. data/test/dummy_app/tmp/3.0.0.pre/models/CustomPost/empty.csv +0 -1
  133. data/test/dummy_app/tmp/3.0.0.pre/models/CustomPost/empty.ods +0 -0
  134. data/test/dummy_app/tmp/3.0.0.pre/models/CustomPost/empty.xlsx +0 -0
  135. data/test/dummy_app/tmp/3.0.0.pre/models/CustomPost/instances.csv +0 -6
  136. data/test/dummy_app/tmp/3.0.0.pre/models/CustomPost/instances.ods +0 -0
  137. data/test/dummy_app/tmp/3.0.0.pre/models/CustomPost/instances.xlsx +0 -0
  138. data/test/dummy_app/tmp/3.0.0.pre/models/LegacyPlainRubyObject/data.csv +0 -3
  139. data/test/dummy_app/tmp/3.0.0.pre/models/LegacyPlainRubyObject/data.ods +0 -0
  140. data/test/dummy_app/tmp/3.0.0.pre/models/LegacyPlainRubyObject/data.xlsx +0 -0
  141. data/test/dummy_app/tmp/3.0.0.pre/models/LegacyPlainRubyObject/empty.csv +0 -0
  142. data/test/dummy_app/tmp/3.0.0.pre/models/LegacyPlainRubyObject/empty.ods +0 -0
  143. data/test/dummy_app/tmp/3.0.0.pre/models/LegacyPlainRubyObject/empty.xlsx +0 -0
  144. data/test/dummy_app/tmp/3.0.0.pre/models/LegacyPlainRubyObject/instances.csv +0 -6
  145. data/test/dummy_app/tmp/3.0.0.pre/models/LegacyPlainRubyObject/instances.ods +0 -0
  146. data/test/dummy_app/tmp/3.0.0.pre/models/LegacyPlainRubyObject/instances.xlsx +0 -0
  147. data/test/dummy_app/tmp/3.0.0.pre/models/PlainRubyObject/data.csv +0 -3
  148. data/test/dummy_app/tmp/3.0.0.pre/models/PlainRubyObject/data.ods +0 -0
  149. data/test/dummy_app/tmp/3.0.0.pre/models/PlainRubyObject/data.xlsx +0 -0
  150. data/test/dummy_app/tmp/3.0.0.pre/models/PlainRubyObject/empty.csv +0 -0
  151. data/test/dummy_app/tmp/3.0.0.pre/models/PlainRubyObject/empty.ods +0 -0
  152. data/test/dummy_app/tmp/3.0.0.pre/models/PlainRubyObject/empty.xlsx +0 -0
  153. data/test/dummy_app/tmp/3.0.0.pre/models/PlainRubyObject/instances.csv +0 -6
  154. data/test/dummy_app/tmp/3.0.0.pre/models/PlainRubyObject/instances.ods +0 -0
  155. data/test/dummy_app/tmp/3.0.0.pre/models/PlainRubyObject/instances.xlsx +0 -0
  156. data/test/dummy_app/tmp/3.0.0.pre/models/Post/data.csv +0 -3
  157. data/test/dummy_app/tmp/3.0.0.pre/models/Post/data.ods +0 -0
  158. data/test/dummy_app/tmp/3.0.0.pre/models/Post/data.xlsx +0 -0
  159. data/test/dummy_app/tmp/3.0.0.pre/models/Post/empty.csv +0 -1
  160. data/test/dummy_app/tmp/3.0.0.pre/models/Post/empty.ods +0 -0
  161. data/test/dummy_app/tmp/3.0.0.pre/models/Post/empty.xlsx +0 -0
  162. data/test/dummy_app/tmp/3.0.0.pre/models/Post/instances.csv +0 -6
  163. data/test/dummy_app/tmp/3.0.0.pre/models/Post/instances.ods +0 -0
  164. data/test/dummy_app/tmp/3.0.0.pre/models/Post/instances.xlsx +0 -0
  165. data/test/dummy_app/tmp/3.0.0.pre/multi_sheet.ods +0 -0
  166. data/test/dummy_app/tmp/3.0.0.pre/multi_sheet.xlsx +0 -0
  167. data/test/dummy_app/tmp/axlsx-master/integration/alt_xlsx.xlsx +0 -0
  168. data/test/dummy_app/tmp/axlsx-master/integration/csv.csv +0 -6
  169. data/test/dummy_app/tmp/axlsx-master/integration/ods.ods +0 -0
  170. data/test/dummy_app/tmp/axlsx-master/integration/xlsx.xlsx +0 -0
  171. data/test/dummy_app/tmp/axlsx-master/kitchen_sink.ods +0 -0
  172. data/test/dummy_app/tmp/axlsx-master/kitchen_sink.xlsx +0 -0
  173. data/test/dummy_app/tmp/axlsx-master/models/ActiveModelObject/data.csv +0 -4
  174. data/test/dummy_app/tmp/axlsx-master/models/ActiveModelObject/data.ods +0 -0
  175. data/test/dummy_app/tmp/axlsx-master/models/ActiveModelObject/data.xlsx +0 -0
  176. data/test/dummy_app/tmp/axlsx-master/models/ActiveModelObject/empty.csv +0 -1
  177. data/test/dummy_app/tmp/axlsx-master/models/ActiveModelObject/empty.ods +0 -0
  178. data/test/dummy_app/tmp/axlsx-master/models/ActiveModelObject/empty.xlsx +0 -0
  179. data/test/dummy_app/tmp/axlsx-master/models/ActiveModelObject/instances.csv +0 -6
  180. data/test/dummy_app/tmp/axlsx-master/models/ActiveModelObject/instances.ods +0 -0
  181. data/test/dummy_app/tmp/axlsx-master/models/ActiveModelObject/instances.xlsx +0 -0
  182. data/test/dummy_app/tmp/axlsx-master/models/CustomColumnsMethodPost/data.csv +0 -4
  183. data/test/dummy_app/tmp/axlsx-master/models/CustomColumnsMethodPost/data.ods +0 -0
  184. data/test/dummy_app/tmp/axlsx-master/models/CustomColumnsMethodPost/data.xlsx +0 -0
  185. data/test/dummy_app/tmp/axlsx-master/models/CustomColumnsMethodPost/empty.csv +0 -1
  186. data/test/dummy_app/tmp/axlsx-master/models/CustomColumnsMethodPost/empty.ods +0 -0
  187. data/test/dummy_app/tmp/axlsx-master/models/CustomColumnsMethodPost/empty.xlsx +0 -0
  188. data/test/dummy_app/tmp/axlsx-master/models/CustomColumnsMethodPost/instances.csv +0 -6
  189. data/test/dummy_app/tmp/axlsx-master/models/CustomColumnsMethodPost/instances.ods +0 -0
  190. data/test/dummy_app/tmp/axlsx-master/models/CustomColumnsMethodPost/instances.xlsx +0 -0
  191. data/test/dummy_app/tmp/axlsx-master/models/CustomPost/data.csv +0 -4
  192. data/test/dummy_app/tmp/axlsx-master/models/CustomPost/data.ods +0 -0
  193. data/test/dummy_app/tmp/axlsx-master/models/CustomPost/data.xlsx +0 -0
  194. data/test/dummy_app/tmp/axlsx-master/models/CustomPost/empty.csv +0 -1
  195. data/test/dummy_app/tmp/axlsx-master/models/CustomPost/empty.ods +0 -0
  196. data/test/dummy_app/tmp/axlsx-master/models/CustomPost/empty.xlsx +0 -0
  197. data/test/dummy_app/tmp/axlsx-master/models/CustomPost/instances.csv +0 -6
  198. data/test/dummy_app/tmp/axlsx-master/models/CustomPost/instances.ods +0 -0
  199. data/test/dummy_app/tmp/axlsx-master/models/CustomPost/instances.xlsx +0 -0
  200. data/test/dummy_app/tmp/axlsx-master/models/LegacyPlainRubyObject/data.csv +0 -4
  201. data/test/dummy_app/tmp/axlsx-master/models/LegacyPlainRubyObject/data.ods +0 -0
  202. data/test/dummy_app/tmp/axlsx-master/models/LegacyPlainRubyObject/data.xlsx +0 -0
  203. data/test/dummy_app/tmp/axlsx-master/models/LegacyPlainRubyObject/empty.csv +0 -1
  204. data/test/dummy_app/tmp/axlsx-master/models/LegacyPlainRubyObject/empty.ods +0 -0
  205. data/test/dummy_app/tmp/axlsx-master/models/LegacyPlainRubyObject/empty.xlsx +0 -0
  206. data/test/dummy_app/tmp/axlsx-master/models/LegacyPlainRubyObject/instances.csv +0 -6
  207. data/test/dummy_app/tmp/axlsx-master/models/LegacyPlainRubyObject/instances.ods +0 -0
  208. data/test/dummy_app/tmp/axlsx-master/models/LegacyPlainRubyObject/instances.xlsx +0 -0
  209. data/test/dummy_app/tmp/axlsx-master/models/PlainRubyObject/data.csv +0 -4
  210. data/test/dummy_app/tmp/axlsx-master/models/PlainRubyObject/data.ods +0 -0
  211. data/test/dummy_app/tmp/axlsx-master/models/PlainRubyObject/data.xlsx +0 -0
  212. data/test/dummy_app/tmp/axlsx-master/models/PlainRubyObject/empty.csv +0 -1
  213. data/test/dummy_app/tmp/axlsx-master/models/PlainRubyObject/empty.ods +0 -0
  214. data/test/dummy_app/tmp/axlsx-master/models/PlainRubyObject/empty.xlsx +0 -0
  215. data/test/dummy_app/tmp/axlsx-master/models/PlainRubyObject/instances.csv +0 -6
  216. data/test/dummy_app/tmp/axlsx-master/models/PlainRubyObject/instances.ods +0 -0
  217. data/test/dummy_app/tmp/axlsx-master/models/PlainRubyObject/instances.xlsx +0 -0
  218. data/test/dummy_app/tmp/axlsx-master/models/Post/data.csv +0 -4
  219. data/test/dummy_app/tmp/axlsx-master/models/Post/data.ods +0 -0
  220. data/test/dummy_app/tmp/axlsx-master/models/Post/data.xlsx +0 -0
  221. data/test/dummy_app/tmp/axlsx-master/models/Post/empty.csv +0 -1
  222. data/test/dummy_app/tmp/axlsx-master/models/Post/empty.ods +0 -0
  223. data/test/dummy_app/tmp/axlsx-master/models/Post/empty.xlsx +0 -0
  224. data/test/dummy_app/tmp/axlsx-master/models/Post/instances.csv +0 -6
  225. data/test/dummy_app/tmp/axlsx-master/models/Post/instances.ods +0 -0
  226. data/test/dummy_app/tmp/axlsx-master/models/Post/instances.xlsx +0 -0
  227. data/test/dummy_app/tmp/axlsx-master/multi_sheet.ods +0 -0
  228. data/test/dummy_app/tmp/axlsx-master/multi_sheet.xlsx +0 -0
  229. data/test/integration/application_test.rb +0 -38
  230. data/test/models/all_models_test.rb +0 -108
  231. data/test/test_helper.rb +0 -87
  232. data/test/unit/ods/general_test.rb +0 -121
  233. data/test/unit/rails/formats_test.rb +0 -15
  234. data/test/unit/spreadsheet_architect/exceptions_test.rb +0 -195
  235. data/test/unit/spreadsheet_architect/spreadsheet_architect_test.rb +0 -15
  236. data/test/unit/spreadsheet_architect/utils/ods_test.rb +0 -58
  237. data/test/unit/spreadsheet_architect/utils/xlsx_test.rb +0 -114
  238. data/test/unit/spreadsheet_architect/utils_test.rb +0 -197
  239. data/test/unit/xlsx/freeze_test.rb +0 -79
  240. data/test/unit/xlsx/general_test.rb +0 -199
@@ -1,58 +0,0 @@
1
- require 'test_helper'
2
-
3
- class SpreadsheetArchitect::Utils::OdsTest < ActiveSupport::TestCase
4
- klass = SpreadsheetArchitect::Utils::ODS
5
-
6
- describe "get_cell_type" do
7
- describe "without passing the type argument" do
8
- test "it gets the correct cell type" do
9
- assert_equal :string, klass.get_cell_type("foobar")
10
- assert_equal :float, klass.get_cell_type(1)
11
- end
12
- end
13
-
14
- describe "when passing the type argument" do
15
- test "returns the given type" do
16
- assert_equal "foobar", klass.get_cell_type(1, "foobar")
17
- end
18
-
19
- describe "hyperlinks" do
20
- test "returns :string" do
21
- assert_equal :string, klass.get_cell_type("foobar", :hyperlink)
22
- assert_equal :string, klass.get_cell_type(1, :hyperlink)
23
- end
24
- end
25
- end
26
- end
27
-
28
- describe "convert_styles" do
29
- test "convert_styles_to_ods" do
30
- ods_styles = klass.convert_styles({
31
- background_color: '333333',
32
- color: '000000',
33
- align: true,
34
- bold: true,
35
- font_size: 14,
36
- italic: true,
37
- underline: true,
38
- test: true
39
- })
40
-
41
- assert_equal(ods_styles, {
42
- 'cell' => {
43
- 'background-color' => '#333333'
44
- },
45
- 'text' => {
46
- 'color' => '#000000',
47
- 'align' => true,
48
- 'font-weight' => 'bold',
49
- 'font-size' => 14,
50
- 'font-style' => 'italic',
51
- 'text-underline-type' => 'single',
52
- 'text-underline-style' => 'solid'
53
- }
54
- })
55
- end
56
- end
57
-
58
- end
@@ -1,114 +0,0 @@
1
- require 'test_helper'
2
-
3
- class SpreadsheetArchitectXlsxUtilsTest < ActiveSupport::TestCase
4
- klass = SpreadsheetArchitect::Utils::XLSX
5
-
6
- def setup
7
- end
8
-
9
- def teardown
10
- end
11
-
12
- test "convert_styles_to_axlsx" do
13
- xlsx_styles = klass.convert_styles_to_axlsx({background_color: '333333', color: '000000', align: true, bold: true, font_size: 14, italic: true, underline: true, test: true})
14
-
15
- assert_equal(xlsx_styles, {bg_color: '333333', fg_color: '000000', alignment: {horizontal: true}, b: true, sz: 14, i: true, u: true, test: true})
16
- end
17
-
18
- test "get_type" do
19
- assert_equal(klass.get_type('string'), :string)
20
- assert_equal(klass.get_type(123.01), :float)
21
- assert_equal(klass.get_type(BigDecimal('123.01')), :float)
22
- assert_equal(klass.get_type(10), :integer)
23
- assert_equal(klass.get_type(:test), :string)
24
- assert_equal(klass.get_type(Time.now.to_date), :date)
25
- assert_equal(klass.get_type(DateTime.now), :time)
26
- assert_equal(klass.get_type(Time.now), :time)
27
- end
28
-
29
- test "range_hash_to_str" do
30
- num_columns = 26
31
- num_rows = 10
32
-
33
- assert_raise SpreadsheetArchitect::Exceptions::InvalidRangeError do
34
- klass.range_hash_to_str({}, num_columns, num_rows)
35
- end
36
-
37
- assert_raise SpreadsheetArchitect::Exceptions::InvalidRangeOptionError do
38
- klass.range_hash_to_str({columns: [1,2,3], rows: 1}, num_columns, num_rows)
39
- end
40
-
41
- assert_raise SpreadsheetArchitect::Exceptions::InvalidRangeOptionError do
42
- klass.range_hash_to_str({columns: 1, rows: [1,2,3]}, num_columns, num_rows)
43
- end
44
-
45
- assert_equal klass.range_hash_to_str({columns: 1}, num_columns, num_rows), "B1:B10"
46
-
47
- assert_equal klass.range_hash_to_str({rows: 1}, num_columns, num_rows), "A1:Z1"
48
-
49
- assert_equal klass.range_hash_to_str({columns: 0, rows: 1}, num_columns, num_rows), "A1:A1"
50
-
51
- assert_equal klass.range_hash_to_str({columns: (0..2), rows: (1..3)}, num_columns, num_rows), "A1:C3"
52
-
53
- assert_equal klass.range_hash_to_str({columns: ('A'..'C'), rows: (1..3)}, num_columns, num_rows), "A1:C3"
54
-
55
- assert_equal klass.range_hash_to_str({columns: :all, rows: :all}, num_columns, num_rows), "A1:Z10"
56
-
57
- assert_raise SpreadsheetArchitect::Exceptions::InvalidRangeValue do
58
- assert_equal klass.range_hash_to_str({columns: ('foobar'..'asd'), rows: (1..3)}, num_columns, num_rows), "foobar1:asd3"
59
- end
60
- end
61
-
62
- test "verify_range" do
63
- num_rows = 10
64
-
65
- klass.verify_range("A1:Z10", num_rows)
66
-
67
- assert_raise SpreadsheetArchitect::Exceptions::InvalidRangeError do
68
- klass.verify_range(:foo, num_rows)
69
- end
70
-
71
- assert_raise SpreadsheetArchitect::Exceptions::InvalidRangeError do
72
- klass.verify_range("A1Z10", num_rows)
73
- end
74
-
75
- assert_raise SpreadsheetArchitect::Exceptions::InvalidRangeValue do
76
- klass.verify_range("A1:A#{num_rows+1}", num_rows)
77
- end
78
-
79
- klass.verify_range("A1:AAA1", num_rows)
80
- end
81
-
82
- test "verify_column" do
83
- num_columns = 26
84
-
85
- klass.verify_column(1, num_columns)
86
-
87
- klass.verify_column("A", num_columns)
88
-
89
- assert_raise SpreadsheetArchitect::Exceptions::InvalidColumnError do
90
- klass.verify_column(-1, num_columns)
91
- end
92
-
93
- assert_raise SpreadsheetArchitect::Exceptions::InvalidColumnError do
94
- klass.verify_column(99, num_columns)
95
- end
96
-
97
- assert_raise SpreadsheetArchitect::Exceptions::InvalidColumnError do
98
- klass.verify_column("foobar", num_columns)
99
- end
100
-
101
- assert_raise SpreadsheetArchitect::Exceptions::InvalidColumnError do
102
- klass.verify_column([], num_columns)
103
- end
104
-
105
- klass.verify_column("ZZ", num_columns)
106
- end
107
-
108
- test "constants" do
109
- assert_equal klass::COL_NAMES.count, 16384
110
- assert_equal klass::COL_NAMES.first, 'A'
111
- assert_equal klass::COL_NAMES.last, 'XFD'
112
- end
113
-
114
- end
@@ -1,197 +0,0 @@
1
- require 'test_helper'
2
-
3
- class SpreadsheetArchitectUtilsTest < ActiveSupport::TestCase
4
- klass = SpreadsheetArchitect::Utils
5
-
6
- def setup
7
- @options = {
8
- header_style: {background_color: 'AAAAAA', color: 'FFFFFF', align: :center, font_name: 'Arial', font_size: 10, bold: false, italic: false, underline: false},
9
- row_style: {background_color: nil, color: '000000', align: :left, font_name: 'Arial', font_size: 10, bold: false, italic: false, underline: false},
10
- sheet_name: 'My Project Export',
11
- column_styles: [],
12
- range_styles: [],
13
- merges: [],
14
- borders: [],
15
- column_types: [],
16
- column_widths: [],
17
-
18
- headers: ['test1', 'test2','test3'],
19
- data: [
20
- ['row1'],
21
- ['row2 c1', 'row2 c2'],
22
- ['the','data']
23
- ]
24
- }
25
- end
26
-
27
- def teardown
28
- end
29
-
30
- test "get_cell_data" do
31
- assert klass.get_cell_data(@options, SpreadsheetArchitect)
32
-
33
- assert klass.get_cell_data(@options, Post)
34
-
35
- assert klass.get_options({}, SpreadsheetArchitect)
36
-
37
- assert_raise SpreadsheetArchitect::Exceptions::MultipleDataSourcesError do
38
- klass.get_cell_data(@options.merge(instances: []), SpreadsheetArchitect)
39
- end
40
-
41
- ### using Data option
42
- output = klass.get_cell_data(@options.merge(headers: true), SpreadsheetArchitect)
43
- assert_equal false, output[:headers]
44
-
45
- output = klass.get_cell_data(@options.merge(headers: false), SpreadsheetArchitect)
46
- assert_equal false, output[:headers]
47
-
48
- output = klass.get_cell_data(@options.merge(column_types: nil), SpreadsheetArchitect)
49
- assert_nil output[:column_types]
50
-
51
- output = klass.get_cell_data(@options.merge(column_types: []), SpreadsheetArchitect)
52
- assert_nil output[:column_types]
53
-
54
- output = klass.get_cell_data(@options.merge(column_types: [:string]), SpreadsheetArchitect)
55
- assert_equal output[:column_types], [:string]
56
-
57
- headers = [[1,2,3], [3,4,5]]
58
- output = klass.get_cell_data(@options.merge(headers: headers), SpreadsheetArchitect)
59
- assert_equal headers, output[:headers]
60
-
61
- ### Using instances option
62
- output = klass.get_cell_data(@options.merge(data: nil), Post.all)
63
- assert output[:instances].is_a?(Array)
64
-
65
- output = klass.get_cell_data(@options.merge(data: nil), Post.limit(0))
66
- assert output[:instances].is_a?(Array)
67
-
68
- assert_raise SpreadsheetArchitect::Exceptions::NoDataError do
69
- klass.get_cell_data(@options.merge(data: nil, instances: nil), SpreadsheetArchitect)
70
- end
71
-
72
- output = klass.get_cell_data(@options.merge(data: nil, instances: [PlainRubyObject.new]), SpreadsheetArchitect)
73
- assert output[:instances].count == 1
74
- end
75
-
76
- test "get_options" do
77
- ### Empty
78
- assert_not_empty klass.get_options({}, SpreadsheetArchitect)
79
-
80
- ### using SpreadsheetArchitect
81
- assert_not_empty klass.get_options(@options, SpreadsheetArchitect)
82
-
83
- ### with model defaults via SPREADSHEET_OPTIONS
84
- assert defined?(CustomPost::SPREADSHEET_OPTIONS)
85
- assert klass.get_options(@options, CustomPost)
86
-
87
- ### without model defaults via SPREADSHEET_OPTIONS
88
- assert_not_empty klass.get_options(@options, Post)
89
-
90
- ### without :headers removes :header_style
91
- assert_nil klass.get_options({header_style: false, headers: false}, SpreadsheetArchitect)[:header_style]
92
-
93
- ### sets :sheet_name if needed
94
- assert_equal klass.get_options({sheet_name: false}, SpreadsheetArchitect)[:sheet_name], 'Sheet1'
95
-
96
- ### sets :sheet_name if needed, using pluralized only when using Rails
97
- assert_equal klass.get_options({sheet_name: false}, Post)[:sheet_name], 'Posts'
98
-
99
- ### sets :escape_formulas if not given
100
- assert_equal klass.get_options({}, SpreadsheetArchitect)[:escape_formulas], true
101
-
102
- assert_equal klass.get_options({}, SpreadsheetArchitect)[:use_zero_based_row_index], false
103
-
104
- ### removes default styles
105
- assert_equal klass.get_options({skip_defaults: true}, SpreadsheetArchitect), {skip_defaults: true, sheet_name: "Sheet1", escape_formulas: true, use_zero_based_row_index: false}
106
- assert_equal klass.get_options({skip_defaults: true}, Post), {skip_defaults: true, sheet_name: "Posts", escape_formulas: true, use_zero_based_row_index: false}
107
-
108
- assert_not_equal klass.get_options({skip_defaults: false}, SpreadsheetArchitect), {skip_defaults: true, sheet_name: "Sheet1", escape_formulas: true, use_zero_based_row_index: false}
109
- assert_not_equal klass.get_options({skip_defaults: false}, Post), {skip_defaults: true, sheet_name: "Posts", escape_formulas: true, use_zero_based_row_index: false}
110
- end
111
-
112
- test "is_ar_model" do
113
- assert klass.is_ar_model?(Post)
114
-
115
- assert_not klass.is_ar_model?(SpreadsheetArchitect)
116
- end
117
-
118
- test "str_titleize" do
119
- assert_equal(klass.str_titleize('my_project_export'), 'My Project Export')
120
- assert_equal(klass.str_titleize('My Project Export'), 'My Project Export')
121
- assert_equal(klass.str_titleize('TBS report'), 'TBS Report')
122
- end
123
-
124
- test "check_option_type" do
125
- klass.check_option_type(@options, :data, Array)
126
-
127
- klass.check_option_type(@options, :foo, Array)
128
-
129
- assert_raise SpreadsheetArchitect::Exceptions::OptionTypeError do
130
- klass.check_option_type({foo: :bar}, :foo, Array)
131
- end
132
- end
133
-
134
- test "verify_option_types" do
135
- klass.verify_option_types(@options)
136
-
137
- assert_raise SpreadsheetArchitect::Exceptions::OptionTypeError do
138
- klass.verify_option_types(@options.merge({column_widths: :foobar}))
139
- end
140
- end
141
-
142
- test "stringify_keys" do
143
- hash = klass.stringify_keys({})
144
- assert_empty hash
145
-
146
- hash = klass.stringify_keys({foo: :bar})
147
- assert_nil hash[:foo]
148
- assert_equal hash['foo'], :bar
149
-
150
- hash = klass.stringify_keys({foo: :bar, 'bar' => :foo})
151
- assert_nil hash[:foo]
152
- assert_equal hash['foo'], :bar
153
-
154
- hash = klass.stringify_keys({foo: {foo: :bar}})
155
- assert_nil hash[:foo]
156
- assert_equal hash['foo']['foo'], :bar
157
-
158
- hash = klass.stringify_keys({foo: {foo: {foo: :bar}}})
159
- assert_nil hash[:foo]
160
- assert_equal hash['foo']['foo']['foo'], :bar
161
-
162
- hash = klass.stringify_keys({foo: {foo: {foo: {foo: :bar}}}})
163
- assert_nil hash[:foo]
164
- assert_equal hash['foo']['foo']['foo']['foo'], :bar
165
- end
166
-
167
- test "symbolize_keys" do
168
- hash = klass.symbolize_keys({})
169
- assert_empty hash
170
-
171
- hash = klass.symbolize_keys({'foo' => :bar})
172
- assert_nil hash['foo']
173
- assert_equal hash[:foo], :bar
174
-
175
- hash = klass.symbolize_keys({'foo' => :bar, bar: :foo})
176
- assert_nil hash['foo']
177
- assert_equal hash[:foo], :bar
178
-
179
- hash = klass.symbolize_keys({'foo' => {'foo' => :bar}})
180
- assert_nil hash['foo']
181
- assert_equal hash[:foo][:foo], :bar
182
-
183
- hash = klass.symbolize_keys({'foo' => {'foo' => {'foo' => :bar}}})
184
- assert_nil hash['foo']
185
- assert_equal hash[:foo][:foo][:foo], :bar
186
- end
187
-
188
- test "hash_array_symbolize_keys" do
189
- array = klass.hash_array_symbolize_keys([])
190
- assert_empty array
191
-
192
- array = klass.hash_array_symbolize_keys([{'foo' => :bar}])
193
- assert_nil array[0]['foo']
194
- assert_equal array[0][:foo], :bar
195
- end
196
-
197
- end
@@ -1,79 +0,0 @@
1
- require "test_helper"
2
-
3
- class XlsxFreezeTest < ActiveSupport::TestCase
4
-
5
- def setup
6
- @options = {
7
- headers: [
8
- ['Latest Posts'],
9
- ['Title','Category','Author','Posted on','Posted At','Earnings']
10
- ],
11
- data: 50.times.map{|i| [i, "foobar-#{i}", 5.4*i, true, Date.today, Time.now]},
12
- }
13
- end
14
-
15
- def teardown
16
- end
17
-
18
- test "basic" do
19
- opts = @options.merge({
20
- freeze: {rows: 1, columns: 1},
21
- })
22
-
23
- # Using Array Data
24
- file_data = SpreadsheetArchitect.to_xlsx(opts)
25
-
26
- save_file("xlsx/freeze_basic.xlsx", file_data)
27
- end
28
-
29
- test "using_ranges" do
30
- opts = @options.merge({
31
- freeze: {rows: (2..4), columns: (2..4)},
32
- })
33
-
34
- # Using Array Data
35
- file_data = SpreadsheetArchitect.to_xlsx(opts)
36
-
37
- save_file("xlsx/freeze_using_ranges.xlsx", file_data)
38
- end
39
-
40
- test "using_legacy_arguments" do
41
- opts = @options.merge({
42
- freeze: {rows: :all, columns: 2},
43
- })
44
-
45
- # Using Array Data
46
- file_data = SpreadsheetArchitect.to_xlsx(opts)
47
-
48
- save_file("xlsx/freeze_using_legacy_arguments.xlsx", file_data)
49
- end
50
-
51
- test "freeze_type" do
52
- opts = @options.merge({
53
- freeze: {row: (@options[:data].size-2), column: 16, type: "split_panes"},
54
- })
55
-
56
- # Using Array Data
57
- file_data = SpreadsheetArchitect.to_xlsx(opts)
58
-
59
- save_file("xlsx/freeze_type.xlsx", file_data)
60
- end
61
-
62
- test "panes_all_axlsx_options" do
63
- opts = @options.merge({
64
- freeze: {
65
- row: (@options[:data].size-2),
66
- column: 16,
67
- state: "split",
68
- #active_pane: "top_right",
69
- #top_left_cell: "A2",
70
- },
71
- })
72
-
73
- # Using Array Data
74
- file_data = SpreadsheetArchitect.to_xlsx(opts)
75
-
76
- save_file("xlsx/freeze_panes_all_axlsx_options.xlsx", file_data)
77
- end
78
-
79
- end
@@ -1,199 +0,0 @@
1
- require 'test_helper'
2
-
3
- class XlsxGeneralTest < ActiveSupport::TestCase
4
-
5
- describe "header" do
6
- test "header: false" do
7
- spreadsheet = SpreadsheetArchitect.to_xlsx(headers: false, data: [[1]])
8
-
9
- save_file("xlsx/headers_false_test.xlsx", spreadsheet)
10
- end
11
- end
12
-
13
- test "use_zero_based_row_index" do
14
- spreadsheet = SpreadsheetArchitect.to_xlsx(
15
- use_zero_based_row_index: true,
16
- headers: [1, 2, 3],
17
- data: [
18
- [4,5,6],
19
- [7,8,9],
20
- [10,11,12],
21
- ],
22
- range_styles: [
23
- {range: {rows: 0, columns: 0}, styles: {bold: true}},
24
- {range: {rows: (2..3), columns: 0}, styles: {italic: true}},
25
- ],
26
- merges: [
27
- {range: {rows: 0, columns: 1..2}},
28
- {range: {rows: (2..3), columns: 2}},
29
- ],
30
- borders: [
31
- {range: {rows: 0, columns: :all}},
32
- {range: {rows: 3, columns: 0}},
33
- ],
34
- )
35
-
36
- save_file("xlsx/use_zero_based_row_index_test.xlsx", spreadsheet)
37
- end
38
-
39
- test "multisheet" do
40
- test_data = [[1,2,3], [4,5,6], [7,8,9]]
41
-
42
- package = Post.to_axlsx_package
43
- package = CustomPost.to_axlsx_package({sheet_name: 'Latest Projects'}, package)
44
- package = SpreadsheetArchitect.to_axlsx_package({data: test_data, sheet_name: 'Another Sheet'}, package)
45
-
46
- save_file("xlsx/multi_sheet.xlsx", package)
47
- end
48
-
49
- test "kitchen sink" do
50
- options = {
51
- headers: [
52
- ['Latest Posts'],
53
- ['Title','Category','Author','Posted on','Posted At','Earnings']
54
- ],
55
- data: 50.times.map{|i| [i, "foobar-#{i}", 5.4*i, true, Date.today, Time.now]},
56
- header_style: {background_color: "000000", color: "FFFFFF", align: :center, font_size: 12, bold: true},
57
- row_style: {background_color: nil, color: "000000", align: :left, font_size: 12},
58
- sheet_name: 'Kitchen Sink',
59
- freeze_headers: true,
60
-
61
- column_styles: [
62
- {columns: 0, styles: {bold: true}},
63
- {columns: (1..3), styles: {color: "444444"}},
64
- {columns: [4], include_header: false, styles: {italic: true}}
65
- ],
66
-
67
- range_styles: [
68
- {range: "B2:C4", styles: {background_color: "CCCCCC"}},
69
- {range: {rows: 1, columns: :all}, styles: {bold: true}},
70
- {range: {rows: (20..25), columns: (1..4)}, styles: {italic: true}},
71
- {range: {rows: :all, columns: (3..4)}, styles: {color: "999999"}}
72
- ],
73
-
74
- conditional_row_styles: [
75
- {
76
- if: Proc.new{|row_data, row_index|
77
- row_index == 0 || row_data[0].to_i == 2
78
- },
79
- styles: {font_size: 18}
80
- },
81
- {
82
- unless: Proc.new{|row_data, row_index|
83
- row_index <= 10 || row_data[0].to_i == 15
84
- },
85
- styles: {align: :right}
86
- },
87
- ],
88
-
89
- borders: [
90
- {range: "B2:C4"},
91
- {range: "D6:D7", border_styles: {style: :dashDot, color: "333333"}},
92
- {range: {rows: (2..11), columns: :all}, border_styles: {edges: [:top,:bottom]}},
93
- {range: {rows: 3, columns: 4}, border_styles: {edges: [:top,:bottom]}}
94
- ],
95
-
96
- merges: [
97
- {range: "A1:C1"},
98
- {range: {rows: 2, columns: :all}},
99
- {range: {rows: (3..4), columns: (0..3)}}
100
- ],
101
-
102
- column_types: [
103
- :integer,
104
- :string,
105
- :float,
106
- :boolean,
107
- :date,
108
- :time,
109
- nil,
110
- ],
111
- }
112
-
113
- # Using Array Data
114
- file_data = SpreadsheetArchitect.to_xlsx(options)
115
-
116
- save_file("xlsx/kitchen_sink.xlsx", file_data)
117
- end
118
-
119
- describe "column_types" do
120
- test "validates provided types" do
121
- assert_raise SpreadsheetArchitect::Exceptions::ArgumentError do
122
- SpreadsheetArchitect.to_axlsx_package(
123
- data: [],
124
- column_types: [""]
125
- )
126
- end
127
-
128
- SpreadsheetArchitect.to_axlsx_package(
129
- data: [],
130
- column_types: [:string, :integer, :float, :date, :time, :boolean, :hyperlink, nil, ->(x){ :foo }]
131
- )
132
- end
133
-
134
- test "works with Proc types" do
135
- url = "https://github.com/westonganger/spreadsheet_architect"
136
-
137
- data = [
138
- [1, 2],
139
- [1, url],
140
- ]
141
-
142
- p = SpreadsheetArchitect.to_axlsx_package(
143
- data: data,
144
- column_types: [
145
- :string,
146
- ->(x){ x.to_s.start_with?("http") ? :hyperlink : :string }
147
- ]
148
- )
149
-
150
- doc = parse_axlsx_package(p)
151
-
152
- hyperlinks = doc.css("hyperlinks hyperlink")
153
-
154
- assert_equal 1, hyperlinks.size
155
-
156
- ref = "B2"
157
- assert_equal ref, hyperlinks[0].attr("ref")
158
- cell = doc.at("c[r='#{ref}']")
159
- assert_equal url, cell.text
160
- assert_equal "inlineStr", cell.attr("t")
161
-
162
- save_file("xlsx/hyperlinks.xlsx", p)
163
- end
164
-
165
- describe "hyperlinks" do
166
- test "shows the text and have the correct attributes" do
167
- url = "https://github.com/westonganger/spreadsheet_architect"
168
-
169
- data = [
170
- [1,2,3],
171
- [1, url, "https://github.com/caxlsx/caxlsx"],
172
- ]
173
-
174
- p = SpreadsheetArchitect.to_axlsx_package(data: data, column_types: [:string, :hyperlink, :string])
175
-
176
- doc = parse_axlsx_package(p)
177
-
178
- hyperlinks = doc.css("hyperlinks hyperlink")
179
-
180
- assert_equal 2, hyperlinks.size
181
-
182
- ref = "B1"
183
- assert_equal ref, hyperlinks[0].attr("ref")
184
- cell = doc.at("c[r='#{ref}']")
185
- assert_equal "2", cell.text
186
- assert_equal "inlineStr", cell.attr("t")
187
-
188
- ref = "B2"
189
- assert_equal ref, hyperlinks[1].attr("ref")
190
- cell = doc.at("c[r='#{ref}']")
191
- assert_equal url, cell.text
192
- assert_equal "inlineStr", cell.attr("t")
193
-
194
- save_file("xlsx/hyperlinks.xlsx", p)
195
- end
196
- end
197
- end
198
-
199
- end