pyxllib 0.3.91__tar.gz → 0.3.93__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 (340) hide show
  1. {pyxllib-0.3.91/pyxllib.egg-info → pyxllib-0.3.93}/PKG-INFO +1 -1
  2. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/data/echarts.py +2 -2
  3. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/file/xlsxlib.py +202 -152
  4. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/prog/pupil.py +6 -4
  5. {pyxllib-0.3.91 → pyxllib-0.3.93/pyxllib.egg-info}/PKG-INFO +1 -1
  6. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/data/gptlib.py +1 -1
  7. {pyxllib-0.3.91 → pyxllib-0.3.93}/setup.py +1 -1
  8. {pyxllib-0.3.91 → pyxllib-0.3.93}/LICENSE +0 -0
  9. {pyxllib-0.3.91 → pyxllib-0.3.93}/MANIFEST.in +0 -0
  10. {pyxllib-0.3.91 → pyxllib-0.3.93}/README.md +0 -0
  11. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/__init__.py +0 -0
  12. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/algo/__init__.py +0 -0
  13. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/algo/disjoint.py +0 -0
  14. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/algo/geo.py +0 -0
  15. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/algo/intervals.py +0 -0
  16. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/algo/matcher.py +0 -0
  17. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/algo/newbie.py +0 -0
  18. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/algo/pupil.py +0 -0
  19. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/algo/shapelylib.py +0 -0
  20. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/algo/specialist.py +0 -0
  21. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/algo/stat.py +0 -0
  22. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/algo/treelib.py +0 -0
  23. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/algo/unitlib.py +0 -0
  24. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/cv/__init__.py +0 -0
  25. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/cv/expert.py +0 -0
  26. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/cv/imfile.py +0 -0
  27. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/cv/imhash.py +0 -0
  28. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/cv/pupil.py +0 -0
  29. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/cv/rgbfmt.py +0 -0
  30. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/cv/trackbartools.py +0 -0
  31. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/cv/xlcvlib.py +0 -0
  32. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/cv/xlpillib.py +0 -0
  33. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/data/__init__.py +0 -0
  34. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/data/oss.py +0 -0
  35. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/data/pglib.py +0 -0
  36. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/data/sqlite.py +0 -0
  37. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/data/sqllib.py +0 -0
  38. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/ext/JLineViewer.py +0 -0
  39. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/ext/__init__.py +0 -0
  40. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/ext/autogui/__init__.py +0 -0
  41. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/ext/autogui/autogui.py +0 -0
  42. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/ext/autogui/virtualkey.py +0 -0
  43. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/ext/demolib.py +0 -0
  44. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/ext/kq5034lib.py +0 -0
  45. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/ext/old.py +0 -0
  46. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/ext/qt.py +0 -0
  47. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/ext/seleniumlib.py +0 -0
  48. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/ext/tk.py +0 -0
  49. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/ext/unixlib.py +0 -0
  50. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/ext/utools.py +0 -0
  51. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/ext/webhook.py +0 -0
  52. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/ext/win32lib.py +0 -0
  53. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/ext/yuquelib.py +0 -0
  54. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/file/__init__.py +0 -0
  55. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/file/docxlib.py +0 -0
  56. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/file/gitlib.py +0 -0
  57. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/file/movielib.py +0 -0
  58. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/file/newbie.py +0 -0
  59. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/file/onenotelib.py +0 -0
  60. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/file/packlib/__init__.py +0 -0
  61. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/file/packlib/zipfile.py +0 -0
  62. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/file/pdflib.py +0 -0
  63. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/file/pupil.py +0 -0
  64. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/file/specialist/__init__.py +0 -0
  65. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/file/specialist/dirlib.py +0 -0
  66. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/file/specialist/download.py +0 -0
  67. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/file/specialist/filelib.py +0 -0
  68. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/prog/__init__.py +0 -0
  69. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/prog/deprecatedlib.py +0 -0
  70. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/prog/ipyexec.py +0 -0
  71. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/prog/newbie.py +0 -0
  72. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/prog/sitepackages.py +0 -0
  73. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/prog/specialist/__init__.py +0 -0
  74. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/prog/specialist/bc.py +0 -0
  75. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/prog/specialist/browser.py +0 -0
  76. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/prog/specialist/common.py +0 -0
  77. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/prog/specialist/datetime.py +0 -0
  78. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/prog/specialist/tictoc.py +0 -0
  79. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/prog/specialist/xllog.py +0 -0
  80. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/prog/xlosenv.py +0 -0
  81. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/stdlib/__init__.py +0 -0
  82. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/stdlib/tablepyxl/__init__.py +0 -0
  83. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/stdlib/tablepyxl/style.py +0 -0
  84. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/stdlib/tablepyxl/tablepyxl.py +0 -0
  85. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/text/__init__.py +0 -0
  86. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/text/ahocorasick.py +0 -0
  87. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/text/charclasslib.py +0 -0
  88. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/text/jiebalib.py +0 -0
  89. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/text/jscode.py +0 -0
  90. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/text/latex/__init__.py +0 -0
  91. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/text/levenshtein.py +0 -0
  92. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/text/nestenv.py +0 -0
  93. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/text/newbie.py +0 -0
  94. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/text/pupil/__init__.py +0 -0
  95. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/text/pupil/common.py +0 -0
  96. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/text/pupil/xlalign.py +0 -0
  97. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/text/pycode.py +0 -0
  98. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/text/specialist/__init__.py +0 -0
  99. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/text/specialist/common.py +0 -0
  100. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/text/specialist/ptag.py +0 -0
  101. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/text/spellchecker.py +0 -0
  102. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/text/vbacode.py +0 -0
  103. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/text/xmllib.py +0 -0
  104. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/xl.py +0 -0
  105. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/xlcv.py +0 -0
  106. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib.egg-info/SOURCES.txt +0 -0
  107. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib.egg-info/dependency_links.txt +0 -0
  108. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib.egg-info/requires.txt +2 -2
  109. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib.egg-info/top_level.txt +0 -0
  110. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/__init__.py +0 -0
  111. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ai/__init__.py +0 -0
  112. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ai/clientlib.py +0 -0
  113. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ai/specialist.py +0 -0
  114. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ai/torch_app.py +0 -0
  115. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ai/xlpaddle.py +0 -0
  116. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ai/xltorch.py +0 -0
  117. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/data/__init__.py +0 -0
  118. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/data/coco.py +0 -0
  119. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/data/datacls.py +0 -0
  120. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/data/datasets.py +0 -0
  121. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/data/icdar/__init__.py +0 -0
  122. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/data/icdar/deteval.py +0 -0
  123. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/data/icdar/icdar2013.py +0 -0
  124. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/data/icdar/iou.py +0 -0
  125. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/data/icdar/rrc_evaluation_funcs_1_1.py +0 -0
  126. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/data/imtextline.py +0 -0
  127. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/data/labelme.py +0 -0
  128. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/data/removeline.py +0 -0
  129. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/data/specialist.py +0 -0
  130. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/eval/__init__.py +0 -0
  131. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/paddleocr.py +0 -0
  132. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/__init__.py +0 -0
  133. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/configs/rec/multi_language/generate_multi_language_configs.py +0 -0
  134. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/__init__.py +0 -0
  135. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/imaug/ColorJitter.py +0 -0
  136. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/imaug/__init__.py +0 -0
  137. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/imaug/copy_paste.py +0 -0
  138. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/imaug/east_process.py +0 -0
  139. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/imaug/gen_table_mask.py +0 -0
  140. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/imaug/iaa_augment.py +0 -0
  141. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/imaug/label_ops.py +0 -0
  142. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/imaug/make_border_map.py +0 -0
  143. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/imaug/make_pse_gt.py +0 -0
  144. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/imaug/make_shrink_map.py +0 -0
  145. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/imaug/operators.py +0 -0
  146. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/imaug/pg_process.py +0 -0
  147. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/imaug/randaugment.py +0 -0
  148. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/imaug/random_crop_data.py +0 -0
  149. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/imaug/rec_img_aug.py +0 -0
  150. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/imaug/sast_process.py +0 -0
  151. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/imaug/text_image_aug/__init__.py +0 -0
  152. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/imaug/text_image_aug/augment.py +0 -0
  153. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/imaug/text_image_aug/warp_mls.py +0 -0
  154. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/lmdb_dataset.py +0 -0
  155. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/pgnet_dataset.py +0 -0
  156. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/pubtab_dataset.py +0 -0
  157. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/simple_dataset.py +0 -0
  158. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/__init__.py +0 -0
  159. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/ace_loss.py +0 -0
  160. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/basic_loss.py +0 -0
  161. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/center_loss.py +0 -0
  162. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/cls_loss.py +0 -0
  163. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/combined_loss.py +0 -0
  164. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/det_basic_loss.py +0 -0
  165. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/det_db_loss.py +0 -0
  166. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/det_east_loss.py +0 -0
  167. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/det_pse_loss.py +0 -0
  168. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/det_sast_loss.py +0 -0
  169. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/distillation_loss.py +0 -0
  170. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/e2e_pg_loss.py +0 -0
  171. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/kie_sdmgr_loss.py +0 -0
  172. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/rec_aster_loss.py +0 -0
  173. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/rec_att_loss.py +0 -0
  174. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/rec_ctc_loss.py +0 -0
  175. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/rec_enhanced_ctc_loss.py +0 -0
  176. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/rec_nrtr_loss.py +0 -0
  177. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/rec_sar_loss.py +0 -0
  178. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/rec_srn_loss.py +0 -0
  179. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/table_att_loss.py +0 -0
  180. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/metrics/__init__.py +0 -0
  181. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/metrics/cls_metric.py +0 -0
  182. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/metrics/det_metric.py +0 -0
  183. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/metrics/distillation_metric.py +0 -0
  184. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/metrics/e2e_metric.py +0 -0
  185. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/metrics/eval_det_iou.py +0 -0
  186. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/metrics/kie_metric.py +0 -0
  187. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/metrics/rec_metric.py +0 -0
  188. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/metrics/table_metric.py +0 -0
  189. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/architectures/__init__.py +0 -0
  190. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/architectures/base_model.py +0 -0
  191. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/architectures/distillation_model.py +0 -0
  192. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/backbones/__init__.py +0 -0
  193. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/backbones/det_mobilenet_v3.py +0 -0
  194. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/backbones/det_resnet_vd.py +0 -0
  195. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/backbones/det_resnet_vd_sast.py +0 -0
  196. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/backbones/e2e_resnet_vd_pg.py +0 -0
  197. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/backbones/kie_unet_sdmgr.py +0 -0
  198. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/backbones/rec_mobilenet_v3.py +0 -0
  199. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/backbones/rec_mv1_enhance.py +0 -0
  200. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/backbones/rec_nrtr_mtb.py +0 -0
  201. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/backbones/rec_resnet_31.py +0 -0
  202. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/backbones/rec_resnet_aster.py +0 -0
  203. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/backbones/rec_resnet_fpn.py +0 -0
  204. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/backbones/rec_resnet_vd.py +0 -0
  205. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/heads/__init__.py +0 -0
  206. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/heads/cls_head.py +0 -0
  207. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/heads/det_db_head.py +0 -0
  208. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/heads/det_east_head.py +0 -0
  209. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/heads/det_pse_head.py +0 -0
  210. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/heads/det_sast_head.py +0 -0
  211. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/heads/e2e_pg_head.py +0 -0
  212. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/heads/kie_sdmgr_head.py +0 -0
  213. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/heads/multiheadAttention.py +0 -0
  214. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/heads/rec_aster_head.py +0 -0
  215. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/heads/rec_att_head.py +0 -0
  216. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/heads/rec_ctc_head.py +0 -0
  217. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/heads/rec_nrtr_head.py +0 -0
  218. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/heads/rec_sar_head.py +0 -0
  219. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/heads/rec_srn_head.py +0 -0
  220. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/heads/self_attention.py +0 -0
  221. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/heads/table_att_head.py +0 -0
  222. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/necks/__init__.py +0 -0
  223. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/necks/db_fpn.py +0 -0
  224. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/necks/east_fpn.py +0 -0
  225. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/necks/fpn.py +0 -0
  226. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/necks/pg_fpn.py +0 -0
  227. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/necks/rnn.py +0 -0
  228. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/necks/sast_fpn.py +0 -0
  229. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/necks/table_fpn.py +0 -0
  230. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/transforms/__init__.py +0 -0
  231. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/transforms/stn.py +0 -0
  232. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/transforms/tps.py +0 -0
  233. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/transforms/tps_spatial_transformer.py +0 -0
  234. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/optimizer/__init__.py +0 -0
  235. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/optimizer/learning_rate.py +0 -0
  236. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/optimizer/lr_scheduler.py +0 -0
  237. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/optimizer/optimizer.py +0 -0
  238. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/optimizer/regularizer.py +0 -0
  239. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/postprocess/__init__.py +0 -0
  240. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/postprocess/cls_postprocess.py +0 -0
  241. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/postprocess/db_postprocess.py +0 -0
  242. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/postprocess/east_postprocess.py +0 -0
  243. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/postprocess/locality_aware_nms.py +0 -0
  244. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/postprocess/pg_postprocess.py +0 -0
  245. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/postprocess/pse_postprocess/__init__.py +0 -0
  246. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/postprocess/pse_postprocess/pse/__init__.py +0 -0
  247. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/postprocess/pse_postprocess/pse/setup.py +0 -0
  248. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/postprocess/pse_postprocess/pse_postprocess.py +0 -0
  249. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/postprocess/rec_postprocess.py +0 -0
  250. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/postprocess/sast_postprocess.py +0 -0
  251. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/__init__.py +0 -0
  252. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/eval.py +0 -0
  253. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/export_center.py +0 -0
  254. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/export_model.py +0 -0
  255. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/infer/predict_cls.py +0 -0
  256. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/infer/predict_det.py +0 -0
  257. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/infer/predict_e2e.py +0 -0
  258. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/infer/predict_rec.py +0 -0
  259. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/infer/predict_system.py +0 -0
  260. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/infer/utility.py +0 -0
  261. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/infer_cls.py +0 -0
  262. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/infer_det.py +0 -0
  263. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/infer_e2e.py +0 -0
  264. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/infer_kie.py +0 -0
  265. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/infer_rec.py +0 -0
  266. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/infer_table.py +0 -0
  267. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/program.py +0 -0
  268. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/test_hubserving.py +0 -0
  269. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/train.py +0 -0
  270. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/xlprog.py +0 -0
  271. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/EN_symbol_dict.txt +0 -0
  272. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/__init__.py +0 -0
  273. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/ar_dict.txt +0 -0
  274. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/arabic_dict.txt +0 -0
  275. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/be_dict.txt +0 -0
  276. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/bg_dict.txt +0 -0
  277. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/chinese_cht_dict.txt +0 -0
  278. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/cyrillic_dict.txt +0 -0
  279. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/devanagari_dict.txt +0 -0
  280. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/en_dict.txt +0 -0
  281. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/fa_dict.txt +0 -0
  282. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/french_dict.txt +0 -0
  283. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/german_dict.txt +0 -0
  284. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/hi_dict.txt +0 -0
  285. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/it_dict.txt +0 -0
  286. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/japan_dict.txt +0 -0
  287. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/ka_dict.txt +0 -0
  288. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/korean_dict.txt +0 -0
  289. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/latin_dict.txt +0 -0
  290. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/mr_dict.txt +0 -0
  291. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/ne_dict.txt +0 -0
  292. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/oc_dict.txt +0 -0
  293. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/pu_dict.txt +0 -0
  294. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/rs_dict.txt +0 -0
  295. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/rsc_dict.txt +0 -0
  296. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/ru_dict.txt +0 -0
  297. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/ta_dict.txt +0 -0
  298. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/table_dict.txt +0 -0
  299. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/table_structure_dict.txt +0 -0
  300. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/te_dict.txt +0 -0
  301. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/ug_dict.txt +0 -0
  302. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/uk_dict.txt +0 -0
  303. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/ur_dict.txt +0 -0
  304. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/xi_dict.txt +0 -0
  305. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict90.txt +0 -0
  306. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/e2e_metric/Deteval.py +0 -0
  307. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/e2e_metric/polygon_fast.py +0 -0
  308. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/e2e_utils/extract_batchsize.py +0 -0
  309. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_fast.py +0 -0
  310. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_slow.py +0 -0
  311. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/e2e_utils/pgnet_pp_utils.py +0 -0
  312. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/e2e_utils/visual.py +0 -0
  313. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/en_dict.txt +0 -0
  314. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/gen_label.py +0 -0
  315. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/ic15_dict.txt +0 -0
  316. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/iou.py +0 -0
  317. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/logging.py +0 -0
  318. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/network.py +0 -0
  319. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/ppocr_keys_v1.txt +0 -0
  320. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/profiler.py +0 -0
  321. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/save_load.py +0 -0
  322. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/stats.py +0 -0
  323. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/utility.py +0 -0
  324. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppstructure/__init__.py +0 -0
  325. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppstructure/predict_system.py +0 -0
  326. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppstructure/table/__init__.py +0 -0
  327. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppstructure/table/eval_table.py +0 -0
  328. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppstructure/table/matcher.py +0 -0
  329. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppstructure/table/predict_structure.py +0 -0
  330. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppstructure/table/predict_table.py +0 -0
  331. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppstructure/table/table_metric/__init__.py +0 -0
  332. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppstructure/table/table_metric/parallel.py +0 -0
  333. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppstructure/table/table_metric/table_metric.py +0 -0
  334. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppstructure/table/tablepyxl/__init__.py +0 -0
  335. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppstructure/table/tablepyxl/style.py +0 -0
  336. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppstructure/table/tablepyxl/tablepyxl.py +0 -0
  337. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppstructure/utility.py +0 -0
  338. {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/xlai.py +0 -0
  339. {pyxllib-0.3.91 → pyxllib-0.3.93}/requirements.txt +0 -0
  340. {pyxllib-0.3.91 → pyxllib-0.3.93}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyxllib
3
- Version: 0.3.91
3
+ Version: 0.3.93
4
4
  Summary: 厦门理工模式识别团队通用python代码工具库
5
5
  Home-page: https://github.com/XLPRUtils/pyxllib
6
6
  Author: code4101
@@ -29,7 +29,7 @@ class XlChart(Chart):
29
29
  def set_title(self, title):
30
30
  self.set_global_opts(title_opts=pyecharts.options.TitleOpts(title=title))
31
31
 
32
- def add_series(self, name, data, *, type=None, color=None, is_selected=True, labels=None,
32
+ def add_series(self, name, data, *, type=None, color=None, labels=None,
33
33
  **kwargs):
34
34
  """ 垃圾pyecharts,毁我青春~~
35
35
 
@@ -54,7 +54,7 @@ class XlChart(Chart):
54
54
  kwargs['label']['formatter'] = fmt
55
55
 
56
56
  self._append_color(color)
57
- self._append_legend(name, is_selected)
57
+ self._append_legend(name)
58
58
 
59
59
  self.options.get('series').append(
60
60
  {
@@ -117,7 +117,7 @@ def is_valid_excel_address(address):
117
117
  return is_valid_excel_cell(address)
118
118
 
119
119
 
120
- @run_once('str')
120
+ @run_once('str', debug=True)
121
121
  def xlfmt2pyfmt_date(xl_fmt):
122
122
  """ 日期的渲染操作
123
123
 
@@ -213,7 +213,7 @@ def xlfmt2pyfmt_time(xl_fmt):
213
213
  return ':'.join(components)
214
214
 
215
215
 
216
- @run_once('str')
216
+ # @run_once('str')
217
217
  def xlfmt2pyfmt_datetime(xl_fmt):
218
218
  """ 主要是针对日期、时间的渲染操作
219
219
 
@@ -226,12 +226,6 @@ def xlfmt2pyfmt_datetime(xl_fmt):
226
226
  return py_fmt
227
227
 
228
228
 
229
- @run_once('str')
230
- def xlfmt2pyfmt(xl_fmt):
231
- """ 主要是针对日期、时间的渲染操作 """
232
- return xl_fmt
233
-
234
-
235
229
  def xl_render_value(x, xl_fmt):
236
230
  """ 得到单元格简单渲染后的效果
237
231
  py里不可能对excel的所有格式进行全覆盖,只是对场景格式进行处理
@@ -721,40 +715,58 @@ class XlWorksheet(openpyxl.worksheet.worksheet.Worksheet):
721
715
  right=self.max_column, bottom=self.max_row)
722
716
  return raw_used_range
723
717
 
724
- @run_once('id,str') # 同一个表,同一行不会重复计算
725
718
  def is_empty_row(self, row, start_col, end_col):
726
- cur_col = start_col
727
- # 特地提前检查下最后一列的那个单元格
728
- if self.cell(row, end_col).value is not None:
729
- return False
730
- while cur_col <= end_col:
731
- if self.cell(row, cur_col).value is not None:
719
+ if not hasattr(self, 'is_empty_row_cache'):
720
+ self.is_empty_row_cache = {}
721
+ key = (row, start_col, end_col)
722
+
723
+ def is_empty_row_core():
724
+ cur_col = start_col
725
+ # 特地提前检查下最后一列的那个单元格
726
+ if self.cell(row, end_col).value is not None:
732
727
  return False
733
- # 步长随着尝试的增加,也逐渐降低采样率
734
- n = cur_col - start_col + 1
735
- # 在最大值m=16384列情况下,/1000,最多检索3404个单元格,/100,最多检索569次,/50最多检索320次
736
- # cur_col += (n // 50) + 1
737
- # 再变形,加强前面权重,大大降低后面权重
738
- if n <= 100:
739
- cur_col += 1
740
- else: # 最多54次
741
- cur_col += (n // 10)
742
-
743
- return True
728
+ while cur_col <= end_col:
729
+ if self.cell(row, cur_col).value is not None:
730
+ return False
731
+ # 步长随着尝试的增加,也逐渐降低采样率
732
+ n = cur_col - start_col + 1
733
+ # 在最大值m=16384列情况下,/1000,最多检索3404个单元格,/100,最多检索569次,/50最多检索320次
734
+ # cur_col += (n // 50) + 1
735
+ # 再变形,加强前面权重,大大降低后面权重
736
+ if n <= 100:
737
+ cur_col += 1
738
+ else: # 最多54次
739
+ cur_col += (n // 10)
740
+
741
+ return True
742
+
743
+ if key not in self.is_empty_row_cache:
744
+ self.is_empty_row_cache[key] = is_empty_row_core()
745
+
746
+ return self.is_empty_row_cache[key]
744
747
 
745
- @run_once('id,str') # 同一个表,同一列不会重复计算
746
748
  def is_empty_column(self, col, start_row, end_row):
747
- cur_row = start_row
748
- # 特地提前检查下最后一行的那个单元格
749
- if self.cell(end_row, col).value is not None:
750
- return False
751
- while cur_row <= end_row:
752
- if self.cell(cur_row, col).value is not None:
749
+ if not hasattr(self, 'is_empty_column_cache'):
750
+ self.is_empty_column_cache = {}
751
+ key = (col, start_row, end_row)
752
+
753
+ def is_empty_column_core():
754
+ cur_row = start_row
755
+ # 特地提前检查下最后一行的那个单元格
756
+ if self.cell(end_row, col).value is not None:
753
757
  return False
754
- n = cur_row - start_row + 1
755
- # 在最大值n=1048576行情况下,/1000,最多检索7535个单元格,/100,最多检索987次,/50最多检索530次
756
- cur_row += (n // 1000) + 1
757
- return True
758
+ while cur_row <= end_row:
759
+ if self.cell(cur_row, col).value is not None:
760
+ return False
761
+ n = cur_row - start_row + 1
762
+ # 在最大值n=1048576行情况下,/1000,最多检索7535个单元格,/100,最多检索987次,/50最多检索530次
763
+ cur_row += (n // 1000) + 1
764
+ return True
765
+
766
+ if key not in self.is_empty_column_cache:
767
+ self.is_empty_column_cache[key] = is_empty_column_core()
768
+
769
+ return self.is_empty_column_cache[key]
758
770
 
759
771
  def find_last_non_empty_row(self, start_row, end_row, start_col, end_col, m=30):
760
772
  # 1 如果剩余行数不多(小于等于m),直接遍历这些行
@@ -864,7 +876,6 @@ class XlWorksheet(openpyxl.worksheet.worksheet.Worksheet):
864
876
  # 如果所有分割点都是空的,则返回-1
865
877
  return -1
866
878
 
867
- @run_once('id,str') # 同一个表,同一行不会重复计算
868
879
  def get_usedrange(self):
869
880
  """ 定位有效数据区间。
870
881
 
@@ -891,48 +902,48 @@ class XlWorksheet(openpyxl.worksheet.worksheet.Worksheet):
891
902
 
892
903
  :param reset_bounds: 计算出新区域后,是否重置ws的边界值
893
904
  """
894
- from pyxllib.prog.newbie import get_global_var
895
-
896
- # 初始化边界值
897
- left, right, top, bottom = self.min_column, self.max_column, self.min_row, self.max_row
898
-
899
- # start_time = time.time()
900
- # 使用优化后的函数找到最下方的行和最右边的列
901
- bottom = self.find_last_non_empty_row(top, bottom, left, right)
902
- if bottom == -1:
903
- return 'A1' # 空表返回A1占位
904
- right = self.find_last_non_empty_column(left, right, top, bottom)
905
- if right == -1:
906
- return 'A1'
907
-
908
- # 使用优化后的函数找到最上方的行和最左边的列
909
- top = self.find_first_non_empty_row(top, bottom, left, right)
910
- if top == -1:
911
- return 'A1'
912
- left = self.find_first_non_empty_column(left, right, top, bottom)
913
- if left == -1:
914
- return 'A1'
915
- # get_global_var('get_usedrange_time')[-1] += time.time() - start_time
916
-
917
- # 2 然后还要再扩范围(根据合并单元格情况)
918
- # start_time = time.time()
919
- top0, bottom0, left0, right0 = top, bottom, left, right
920
- for merged_range in self.merged_cells.ranges:
921
- l, t, r, b = merged_range.bounds
922
- if top0 <= b <= bottom0 or top0 <= t <= bottom0:
923
- if left0 <= r and l < left:
924
- left = l
925
- if l <= right0 and r > right:
926
- right = r
927
- if left0 <= r <= right0 or left0 <= l <= right0:
928
- if top0 <= b and t < top:
929
- top = t
930
- if t <= bottom0 and b > bottom:
931
- bottom = b
932
- # get_global_var('expandrange_time')[-1] += time.time() - start_time
933
-
934
- used_range = build_range_address(left=left, top=top, right=right, bottom=bottom)
935
- return used_range
905
+ if not hasattr(self, 'usedrange_cache'):
906
+ # 初始化边界值
907
+ left, right, top, bottom = self.min_column, self.max_column, self.min_row, self.max_row
908
+
909
+ # start_time = time.time()
910
+ # 使用优化后的函数找到最下方的行和最右边的列
911
+ bottom = self.find_last_non_empty_row(top, bottom, left, right)
912
+ if bottom == -1:
913
+ return 'A1' # 空表返回A1占位
914
+ right = self.find_last_non_empty_column(left, right, top, bottom)
915
+ if right == -1:
916
+ return 'A1'
917
+
918
+ # 使用优化后的函数找到最上方的行和最左边的列
919
+ top = self.find_first_non_empty_row(top, bottom, left, right)
920
+ if top == -1:
921
+ return 'A1'
922
+ left = self.find_first_non_empty_column(left, right, top, bottom)
923
+ if left == -1:
924
+ return 'A1'
925
+ # get_global_var('get_usedrange_time')[-1] += time.time() - start_time
926
+
927
+ # 2 然后还要再扩范围(根据合并单元格情况)
928
+ # start_time = time.time()
929
+ top0, bottom0, left0, right0 = top, bottom, left, right
930
+ for merged_range in self.merged_cells.ranges:
931
+ l, t, r, b = merged_range.bounds
932
+ if top0 <= b <= bottom0 or top0 <= t <= bottom0:
933
+ if left0 <= r and l < left:
934
+ left = l
935
+ if l <= right0 and r > right:
936
+ right = r
937
+ if left0 <= r <= right0 or left0 <= l <= right0:
938
+ if top0 <= b and t < top:
939
+ top = t
940
+ if t <= bottom0 and b > bottom:
941
+ bottom = b
942
+ # get_global_var('expandrange_time')[-1] += time.time() - start_time
943
+
944
+ self.used_range = build_range_address(left=left, top=top, right=right, bottom=bottom)
945
+
946
+ return self.used_range
936
947
 
937
948
  def copy_worksheet(self, dst_ws):
938
949
  """跨工作薄时复制表格内容的功能
@@ -967,7 +978,6 @@ class XlWorksheet(openpyxl.worksheet.worksheet.Worksheet):
967
978
  else:
968
979
  yield tuple(cells)
969
980
 
970
- @run_once('id,str')
971
981
  def search(self, pattern, min_row=None, max_row=None, min_col=None, max_col=None, order=None, direction=0):
972
982
  """ 查找满足pattern正则表达式的单元格
973
983
 
@@ -987,40 +997,55 @@ class XlWorksheet(openpyxl.worksheet.worksheet.Worksheet):
987
997
  >> ws.search('年段')
988
998
  <Cell '预算总表'.B2>
989
999
  """
990
- # 1 定界
991
- x1, x2 = max(min_row or 1, 1), min(max_row or self.max_row, self.max_row)
992
- y1, y2 = max(min_col or 1, 1), min(max_col or self.max_column, self.max_column)
993
-
994
- # 2 遍历
995
- if isinstance(pattern, datetime.date):
996
- pattern = f'^{(pattern - datetime.date(1899, 12, 30)).days}$'
997
-
998
- if isinstance(pattern, (list, tuple)):
999
- cel = None
1000
- for p in pattern:
1001
- cel = self.search(p, x1, x2, y1, y2, order)
1002
- if cel:
1003
- # up, down, left, right 找到的单元格四边界
1004
- l, u, r, d = getattr(cel.in_range(), 'bounds', (cel.column, cel.row, cel.column, cel.row))
1005
- if direction == 0:
1006
- x1, x2, y1, y2 = max(x1, d + 1), x2, max(y1, l), min(y2, r)
1007
- elif direction == 1:
1008
- x1, x2, y1, y2 = max(x1, u), min(x2, d), max(y1, r + 1), y2
1009
- elif direction == 2:
1010
- x1, x2, y1, y2 = x1, min(x2, u - 1), max(y1, l), min(y2, r)
1011
- elif direction == 3:
1012
- x1, x2, y1, y2 = max(x1, u), min(x2, d), y1, min(y2, l - 1)
1000
+ if not hasattr(self, 'search_cache'):
1001
+ self.search_cache = {}
1002
+
1003
+ if isinstance(pattern, list):
1004
+ pattern = tuple(pattern)
1005
+
1006
+ key = (pattern, min_row, max_row, min_col, max_col, order, direction)
1007
+
1008
+ def get_search_core():
1009
+ nonlocal pattern
1010
+ # 1 定界
1011
+ x1, x2 = max(min_row or 1, 1), min(max_row or self.max_row, self.max_row)
1012
+ y1, y2 = max(min_col or 1, 1), min(max_col or self.max_column, self.max_column)
1013
+
1014
+ # 2 遍历
1015
+ if isinstance(pattern, datetime.date):
1016
+ pattern = f'^{(pattern - datetime.date(1899, 12, 30)).days}$'
1017
+
1018
+ if isinstance(pattern, tuple):
1019
+ cel = None
1020
+ for p in pattern:
1021
+ cel = self.search(p, x1, x2, y1, y2, order)
1022
+ if cel:
1023
+ # up, down, left, right 找到的单元格四边界
1024
+ l, u, r, d = getattr(cel.in_range(), 'bounds', (cel.column, cel.row, cel.column, cel.row))
1025
+ if direction == 0:
1026
+ x1, x2, y1, y2 = max(x1, d + 1), x2, max(y1, l), min(y2, r)
1027
+ elif direction == 1:
1028
+ x1, x2, y1, y2 = max(x1, u), min(x2, d), max(y1, r + 1), y2
1029
+ elif direction == 2:
1030
+ x1, x2, y1, y2 = x1, min(x2, u - 1), max(y1, l), min(y2, r)
1031
+ elif direction == 3:
1032
+ x1, x2, y1, y2 = max(x1, u), min(x2, d), y1, min(y2, l - 1)
1033
+ else:
1034
+ raise ValueError(f'direction参数值错误{direction}')
1013
1035
  else:
1014
- raise ValueError(f'direction参数值错误{direction}')
1015
- else:
1016
- return None
1017
- return cel
1018
- else:
1019
- if isinstance(pattern, str): pattern = re.compile(pattern)
1020
- for x, y in product(range(x1, x2 + 1), range(y1, y2 + 1), order=order):
1021
- cell = self.cell(x, y)
1022
- if cell.celltype() == 1: continue # 过滤掉合并单元格位置
1023
- if pattern.search(str(cell.value)): return cell # 返回满足条件的第一个值
1036
+ return None
1037
+ return cel
1038
+ else:
1039
+ if isinstance(pattern, str): pattern = re.compile(pattern)
1040
+ for x, y in product(range(x1, x2 + 1), range(y1, y2 + 1), order=order):
1041
+ cell = self.cell(x, y)
1042
+ if cell.celltype() == 1: continue # 过滤掉合并单元格位置
1043
+ if pattern.search(str(cell.value)): return cell # 返回满足条件的第一个值
1044
+
1045
+ if key not in self.search_cache:
1046
+ self.search_cache[key] = get_search_core()
1047
+
1048
+ return self.search_cache[key]
1024
1049
 
1025
1050
  findcel = search
1026
1051
 
@@ -1571,12 +1596,12 @@ class XlWorksheet(openpyxl.worksheet.worksheet.Worksheet):
1571
1596
  current_alignment_dict.pop('wrapText', None)
1572
1597
  cell.alignment = Alignment(wrapText=True, **current_alignment_dict)
1573
1598
 
1574
- @run_once('id,str')
1575
1599
  def get_sorted_merged_cells(self):
1576
1600
  """ 将合并单元格按照行列顺序排列。
1577
1601
  """
1578
- rngs = list(sorted(self.merged_cells.ranges, key=lambda x: (x.min_row, x.min_col)))
1579
- return rngs
1602
+ if not hasattr(self, 'sorted_merged_cells'):
1603
+ self.sorted_merged_cells = list(sorted(self.merged_cells.ranges, key=lambda x: (x.min_row, x.min_col)))
1604
+ return self.sorted_merged_cells
1580
1605
 
1581
1606
 
1582
1607
  inject_members(XlWorksheet, openpyxl.worksheet.worksheet.Worksheet, white_list=['_cells_by_row'])
@@ -2359,7 +2384,6 @@ def extract_workbook_summary2(file_path, *,
2359
2384
 
2360
2385
  # 1 读取文件wb
2361
2386
  def read_file_by_type():
2362
- nonlocal load_time
2363
2387
  nonlocal load_time
2364
2388
  suffix = file_path.suffix.lower()
2365
2389
  start_time = time.time()
@@ -2382,7 +2406,10 @@ def extract_workbook_summary2(file_path, *,
2382
2406
  res['fileName'] = file_path.name
2383
2407
  wb = read_file_by_type()
2384
2408
  if wb is None: # 不支持的文件类型,不报错,只是返回最基本的文件名信息
2385
- return res
2409
+ if return_mode == 1:
2410
+ return res, load_time
2411
+ else:
2412
+ return res
2386
2413
 
2387
2414
  # 2 提取摘要
2388
2415
  summary2 = wb.extract_summary2()
@@ -2390,7 +2417,8 @@ def extract_workbook_summary2(file_path, *,
2390
2417
  if mode == 1:
2391
2418
  ws = wb.active
2392
2419
  res['ActiveSheet'] = ws.title
2393
- res['Selection'] = ws.selected_cell
2420
+ if hasattr(ws, 'selected_cell'):
2421
+ res['Selection'] = ws.selected_cell
2394
2422
 
2395
2423
  # res = convert_to_json_compatible(res)
2396
2424
 
@@ -2447,6 +2475,12 @@ def extract_workbook_summary2plus(file_path, **kwargs):
2447
2475
  class WorkbookSummary3:
2448
2476
  """ 计算summary3及衍生版本需要的一些功能组件 """
2449
2477
 
2478
+ @classmethod
2479
+ def count_length(cls, text):
2480
+ if not isinstance(text, str):
2481
+ text = json.dumps(text, ensure_ascii=False, default=str)
2482
+ return len(text)
2483
+
2450
2484
  @classmethod
2451
2485
  def reduce1_delete_empty_cell(cls, summary3):
2452
2486
  """ 删除空单元格 """
@@ -2476,7 +2510,7 @@ class WorkbookSummary3:
2476
2510
 
2477
2511
  # 如果未提供当前摘要长度,则计算之
2478
2512
  if cur_summary_len is None:
2479
- cur_summary_len = len(json.dumps(summary3, ensure_ascii=False))
2513
+ cur_summary_len = cls.count_length(summary3)
2480
2514
 
2481
2515
  # 1. 计算基准单元格长度
2482
2516
  total_cells_num = sum(len(st['cells']) + 5 for st in summary3['sheets'])
@@ -2507,7 +2541,7 @@ class WorkbookSummary3:
2507
2541
  @classmethod
2508
2542
  def reduce3_fold_rows(cls, summary3, summary_limit_len, *, cur_summary_len=None):
2509
2543
  if cur_summary_len is None:
2510
- cur_summary_len = len(json.dumps(summary3, ensure_ascii=False))
2544
+ cur_summary_len = cls.count_length(summary3)
2511
2545
 
2512
2546
  # 每个sheet本身其他摘要,按照5个单元格估算
2513
2547
  total_cells_num = sum([(len(st['cells']) + 5) for st in summary3['sheets']])
@@ -2583,7 +2617,7 @@ class WorkbookSummary3:
2583
2617
  @classmethod
2584
2618
  def reduce4_truncate_cells(cls, y, summary_limit_len, *, cur_summary_len=None):
2585
2619
  if cur_summary_len is None:
2586
- cur_summary_len = len(json.dumps(y, ensure_ascii=False))
2620
+ cur_summary_len = cls.count_length(y)
2587
2621
 
2588
2622
  # 1 预计要删除单元格数
2589
2623
  sheet_cells_num = [len(st['cells']) for st in y['sheets']]
@@ -2597,14 +2631,14 @@ class WorkbookSummary3:
2597
2631
  if total_cells_num < target_reduce_cells_num:
2598
2632
  for st in y['sheets']:
2599
2633
  st['cells'] = {}
2600
- return len(json.dumps(y, ensure_ascii=False))
2634
+ return cls.count_length(y)
2601
2635
 
2602
2636
  # 3 否则每张表按照比例删单元格,只保留前面部分的单元格
2603
2637
  left_rate = 1 - target_reduce_cells_num / total_cells_num
2604
2638
  while True:
2605
2639
  for i, st in enumerate(y['sheets']):
2606
2640
  st['cells'] = dict(islice(st['cells'].items(), int(left_rate * sheet_cells_num[i])))
2607
- cur_summary_len = len(json.dumps(y, ensure_ascii=False))
2641
+ cur_summary_len = cls.count_length(y)
2608
2642
  if cur_summary_len <= summary_limit_len:
2609
2643
  return cur_summary_len
2610
2644
  if left_rate * total_cells_num < 1:
@@ -2618,7 +2652,7 @@ class WorkbookSummary3:
2618
2652
  def reduce5_truncate_sheets(cls, y, summary_limit_len, *, cur_summary_len=None):
2619
2653
  """ 计算平均每张表的长度,保留前面部分的表格 """
2620
2654
  if cur_summary_len is None:
2621
- cur_summary_len = len(json.dumps(y, ensure_ascii=False))
2655
+ cur_summary_len = cls.count_length(y)
2622
2656
 
2623
2657
  n = len(y['sheets'])
2624
2658
  avg_sheet_len = cur_summary_len / n
@@ -2626,7 +2660,7 @@ class WorkbookSummary3:
2626
2660
  y['sheets'] = y['sheets'][:n - target_reduce_sheet_num]
2627
2661
 
2628
2662
  while y['sheets']:
2629
- cur_summary_len = len(json.dumps(y, ensure_ascii=False))
2663
+ cur_summary_len = cls.count_length(y)
2630
2664
  if cur_summary_len <= summary_limit_len:
2631
2665
  return cur_summary_len
2632
2666
  y['sheets'] = y['sheets'][:-1] # 依次尝试删除最后一张表格的详细信息
@@ -2645,13 +2679,13 @@ class WorkbookSummary3:
2645
2679
  ]
2646
2680
 
2647
2681
  # 0 摘要本来就不大
2648
- cur_summary_len = len(json.dumps(y, ensure_ascii=False))
2682
+ cur_summary_len = cls.count_length(y)
2649
2683
  if cur_summary_len <= summary_limit_len:
2650
2684
  return y
2651
2685
 
2652
2686
  # 1 删除空单元格
2653
2687
  cls.reduce1_delete_empty_cell(y)
2654
- cur_summary_len = len(json.dumps(y, ensure_ascii=False))
2688
+ cur_summary_len = cls.count_length(y)
2655
2689
  if cur_summary_len <= summary_limit_len:
2656
2690
  y['mode'] = ', '.join(mode_tags[:1])
2657
2691
  return y
@@ -2664,7 +2698,7 @@ class WorkbookSummary3:
2664
2698
 
2665
2699
  # 3 同构数据,省略显示(有大量相同行数据,折叠省略表达)
2666
2700
  cls.reduce3_fold_rows(y, summary_limit_len, cur_summary_len=cur_summary_len)
2667
- cur_summary_len = len(json.dumps(y, ensure_ascii=False))
2701
+ cur_summary_len = cls.count_length(y)
2668
2702
  if cur_summary_len <= summary_limit_len:
2669
2703
  y['mode'] = ', '.join(mode_tags[:3])
2670
2704
  return y
@@ -2708,7 +2742,7 @@ class WorkbookSummary3:
2708
2742
  :param active_sheet_weight: 当前活动表格被删除的权重,0.5表示按比例被删除的量只有其他表格的一半
2709
2743
  """
2710
2744
  if cur_summary_len is None:
2711
- cur_summary_len = len(json.dumps(y, ensure_ascii=False))
2745
+ cur_summary_len = cls.count_length(y)
2712
2746
 
2713
2747
  active_sheet = y['ActiveSheet']
2714
2748
 
@@ -2738,7 +2772,7 @@ class WorkbookSummary3:
2738
2772
  if total_cells_num < target_reduce_cells_num:
2739
2773
  for st in y['sheets']:
2740
2774
  st['cells'] = {}
2741
- return len(json.dumps(y, ensure_ascii=False))
2775
+ return cls.count_length(y)
2742
2776
 
2743
2777
  # 4 否则每张表按照比例删单元格,只保留前面部分的单元格
2744
2778
  left_rate = 1 - r # 原始保留比例
@@ -2750,7 +2784,7 @@ class WorkbookSummary3:
2750
2784
  else:
2751
2785
  # 其他sheet按照w2权重删除单元格
2752
2786
  st['cells'] = dict(islice(st['cells'].items(), int(left_rate * w2 * sheet_cells_num[i])))
2753
- cur_summary_len = len(json.dumps(y, ensure_ascii=False))
2787
+ cur_summary_len = cls.count_length(y)
2754
2788
  if cur_summary_len <= summary_limit_len:
2755
2789
  return cur_summary_len
2756
2790
  if left_rate * total_cells_num < 1:
@@ -2764,7 +2798,7 @@ class WorkbookSummary3:
2764
2798
  def reduce5b(cls, y, summary_limit_len, *, cur_summary_len=None):
2765
2799
  """ 计算平均每张表的长度,保留前面部分的表格 """
2766
2800
  if cur_summary_len is None:
2767
- cur_summary_len = len(json.dumps(y, ensure_ascii=False))
2801
+ cur_summary_len = cls.count_length(y)
2768
2802
 
2769
2803
  n = len(y['sheets'])
2770
2804
  active_sheet_name = y['ActiveSheet']
@@ -2774,7 +2808,7 @@ class WorkbookSummary3:
2774
2808
  # y['sheets'] = y['sheets'][:n - target_reduce_sheet_num]
2775
2809
 
2776
2810
  while y['sheets']:
2777
- cur_summary_len = len(json.dumps(y, ensure_ascii=False))
2811
+ cur_summary_len = cls.count_length(y)
2778
2812
  if cur_summary_len <= summary_limit_len:
2779
2813
  return cur_summary_len
2780
2814
 
@@ -2803,13 +2837,13 @@ class WorkbookSummary3:
2803
2837
  ]
2804
2838
 
2805
2839
  # 0 摘要本来就不大
2806
- cur_summary_len = len(json.dumps(y, ensure_ascii=False))
2840
+ cur_summary_len = cls.count_length(y)
2807
2841
  if cur_summary_len <= summary_limit_len:
2808
2842
  return y
2809
2843
 
2810
2844
  # 1 删除空单元格
2811
2845
  cls.reduce1_delete_empty_cell(y)
2812
- cur_summary_len = len(json.dumps(y, ensure_ascii=False))
2846
+ cur_summary_len = cls.count_length(y)
2813
2847
  if cur_summary_len <= summary_limit_len:
2814
2848
  y['mode'] = ', '.join(mode_tags[:1])
2815
2849
  return y
@@ -2822,7 +2856,7 @@ class WorkbookSummary3:
2822
2856
 
2823
2857
  # 3 同构数据,省略显示(有大量相同行数据,折叠省略表达)
2824
2858
  cls.reduce3_fold_rows(y, summary_limit_len, cur_summary_len=cur_summary_len)
2825
- cur_summary_len = len(json.dumps(y, ensure_ascii=False))
2859
+ cur_summary_len = cls.count_length(y)
2826
2860
  if cur_summary_len <= summary_limit_len:
2827
2861
  y['mode'] = ', '.join(mode_tags[:3])
2828
2862
  return y
@@ -2845,8 +2879,10 @@ class WorkbookSummary3:
2845
2879
  'sheets': x['sheets'],
2846
2880
  'mode': 'Complete information',
2847
2881
  'ActiveSheet': x['ActiveSheet'], # 当期激活的工作表
2848
- 'Selection': x['Selection'],
2849
2882
  }
2883
+ if 'Selection' in x:
2884
+ # 最多截取250个字符。(一般情况下这个很小的,只是在很极端情况,比如离散选中了非常多区域,这个可能就会太长
2885
+ y['Selection'] = x['Selection'][:250]
2850
2886
 
2851
2887
  # 处理前确保下cells字段存在,避免后续很多处理过程要特判
2852
2888
  for st in y['sheets']:
@@ -2863,6 +2899,17 @@ class WorkbookSummary3:
2863
2899
  return y
2864
2900
 
2865
2901
 
2902
+ class WorkbookSummary3plus(WorkbookSummary3):
2903
+ """ 标准的token计算方式,不过暂不打算实装使用 """
2904
+
2905
+ @classmethod
2906
+ def count_length(cls, text):
2907
+ from pyxlpr.data.gptlib import Tokenizer
2908
+ if not isinstance(text, str):
2909
+ text = json.dumps(text, ensure_ascii=False, default=str)
2910
+ return Tokenizer.count_tokens(text)
2911
+
2912
+
2866
2913
  def extract_workbook_summary3(file_path, summary_limit_len=4000, **kwargs):
2867
2914
  """ 增加了全局ratio的计算 """
2868
2915
  data = extract_workbook_summary2(file_path, **kwargs)
@@ -2874,28 +2921,25 @@ def extract_workbook_summary3(file_path, summary_limit_len=4000, **kwargs):
2874
2921
 
2875
2922
  def extract_workbook_summary3b(file_path,
2876
2923
  summary_limit_len=4000,
2877
- timeout_seconds=60,
2924
+ timeout_seconds=10,
2878
2925
  return_mode=0,
2926
+ debug=False,
2927
+ len_mode=0,
2879
2928
  **kwargs):
2880
2929
  """
2881
2930
 
2882
2931
  :param summary_limit_len: 摘要长度限制
2883
2932
  :param timeout_seconds: 超时限制
2884
2933
  :param return_mode: 返回模式,0表示只返回摘要,1表示返回摘要和耗时
2934
+ :param len_mode:
2935
+ 0, 使用len作为token长度评估
2936
+ 1, 使用模型评估实际token长度
2885
2937
  :param kwargs: 其他是summary2读取文件的时候的参数,其实都不太关键,一般不用特地设置
2886
2938
  """
2887
2939
  res = {}
2888
- res['fileName'] = file_path.name
2940
+ res['fileName'] = Path(file_path).name
2889
2941
  load_time = summary2_time = summary3_time = -1
2890
2942
 
2891
- # with Timeout(timeout_seconds):
2892
- # start_time = time.time()
2893
- # res, load_time = extract_workbook_summary2(file_path, mode=1, return_mode=1, **kwargs)
2894
- # summary2_time = time.time() - start_time - load_time
2895
- # start_time = time.time()
2896
- # res = WorkbookSummary3.summary2_to_summary3b(res, summary_limit_len)
2897
- # summary3_time = time.time() - start_time
2898
-
2899
2943
  try:
2900
2944
  with Timeout(timeout_seconds):
2901
2945
  start_time = time.time()
@@ -2903,12 +2947,18 @@ def extract_workbook_summary3b(file_path,
2903
2947
  # res = convert_to_json_compatible(res)
2904
2948
  summary2_time = time.time() - start_time - load_time
2905
2949
  start_time = time.time()
2906
- res = WorkbookSummary3.summary2_to_summary3b(res, summary_limit_len)
2950
+ if len_mode == 1:
2951
+ res = WorkbookSummary3plus.summary2_to_summary3b(res, summary_limit_len)
2952
+ else:
2953
+ res = WorkbookSummary3.summary2_to_summary3b(res, summary_limit_len)
2907
2954
  summary3_time = time.time() - start_time
2908
- except TimeoutError:
2955
+ except TimeoutError as e:
2956
+ if debug:
2957
+ raise e
2909
2958
  res['error'] = f'超时,未完成摘要提取:{timeout_seconds}秒'
2910
2959
  except Exception as e:
2911
- # raise e
2960
+ if debug:
2961
+ raise e
2912
2962
  res['error'] = f'提取摘要时发生错误:{format_exception(e, 2)}'
2913
2963
 
2914
2964
  if return_mode == 1: