pyxllib 0.3.124__tar.gz → 0.3.126__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 (360) hide show
  1. pyxllib-0.3.126/MANIFEST.in +4 -0
  2. {pyxllib-0.3.124/pyxllib.egg-info → pyxllib-0.3.126}/PKG-INFO +1 -1
  3. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/data/pglib.py +130 -0
  4. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/ext/drissionlib.py +33 -1
  5. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/ext/unixlib.py +6 -0
  6. pyxllib-0.3.126/pyxllib/ext/yuquelib.py +294 -0
  7. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/file/xlsxlib.py +24 -19
  8. pyxllib-0.3.126/pyxllib/text/templates/echart_base.html +11 -0
  9. pyxllib-0.3.126/pyxllib/text/templates/highlight_code.html +17 -0
  10. pyxllib-0.3.126/pyxllib/text/templates/latex_editor.html +103 -0
  11. {pyxllib-0.3.124 → pyxllib-0.3.126/pyxllib.egg-info}/PKG-INFO +1 -1
  12. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib.egg-info/SOURCES.txt +3 -0
  13. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib.egg-info/requires.txt +14 -11
  14. pyxllib-0.3.126/pyxlpr/openai2/__init__.py +3 -0
  15. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/openai2/_core/chat.py +236 -0
  16. {pyxllib-0.3.124 → pyxllib-0.3.126}/setup.py +4 -1
  17. pyxllib-0.3.124/MANIFEST.in +0 -3
  18. pyxllib-0.3.124/pyxllib/ext/yuquelib.py +0 -173
  19. pyxllib-0.3.124/pyxlpr/openai2/__init__.py +0 -3
  20. {pyxllib-0.3.124 → pyxllib-0.3.126}/LICENSE +0 -0
  21. {pyxllib-0.3.124 → pyxllib-0.3.126}/README.md +0 -0
  22. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/__init__.py +0 -0
  23. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/algo/__init__.py +0 -0
  24. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/algo/disjoint.py +0 -0
  25. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/algo/geo.py +0 -0
  26. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/algo/intervals.py +0 -0
  27. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/algo/matcher.py +0 -0
  28. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/algo/newbie.py +0 -0
  29. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/algo/pupil.py +0 -0
  30. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/algo/shapelylib.py +0 -0
  31. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/algo/specialist.py +0 -0
  32. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/algo/stat.py +0 -0
  33. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/algo/treelib.py +0 -0
  34. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/algo/unitlib.py +0 -0
  35. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/cv/__init__.py +0 -0
  36. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/cv/expert.py +0 -0
  37. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/cv/imfile.py +0 -0
  38. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/cv/imhash.py +0 -0
  39. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/cv/pupil.py +0 -0
  40. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/cv/rgbfmt.py +0 -0
  41. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/cv/trackbartools.py +0 -0
  42. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/cv/xlcvlib.py +0 -0
  43. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/cv/xlpillib.py +0 -0
  44. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/data/__init__.py +0 -0
  45. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/data/echarts.py +0 -0
  46. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/data/jsonlib.py +0 -0
  47. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/data/oss.py +0 -0
  48. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/data/sqlite.py +0 -0
  49. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/data/sqllib.py +0 -0
  50. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/ext/JLineViewer.py +0 -0
  51. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/ext/__init__.py +0 -0
  52. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/ext/autogui/__init__.py +0 -0
  53. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/ext/autogui/autogui.py +0 -0
  54. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/ext/autogui/virtualkey.py +0 -0
  55. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/ext/demolib.py +0 -0
  56. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/ext/kq5034lib.py +0 -0
  57. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/ext/old.py +0 -0
  58. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/ext/qt.py +0 -0
  59. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/ext/robustprocfile.py +0 -0
  60. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/ext/seleniumlib.py +0 -0
  61. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/ext/tk.py +0 -0
  62. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/ext/utools.py +0 -0
  63. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/ext/webhook.py +0 -0
  64. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/ext/win32lib.py +0 -0
  65. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/file/__init__.py +0 -0
  66. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/file/docxlib.py +0 -0
  67. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/file/gitlib.py +0 -0
  68. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/file/libreoffice.py +0 -0
  69. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/file/movielib.py +0 -0
  70. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/file/newbie.py +0 -0
  71. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/file/onenotelib.py +0 -0
  72. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/file/packlib/__init__.py +0 -0
  73. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/file/packlib/zipfile.py +0 -0
  74. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/file/pdflib.py +0 -0
  75. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/file/pupil.py +0 -0
  76. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/file/specialist/__init__.py +0 -0
  77. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/file/specialist/dirlib.py +0 -0
  78. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/file/specialist/download.py +0 -0
  79. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/file/specialist/filelib.py +0 -0
  80. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/prog/__init__.py +0 -0
  81. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/prog/cachetools.py +0 -0
  82. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/prog/deprecatedlib.py +0 -0
  83. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/prog/ipyexec.py +0 -0
  84. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/prog/multiprocs.py +0 -0
  85. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/prog/newbie.py +0 -0
  86. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/prog/pupil.py +0 -0
  87. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/prog/scheduler.py +0 -0
  88. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/prog/sitepackages.py +0 -0
  89. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/prog/specialist/__init__.py +0 -0
  90. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/prog/specialist/bc.py +0 -0
  91. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/prog/specialist/browser.py +0 -0
  92. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/prog/specialist/common.py +0 -0
  93. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/prog/specialist/datetime.py +0 -0
  94. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/prog/specialist/tictoc.py +0 -0
  95. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/prog/specialist/xllog.py +0 -0
  96. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/prog/xlosenv.py +0 -0
  97. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/stdlib/__init__.py +0 -0
  98. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/stdlib/tablepyxl/__init__.py +0 -0
  99. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/stdlib/tablepyxl/style.py +0 -0
  100. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/stdlib/tablepyxl/tablepyxl.py +0 -0
  101. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/__init__.py +0 -0
  102. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/ahocorasick.py +0 -0
  103. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/charclasslib.py +0 -0
  104. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/jiebalib.py +0 -0
  105. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/jinjalib.py +0 -0
  106. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/jscode.py +0 -0
  107. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/latex/__init__.py +0 -0
  108. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/levenshtein.py +0 -0
  109. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/nestenv.py +0 -0
  110. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/newbie.py +0 -0
  111. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/pupil/__init__.py +0 -0
  112. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/pupil/common.py +0 -0
  113. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/pupil/xlalign.py +0 -0
  114. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/pycode.py +0 -0
  115. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/specialist/__init__.py +0 -0
  116. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/specialist/common.py +0 -0
  117. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/specialist/ptag.py +0 -0
  118. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/spellchecker.py +0 -0
  119. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/vbacode.py +0 -0
  120. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/xmllib.py +0 -0
  121. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/xl.py +0 -0
  122. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/xlcv.py +0 -0
  123. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib.egg-info/dependency_links.txt +0 -0
  124. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib.egg-info/top_level.txt +0 -0
  125. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/__init__.py +0 -0
  126. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ai/__init__.py +0 -0
  127. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ai/clientlib.py +0 -0
  128. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ai/specialist.py +0 -0
  129. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ai/torch_app.py +0 -0
  130. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ai/xlpaddle.py +0 -0
  131. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ai/xltorch.py +0 -0
  132. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/data/__init__.py +0 -0
  133. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/data/coco.py +0 -0
  134. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/data/datacls.py +0 -0
  135. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/data/datasets.py +0 -0
  136. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/data/gptlib.py +0 -0
  137. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/data/icdar/__init__.py +0 -0
  138. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/data/icdar/deteval.py +0 -0
  139. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/data/icdar/icdar2013.py +0 -0
  140. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/data/icdar/iou.py +0 -0
  141. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/data/icdar/rrc_evaluation_funcs_1_1.py +0 -0
  142. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/data/imtextline.py +0 -0
  143. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/data/labelme.py +0 -0
  144. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/data/removeline.py +0 -0
  145. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/data/specialist.py +0 -0
  146. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/data/tiktokenlib.py +0 -0
  147. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/eval/__init__.py +0 -0
  148. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/openai2/_core/chat_in_cmd.py +0 -0
  149. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/openai2/_core/group_chat.py +0 -0
  150. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/openai2/openai2.py +0 -0
  151. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/paddleocr.py +0 -0
  152. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/__init__.py +0 -0
  153. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/configs/rec/multi_language/generate_multi_language_configs.py +0 -0
  154. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/__init__.py +0 -0
  155. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/imaug/ColorJitter.py +0 -0
  156. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/imaug/__init__.py +0 -0
  157. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/imaug/copy_paste.py +0 -0
  158. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/imaug/east_process.py +0 -0
  159. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/imaug/gen_table_mask.py +0 -0
  160. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/imaug/iaa_augment.py +0 -0
  161. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/imaug/label_ops.py +0 -0
  162. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/imaug/make_border_map.py +0 -0
  163. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/imaug/make_pse_gt.py +0 -0
  164. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/imaug/make_shrink_map.py +0 -0
  165. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/imaug/operators.py +0 -0
  166. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/imaug/pg_process.py +0 -0
  167. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/imaug/randaugment.py +0 -0
  168. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/imaug/random_crop_data.py +0 -0
  169. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/imaug/rec_img_aug.py +0 -0
  170. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/imaug/sast_process.py +0 -0
  171. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/imaug/text_image_aug/__init__.py +0 -0
  172. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/imaug/text_image_aug/augment.py +0 -0
  173. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/imaug/text_image_aug/warp_mls.py +0 -0
  174. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/lmdb_dataset.py +0 -0
  175. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/pgnet_dataset.py +0 -0
  176. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/pubtab_dataset.py +0 -0
  177. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/simple_dataset.py +0 -0
  178. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/__init__.py +0 -0
  179. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/ace_loss.py +0 -0
  180. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/basic_loss.py +0 -0
  181. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/center_loss.py +0 -0
  182. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/cls_loss.py +0 -0
  183. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/combined_loss.py +0 -0
  184. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/det_basic_loss.py +0 -0
  185. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/det_db_loss.py +0 -0
  186. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/det_east_loss.py +0 -0
  187. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/det_pse_loss.py +0 -0
  188. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/det_sast_loss.py +0 -0
  189. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/distillation_loss.py +0 -0
  190. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/e2e_pg_loss.py +0 -0
  191. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/kie_sdmgr_loss.py +0 -0
  192. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/rec_aster_loss.py +0 -0
  193. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/rec_att_loss.py +0 -0
  194. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/rec_ctc_loss.py +0 -0
  195. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/rec_enhanced_ctc_loss.py +0 -0
  196. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/rec_nrtr_loss.py +0 -0
  197. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/rec_sar_loss.py +0 -0
  198. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/rec_srn_loss.py +0 -0
  199. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/table_att_loss.py +0 -0
  200. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/metrics/__init__.py +0 -0
  201. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/metrics/cls_metric.py +0 -0
  202. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/metrics/det_metric.py +0 -0
  203. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/metrics/distillation_metric.py +0 -0
  204. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/metrics/e2e_metric.py +0 -0
  205. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/metrics/eval_det_iou.py +0 -0
  206. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/metrics/kie_metric.py +0 -0
  207. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/metrics/rec_metric.py +0 -0
  208. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/metrics/table_metric.py +0 -0
  209. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/architectures/__init__.py +0 -0
  210. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/architectures/base_model.py +0 -0
  211. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/architectures/distillation_model.py +0 -0
  212. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/backbones/__init__.py +0 -0
  213. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/backbones/det_mobilenet_v3.py +0 -0
  214. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/backbones/det_resnet_vd.py +0 -0
  215. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/backbones/det_resnet_vd_sast.py +0 -0
  216. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/backbones/e2e_resnet_vd_pg.py +0 -0
  217. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/backbones/kie_unet_sdmgr.py +0 -0
  218. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/backbones/rec_mobilenet_v3.py +0 -0
  219. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/backbones/rec_mv1_enhance.py +0 -0
  220. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/backbones/rec_nrtr_mtb.py +0 -0
  221. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/backbones/rec_resnet_31.py +0 -0
  222. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/backbones/rec_resnet_aster.py +0 -0
  223. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/backbones/rec_resnet_fpn.py +0 -0
  224. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/backbones/rec_resnet_vd.py +0 -0
  225. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/heads/__init__.py +0 -0
  226. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/heads/cls_head.py +0 -0
  227. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/heads/det_db_head.py +0 -0
  228. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/heads/det_east_head.py +0 -0
  229. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/heads/det_pse_head.py +0 -0
  230. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/heads/det_sast_head.py +0 -0
  231. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/heads/e2e_pg_head.py +0 -0
  232. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/heads/kie_sdmgr_head.py +0 -0
  233. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/heads/multiheadAttention.py +0 -0
  234. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/heads/rec_aster_head.py +0 -0
  235. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/heads/rec_att_head.py +0 -0
  236. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/heads/rec_ctc_head.py +0 -0
  237. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/heads/rec_nrtr_head.py +0 -0
  238. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/heads/rec_sar_head.py +0 -0
  239. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/heads/rec_srn_head.py +0 -0
  240. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/heads/self_attention.py +0 -0
  241. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/heads/table_att_head.py +0 -0
  242. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/necks/__init__.py +0 -0
  243. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/necks/db_fpn.py +0 -0
  244. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/necks/east_fpn.py +0 -0
  245. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/necks/fpn.py +0 -0
  246. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/necks/pg_fpn.py +0 -0
  247. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/necks/rnn.py +0 -0
  248. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/necks/sast_fpn.py +0 -0
  249. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/necks/table_fpn.py +0 -0
  250. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/transforms/__init__.py +0 -0
  251. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/transforms/stn.py +0 -0
  252. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/transforms/tps.py +0 -0
  253. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/transforms/tps_spatial_transformer.py +0 -0
  254. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/optimizer/__init__.py +0 -0
  255. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/optimizer/learning_rate.py +0 -0
  256. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/optimizer/lr_scheduler.py +0 -0
  257. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/optimizer/optimizer.py +0 -0
  258. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/optimizer/regularizer.py +0 -0
  259. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/postprocess/__init__.py +0 -0
  260. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/postprocess/cls_postprocess.py +0 -0
  261. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/postprocess/db_postprocess.py +0 -0
  262. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/postprocess/east_postprocess.py +0 -0
  263. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/postprocess/locality_aware_nms.py +0 -0
  264. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/postprocess/pg_postprocess.py +0 -0
  265. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/postprocess/pse_postprocess/__init__.py +0 -0
  266. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/postprocess/pse_postprocess/pse/__init__.py +0 -0
  267. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/postprocess/pse_postprocess/pse/setup.py +0 -0
  268. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/postprocess/pse_postprocess/pse_postprocess.py +0 -0
  269. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/postprocess/rec_postprocess.py +0 -0
  270. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/postprocess/sast_postprocess.py +0 -0
  271. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/__init__.py +0 -0
  272. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/eval.py +0 -0
  273. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/export_center.py +0 -0
  274. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/export_model.py +0 -0
  275. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/infer/predict_cls.py +0 -0
  276. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/infer/predict_det.py +0 -0
  277. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/infer/predict_e2e.py +0 -0
  278. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/infer/predict_rec.py +0 -0
  279. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/infer/predict_system.py +0 -0
  280. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/infer/utility.py +0 -0
  281. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/infer_cls.py +0 -0
  282. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/infer_det.py +0 -0
  283. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/infer_e2e.py +0 -0
  284. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/infer_kie.py +0 -0
  285. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/infer_rec.py +0 -0
  286. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/infer_table.py +0 -0
  287. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/program.py +0 -0
  288. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/test_hubserving.py +0 -0
  289. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/train.py +0 -0
  290. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/xlprog.py +0 -0
  291. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/EN_symbol_dict.txt +0 -0
  292. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/__init__.py +0 -0
  293. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/ar_dict.txt +0 -0
  294. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/arabic_dict.txt +0 -0
  295. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/be_dict.txt +0 -0
  296. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/bg_dict.txt +0 -0
  297. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/chinese_cht_dict.txt +0 -0
  298. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/cyrillic_dict.txt +0 -0
  299. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/devanagari_dict.txt +0 -0
  300. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/en_dict.txt +0 -0
  301. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/fa_dict.txt +0 -0
  302. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/french_dict.txt +0 -0
  303. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/german_dict.txt +0 -0
  304. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/hi_dict.txt +0 -0
  305. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/it_dict.txt +0 -0
  306. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/japan_dict.txt +0 -0
  307. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/ka_dict.txt +0 -0
  308. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/korean_dict.txt +0 -0
  309. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/latin_dict.txt +0 -0
  310. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/mr_dict.txt +0 -0
  311. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/ne_dict.txt +0 -0
  312. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/oc_dict.txt +0 -0
  313. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/pu_dict.txt +0 -0
  314. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/rs_dict.txt +0 -0
  315. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/rsc_dict.txt +0 -0
  316. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/ru_dict.txt +0 -0
  317. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/ta_dict.txt +0 -0
  318. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/table_dict.txt +0 -0
  319. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/table_structure_dict.txt +0 -0
  320. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/te_dict.txt +0 -0
  321. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/ug_dict.txt +0 -0
  322. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/uk_dict.txt +0 -0
  323. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/ur_dict.txt +0 -0
  324. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/xi_dict.txt +0 -0
  325. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict90.txt +0 -0
  326. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/e2e_metric/Deteval.py +0 -0
  327. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/e2e_metric/polygon_fast.py +0 -0
  328. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/e2e_utils/extract_batchsize.py +0 -0
  329. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_fast.py +0 -0
  330. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_slow.py +0 -0
  331. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/e2e_utils/pgnet_pp_utils.py +0 -0
  332. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/e2e_utils/visual.py +0 -0
  333. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/en_dict.txt +0 -0
  334. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/gen_label.py +0 -0
  335. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/ic15_dict.txt +0 -0
  336. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/iou.py +0 -0
  337. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/logging.py +0 -0
  338. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/network.py +0 -0
  339. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/ppocr_keys_v1.txt +0 -0
  340. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/profiler.py +0 -0
  341. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/save_load.py +0 -0
  342. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/stats.py +0 -0
  343. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/utility.py +0 -0
  344. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppstructure/__init__.py +0 -0
  345. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppstructure/predict_system.py +0 -0
  346. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppstructure/table/__init__.py +0 -0
  347. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppstructure/table/eval_table.py +0 -0
  348. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppstructure/table/matcher.py +0 -0
  349. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppstructure/table/predict_structure.py +0 -0
  350. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppstructure/table/predict_table.py +0 -0
  351. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppstructure/table/table_metric/__init__.py +0 -0
  352. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppstructure/table/table_metric/parallel.py +0 -0
  353. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppstructure/table/table_metric/table_metric.py +0 -0
  354. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppstructure/table/tablepyxl/__init__.py +0 -0
  355. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppstructure/table/tablepyxl/style.py +0 -0
  356. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppstructure/table/tablepyxl/tablepyxl.py +0 -0
  357. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppstructure/utility.py +0 -0
  358. {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/xlai.py +0 -0
  359. {pyxllib-0.3.124 → pyxllib-0.3.126}/requirements.txt +0 -0
  360. {pyxllib-0.3.124 → pyxllib-0.3.126}/setup.cfg +0 -0
@@ -0,0 +1,4 @@
1
+ include README.md
2
+ include requirements.txt
3
+ recursive-include pyxllib *.html
4
+ recursive-include pyxlpr *.py *.txt
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyxllib
3
- Version: 0.3.124
3
+ Version: 0.3.126
4
4
  Summary: 厦门理工模式识别团队通用python代码工具库
5
5
  Home-page: https://github.com/XLPRUtils/pyxllib
6
6
  Author: code4101
@@ -801,6 +801,136 @@ class XlprDb(Connection):
801
801
 
802
802
  return '<body>' + chart.render_embed() + '</body>', sum(all_users_usaged.values())
803
803
 
804
+ # cdx_edit
805
+ def _get_database_trace_total(self, title, yaxis_name, date_trunc, recent, link_name):
806
+ ls = self.execute(textwrap.dedent(f"""\
807
+ WITH cte1 AS(
808
+ SELECT link_name, jsonb_each(status::jsonb) AS db_data, date_trunc('{date_trunc}', update_time) ttime
809
+ FROM database_trace WHERE update_time > %s AND link_name = '{link_name}'
810
+ ), cte2 AS(
811
+ SELECT ttime, link_name, (db_data).key AS table_name, ((db_data).value->> '_total')::bigint AS total
812
+ FROM cte1
813
+ )
814
+ SELECT ttime, jsonb_object_agg(table_name, total) AS aggregated_json,SUM(total) as total
815
+ FROM cte2
816
+ GROUP BY ttime
817
+ ORDER BY ttime"""), ((utc_now(8) - recent).isoformat(timespec='seconds'),)).fetchall()
818
+ return self.database_create_stack_chart(title, ls, yaxis_name=yaxis_name)
819
+
820
+
821
+ def _get_database_trace_per_host(self, db, title, yaxis_name, date_trunc, recent, link_name):
822
+ ls = self.execute(textwrap.dedent(f"""\
823
+ WITH cte1 AS (
824
+ SELECT link_name, jsonb_each(status::jsonb) AS db_data, date_trunc('{date_trunc}', update_time) ttime
825
+ FROM database_trace WHERE update_time > %s AND link_name = '{link_name}'
826
+ ), cte2 AS (
827
+ SELECT ttime, link_name, (db_data).key AS table_name, (db_data).value AS size_text
828
+ FROM cte1
829
+ ), cte3 AS (
830
+ SELECT ttime, table_name, each.key AS key, each.value AS value
831
+ FROM cte2, jsonb_each_text(size_text) AS each(key, value)
832
+ )
833
+ SELECT ttime, jsonb_object_agg(key,
834
+ CASE
835
+ WHEN key = '_total' THEN NULL
836
+ ELSE (value::jsonb ->> 'size')::bigint -- Handle other keys as usual
837
+ END
838
+ ) FILTER (WHERE key != '_total') AS aggregated_result, -- 确保 _total 不在 aggregated_result 中
839
+ MAX(CASE WHEN key = '_total' THEN value::bigint ELSE NULL END) AS total -- 单独提取 _total 的值
840
+ FROM cte3
841
+ WHERE (key = '_total' OR value::jsonb ? 'size') -- Ensure that '_total' is included
842
+ AND table_name = '{db}'
843
+ GROUP BY ttime
844
+ ORDER BY ttime"""), ((utc_now(8) - recent).isoformat(timespec='seconds'),)).fetchall()
845
+ return self.database_create_stack_chart(title, ls, yaxis_name=yaxis_name)
846
+
847
+ def database_create_stack_chart(self, title, ls, *, yaxis_name=''):
848
+ """ 创建展示表
849
+
850
+ :param title: 表格标题
851
+ :param list ls: n*3,第1列是时间,第3列是总值,第2列是每个用户具体的数据
852
+ """
853
+ from pyecharts.charts import Line
854
+ all_database_usaged = Counter()
855
+ last_time = None
856
+ for x in ls:
857
+ hours = 0 if last_time is None else ((x[0] - last_time).total_seconds() / 3600)
858
+ last_time = x[0]
859
+ for k, v in x[1].items():
860
+ if k == '_total':
861
+ continue
862
+ all_database_usaged[k] += v * hours
863
+
864
+ for i, x in enumerate(ls):
865
+ ct = Counter()
866
+ for k, v in x[1].items():
867
+ ct[k] += v
868
+ ls[i] = (x[0], ct, int(x[2]))
869
+
870
+ # 2 转图表可视化
871
+ def to_list(values):
872
+ return [(x[0], v) for x, v in zip(ls, values)]
873
+
874
+ def pretty_val(v):
875
+ return round_int(v) if v > 100 else round(v, 2)
876
+
877
+ chart = Line()
878
+ chart.set_title(title)
879
+ chart.options['xAxis'][0].update({'min': ls[0][0], 'type': 'time',
880
+ # 'minInterval': 3600 * 1000 * 24,
881
+ 'name': '时间', 'nameGap': 50, 'nameLocation': 'middle'})
882
+ chart.options['yAxis'][0].update({'name': yaxis_name, 'nameGap': 50, 'nameLocation': 'middle'})
883
+ # 目前是比较暴力的方法调整排版,后续要研究是不是能更自动灵活些
884
+ chart.options['legend'][0].update({'top': '6%', 'icon': 'pin'})
885
+ chart.options['grid'] = [{'top': 55 + len(all_database_usaged) * 4 , 'containLabel': True}]
886
+ chart.options['tooltip'].opts.update({'axisPointer': {'type': 'cross'}, 'trigger': 'item'})
887
+
888
+ chart.add_series(f'total {pretty_val(ls[0][2]/1024/1024/1024):g}', to_list([x[2]/1024/1024/1024 for x in ls]), areaStyle={})
889
+ for database, usaged in all_database_usaged.most_common():
890
+ usaged = usaged / ((ls[-1][0] - ls[0][0]).total_seconds() / 3600 + 1e-9)
891
+ chart.add_series(f'{database} {pretty_val(usaged/1024/1024/1024):g}',
892
+ to_list([x[1].get(database, 0)/1024/1024/1024 for x in ls]),
893
+ areaStyle={}, stack='Total', emphasis={'focus': 'series'})
894
+ return '<body>' + chart.render_embed() + '</body>'
895
+
896
+ def dbview_xldb1_memory(self,recent=datetime.timedelta(days=30), date_trunc='hour'):
897
+ from pyxllib.data.echarts import render_echart_html
898
+
899
+ db_list = ['st', 'xlpr', 'stdata', 'kq5034', 'ckz']
900
+ args = ['数据库大小(GB)', date_trunc, recent, 'xldb1']
901
+ htmltexts = []
902
+
903
+ res = self._get_database_trace_total('XLDB1数据库使用近况', *args)
904
+ htmltexts.append(res)
905
+
906
+ data_stats = []
907
+ for idx,db in enumerate(db_list,start=1):
908
+ data_stats.append(self._get_database_trace_per_host(db,f'{db}', *args))
909
+ htmltexts += data_stats
910
+
911
+ self.commit()
912
+ h = render_echart_html('database_cdx', body='<br/>'.join(htmltexts))
913
+ return h
914
+
915
+ def dbview_xldb2_memory(self, recent=datetime.timedelta(days=30), date_trunc='hour'):
916
+ from pyxllib.data.echarts import render_echart_html
917
+
918
+ db_list = ['st', 'ragdata']
919
+ args = ['数据库大小(GB)', date_trunc, recent, 'xldb2']
920
+ htmltexts = []
921
+
922
+ res = self._get_database_trace_total('XLDB2数据库使用近况', *args)
923
+ htmltexts.append(res)
924
+
925
+ data_stats = []
926
+ for idx, db in enumerate(db_list, start=1):
927
+ data_stats.append(self._get_database_trace_per_host(db, f'{db}', *args))
928
+ htmltexts += data_stats
929
+
930
+ self.commit()
931
+ h = render_echart_html('database_cdx', body='<br/>'.join(htmltexts))
932
+ return h
933
+
804
934
  def dbview_cpu(self, recent=datetime.timedelta(days=1), date_trunc='hour'):
805
935
  from pyxllib.data.echarts import render_echart_html
806
936
 
@@ -51,6 +51,34 @@ def get_dp_page(dp_page=None) -> 'XlPage':
51
51
  return ChromiumPage()
52
52
 
53
53
 
54
+ def get_dp_tab(dp_page=None) -> 'XlPage':
55
+ """ 智能获取一个标签页tab
56
+
57
+ :param dp_page:
58
+ 默认None, 返回默认的page,一般就是当前页面
59
+ True, 新建一个page
60
+ str, 新建一个对应url的page
61
+ func(tab), 通过规则筛选tab,返回符合条件的第1个tab,否则新建一个tab
62
+ """
63
+
64
+ if isinstance(dp_page, ChromiumPage):
65
+ return dp_page.latest_tab
66
+ elif isinstance(dp_page, ChromiumTab):
67
+ return dp_page
68
+ elif callable(dp_page):
69
+ page0 = ChromiumPage()
70
+ for tab in page0.get_tabs():
71
+ if dp_page(tab):
72
+ return tab
73
+ return page0.new_tab()
74
+ elif dp_page is True:
75
+ return ChromiumPage().new_tab()
76
+ elif isinstance(dp_page, str):
77
+ return ChromiumPage().new_tab(dp_page)
78
+ else:
79
+ return ChromiumPage().latest_tab
80
+
81
+
54
82
  def get_latest_not_dev_tab(page=None):
55
83
  """ 开发工具本身也会算一个tab,这个函数返回最新的一个不是开发工具的tab """
56
84
  if page is None:
@@ -74,7 +102,11 @@ def search_download_file(file_name):
74
102
  for file in files:
75
103
  if file_name in file['file']: # 正常情况下的匹配
76
104
  return file
77
- if file_name in file['file'].replace('+', ' '): # 但有时候'+'好像有点特别
105
+ for file in files:
106
+ file2 = file['file'].replace('+', ' ')
107
+ if file_name in file2: # 但有时候'+'好像有点特别
108
+ return file
109
+ if file_name in re.sub(r'\s+', ' ', file2):
78
110
  return file
79
111
 
80
112
 
@@ -12,6 +12,12 @@ check_install_package('scp')
12
12
  # 对 paramiko 进一步封装的库
13
13
  # check_install_package('fabric')
14
14
 
15
+ import warnings
16
+ from cryptography.utils import CryptographyDeprecationWarning
17
+
18
+ # 忽略特定的警告
19
+ warnings.filterwarnings("ignore", category=CryptographyDeprecationWarning)
20
+
15
21
  from collections import defaultdict
16
22
  import pathlib
17
23
  import re
@@ -0,0 +1,294 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # @Author : 陈坤泽
4
+ # @Email : 877362867@qq.com
5
+ # @Date : 2024/01/01
6
+
7
+
8
+ import requests
9
+
10
+ from pyxllib.xl import *
11
+ from pyxllib.algo.stat import *
12
+ from pprint import pprint
13
+
14
+ from pyxllib.text.nestenv import NestEnv
15
+
16
+
17
+ class Yuque:
18
+ """
19
+ https://www.yuque.com/yuque/developer/openapi
20
+ 语雀请求限制:每小时最多 5000 次请求,每秒最多 100 次请求
21
+ """
22
+
23
+ def __init__(self, token, user_id=None):
24
+ self.base_url = "https://www.yuque.com/api/v2"
25
+ self.headers = {
26
+ "X-Auth-Token": token,
27
+ "Content-Type": "application/json"
28
+ }
29
+ self._user_id = user_id
30
+
31
+ def get_user(self):
32
+ """ 获取用户信息
33
+
34
+ # 获得的内容
35
+ {'data':
36
+ {'_serializer': 'v2.user', # 数据序列化版本
37
+ # 用户头像URL
38
+ 'avatar_url': 'https://cdn.nlark.com/yuque/0/2020/.../d5f8391e-2fdd-4f1b-8ea5-299be8fceecd.png',
39
+ 'books_count': 12, # 知识库数量
40
+ 'created_at': '2018-11-16T07:26:27.000Z', # 账户创建时间
41
+ 'description': '', # 用户描述
42
+ 'followers_count': 54, # 跟随者数量
43
+ 'following_count': 6, # 关注者数量
44
+ 'id': 123456, # 用户唯一标识
45
+ 'login': 'code4101', # 用户登录名
46
+ 'name': '代号4101', # 户昵称或姓名
47
+ 'public': 1, # 用户公开状态,1为公开
48
+ 'public_books_count': 2, # 公开的知识库数量
49
+ 'type': 'User', # 数据类型,这里为'User'
50
+ 'updated_at': '2023-12-31T02:43:16.000Z', # 信息最后更新时间
51
+ 'work_id': ''}}
52
+ """
53
+ url = f"{self.base_url}/user"
54
+ response = requests.get(url, headers=self.headers)
55
+ return response.json()
56
+
57
+ @property
58
+ def user_id(self):
59
+ """ 很多接口需要用到用户ID,这里缓存一下 """
60
+ if self._user_id is None:
61
+ self._user_id = self.get_user()['data']['id']
62
+ return self._user_id
63
+
64
+ def __1_知识库操作(self):
65
+ pass
66
+
67
+ @run_once('id,str') # todo 应该有更好的缓存机制,目前这样的实现,需要重启程序才会刷新
68
+ def get_repos(self, return_mode=0):
69
+ """ 获取某个用户的知识库列表
70
+
71
+ :param int|str return_mode: 返回模式
72
+ 0(默认),返回原始json结构
73
+ df,df结构
74
+ nickname2id,获取知识库namespace或昵称到ID的映射
75
+ """
76
+ if return_mode == 0:
77
+ url = f"{self.base_url}/users/{self.user_id}/repos"
78
+ response = requests.get(url, headers=self.headers)
79
+ return response.json()
80
+ elif return_mode == 'df':
81
+ data = self.get_repos()
82
+ columns = ['id', 'name', 'items_count', 'namespace']
83
+
84
+ ls = []
85
+ for d in data['data']:
86
+ ls.append([d[col] for col in columns])
87
+
88
+ df = pd.DataFrame(ls, columns=columns)
89
+ return df
90
+ elif return_mode == 'nickname2id': # namespace、name到id的映射(注意这里不考虑)
91
+ data = self.get_repos()
92
+ names2id = {d['name']: d['id'] for d in data['data']}
93
+ # 例如:"日志"知识库的namespace是journal,然后 journal -> 24363220
94
+ namespace2id = {d['namespace'].split('/')[-1]: d['id'] for d in data['data']}
95
+ names2id.update(namespace2id)
96
+ return names2id
97
+ else:
98
+ raise ValueError(f'不支持的return_mode={return_mode}')
99
+
100
+ def get_repo_id(self, repo_id):
101
+ """ repo_id支持输入"昵称"来获得实际id
102
+ """
103
+ if isinstance(repo_id, str) and not re.match(r'\d+$', repo_id):
104
+ repo_id = self.get_repos('nickname2id')[repo_id]
105
+ return repo_id
106
+
107
+ def get_repo_docs(self, repo_id, *, return_mode=0):
108
+ """ 获取知识库的文档列表
109
+
110
+ :param repo_id: 知识库的ID或Namespace(如"日志"是我改成的"journal")
111
+ :param int|str return_mode: 返回模式
112
+ 0(默认),返回原始json结构
113
+ -1(df),df结构
114
+ :return: 文档列表,只能获得最近的100篇文档
115
+ """
116
+ repo_id = self.get_repo_id(repo_id)
117
+ if return_mode == 0:
118
+ url = f"{self.base_url}/repos/{repo_id}/docs"
119
+ response = requests.get(url, headers=self.headers)
120
+ return response.json()
121
+ elif return_mode in (-1, 'df'):
122
+ data = self.get_repo_docs(repo_id)
123
+ # 按照updated_at降序
124
+ data['data'].sort(key=lambda x: x['updated_at'], reverse=True)
125
+ columns = ['id', 'title', 'word_count', 'description', 'updated_at']
126
+
127
+ ls = []
128
+ for d in data['data']:
129
+ ls.append([d.get(col) for col in columns])
130
+
131
+ # ls.sort(key=lambda x: x[0]) # id一般就是创建顺序
132
+ df = pd.DataFrame(ls, columns=columns)
133
+ # df['updated_at']把'2024-08-07T06:13:10.000Z'转成datetime,并改到utf8时区
134
+ df['updated_at'] = pd.to_datetime(df['updated_at']).dt.tz_convert('Asia/Shanghai')
135
+ # 不显示时区
136
+ df['updated_at'] = df['updated_at'].dt.strftime('%Y-%m-%d %H:%M:%S')
137
+ return df
138
+ else:
139
+ raise ValueError(f'不支持的return_mode={return_mode}')
140
+
141
+ def __2_文档操作(self):
142
+ pass
143
+
144
+ def create_doc(self, repo_id, title, md_content):
145
+ """ 创建单篇文档,并放到目录开头
146
+ """
147
+ # 1 创建文档
148
+ repo_id = self.get_repo_id(repo_id)
149
+ url = f"{self.base_url}/repos/{repo_id}/docs"
150
+ in_data = {
151
+ "title": title,
152
+ "body": md_content,
153
+ }
154
+ resp = requests.post(url, json=in_data, headers=self.headers)
155
+ out_data = resp.json()
156
+ doc_id = out_data['data']['id']
157
+
158
+ # 2 将文档添加到目录中
159
+ url2 = f"{self.base_url}/repos/{repo_id}/toc"
160
+ in_data2 = {
161
+ "action": "prependNode", # 默认添加到知识库目录最顶上的位置
162
+ "action_mode": "child",
163
+ "doc_id": doc_id,
164
+ }
165
+ resp2 = requests.put(url2, json=in_data2, headers=self.headers)
166
+ out_data2 = resp2.json()
167
+
168
+ return out_data2
169
+
170
+ def get_doc(self, repo_id, doc_id):
171
+ """ 获取单篇文档的详细信息
172
+
173
+ :param repo_id: 知识库的ID或Namespace
174
+ :param doc_id: 文档的ID
175
+ :return: 文档的详细信息
176
+ """
177
+ repo_id = self.get_repo_id(repo_id)
178
+ url = f"{self.base_url}/repos/{repo_id}/docs/{doc_id}"
179
+ response = requests.get(url, headers=self.headers)
180
+ return response.json()
181
+
182
+ def get_doc_from_url(self, url, return_mode='md'):
183
+ """ 从文档的URL中获取文档的详细信息
184
+
185
+ :param url: 文档的URL
186
+ :param return_mode: 返回模式,
187
+ json, 为原始json结构
188
+ md, 返回文档的主体md内容
189
+ title_and_md, 返回文档的标题和md内容
190
+ :return: 文档的详细信息
191
+ """
192
+ repo_slug, doc_slug = url.split('/')[-2:]
193
+ res = self.get_doc(repo_slug, doc_slug)
194
+
195
+ if return_mode == 'json':
196
+ return res['data']
197
+ elif return_mode == 'md':
198
+ return res['data']['body']
199
+ elif return_mode == 'title_and_md':
200
+ return f'文章标题:{res["data"]["title"]}\n\n{res["data"]["body"]}'
201
+
202
+ def export_markdown(self, url, output_dir=None, post_mode=1):
203
+ """ 导出md格式文件
204
+
205
+ :param str|list[str] url: 文档的URL
206
+ 可以导出单篇文档,也可以打包批量导出多篇文档的md文件
207
+ :param output_dir: 导出目录
208
+ 单篇的文件名是按照文章标题自动生成的
209
+ 多篇的可以自己指定具体文件名
210
+ :param post_mode: 后处理模式
211
+ 0,不做处理
212
+ 1,做适当的精简
213
+ """
214
+ # 1 获得内容
215
+ data = self.get_doc_from_url(url, return_mode='json')
216
+ body = data['body']
217
+ if post_mode == 0:
218
+ pass
219
+ elif post_mode == 1:
220
+ body = re.sub(r'<a\sname=".*?"></a>\n', '', body)
221
+
222
+ # 2 写入文件
223
+ if output_dir is not None:
224
+ title2 = refinepath(data['title'])
225
+ f = XlPath(output_dir) / f'{title2}.md'
226
+ f.write_text(body)
227
+
228
+ return body
229
+
230
+ def update_doc(self, repo_id, doc_id, doc_data):
231
+ """ 更新单篇文档的详细信息
232
+
233
+ :param repo_id: 知识库的ID或Namespace
234
+ :param doc_id: 文档的ID
235
+ :param doc_data: 包含文档更新内容的字典
236
+ :return: 更新后的文档的详细信息
237
+ """
238
+ repo_id = self.get_repo_id(repo_id)
239
+ url = f"{self.base_url}/repos/{repo_id}/docs/{doc_id}"
240
+ response = requests.put(url, json=doc_data, headers=self.headers)
241
+ return response.json()
242
+
243
+ def update_doc_from_url(self, url, doc_data, *, md_cvt=True, return_mode='json'):
244
+ """ 从文档的URL中更新文档的详细信息
245
+
246
+ :param url: 文档的URL
247
+ :param str|json doc_data: 包含文档更新内容的字典
248
+ 可以直接传入要更新的新的md内容
249
+ 注意无论原始是body_html、body_lake,都是要上传到body字段
250
+ :param str return_mode: 返回的是更新后文档的内容,不过好像有bug,这里返回的body存储的并不是md格式
251
+ 'md', 返回更新后文档的主体md内容
252
+ 'json', 为原始json结构
253
+
254
+ 不建议拿这个返回值,完全可以另外再重新取返回值,就是正常的md格式了
255
+ :param bool md_cvt: 是否需要转换md格式
256
+ 默认的md文档格式直接放回语雀,是会丢失换行的,需要对代码块外的内容,执行\n替换
257
+ :return: 更新后的文档的详细信息
258
+ """
259
+ # 1 基础配置
260
+ repo_slug, doc_slug = url.split('/')[-2:]
261
+ if isinstance(doc_data, str):
262
+ doc_data = {'body': doc_data}
263
+
264
+ # 2 格式转换
265
+ if md_cvt:
266
+ ne = NestEnv(doc_data['body']).search(r'^```[^\n]*\n(.+?)\n^```',
267
+ flags=re.MULTILINE | re.DOTALL).invert()
268
+ doc_data['body'] = ne.replace('\n', '\n\n')
269
+
270
+ # 3 提交更新文档
271
+ res = self.update_doc(repo_slug, doc_slug, doc_data)
272
+
273
+ # 4 拿到返回值
274
+ if return_mode == 'md':
275
+ return res['data']
276
+ elif return_mode == 'json':
277
+ return res['data']['body']
278
+
279
+ def __3_内容操作(self):
280
+ pass
281
+
282
+ def read_tables_from_doc(self, url, header=0):
283
+ """ 从文档中读取表格
284
+
285
+ :param url: 文档的URL
286
+ :return: 表格列表
287
+ """
288
+ res = self.get_doc_from_url(url, return_mode=0)
289
+ tables = pd.read_html(res['body_html'], header=header)
290
+ return tables
291
+
292
+
293
+ if __name__ == '__main__':
294
+ pass
@@ -237,6 +237,8 @@ def xl_render_value(x, xl_fmt):
237
237
  注意,遇到公式是很难计算处理的,大概率只能保持原公式显示
238
238
  因为日期用的比较多,需要时常获得真实的渲染效果,所以这里封装一个接口
239
239
 
240
+ 对于JSA等场景,直接使用Cell.Text获取渲染值就行,不需要这里这么复杂的实现
241
+
240
242
  >>> xl_render_value(datetime.datetime(2020, 1, 1), 'yyyy-mm-dd')
241
243
  '2020-01-01'
242
244
  """
@@ -369,56 +371,59 @@ def load_as_xlsx_file(file_path, keep_links=False, keep_vba=False):
369
371
  try:
370
372
  return openpyxl.load_workbook(file,
371
373
  keep_links=keep_links,
372
- keep_vba=keep_vba)
374
+ keep_vba=keep_vba), ''
373
375
  except Exception as e:
374
- return
376
+ if isinstance(e, TimeoutError): # 这里触发的是总的超时设定
377
+ raise e
378
+ return None, format_exception(e, 2)
375
379
 
376
380
  @run_once()
377
381
  def read_xls():
378
382
  try:
379
- return convert_xls_to_xlsx(file_path)
383
+ return convert_xls_to_xlsx(file_path), ''
380
384
  except Exception as e:
381
- return
385
+ return None, format_exception(e, 2)
382
386
 
383
387
  @run_once()
384
388
  def read_csv():
385
389
  try:
386
- return convert_csv_to_xlsx(file_path)
390
+ return convert_csv_to_xlsx(file_path), ''
387
391
  except Exception as e:
388
- return
392
+ return None, format_exception(e, 2)
389
393
 
390
394
  def read_test(suffix):
391
395
  if suffix in ('xlsx', 'xlsm', 'zip'):
392
- wb = read_xlsx()
396
+ wb, error = read_xlsx()
393
397
  elif suffix == 'xls':
394
- wb = read_xls()
398
+ wb, error = read_xls()
395
399
  elif suffix == 'csv':
396
- wb = read_csv()
400
+ wb, error = read_csv()
397
401
  else:
398
- wb = None
399
- return wb
402
+ wb, error = None, f'不支持的文件类型:{suffix}'
403
+ return wb, error
400
404
 
401
405
  # 1 优先相信用户输入的文件名类型
402
406
  file_path = Path(file_path)
403
407
  suffix = file_path.suffix.lower()[1:]
404
- wb = read_test(suffix)
408
+ wb, error = read_test(suffix)
405
409
  if wb is not None:
406
410
  return wb, suffix
407
411
 
408
412
  # 2 如果处理不了,则尝试用filetype判断的类型
409
413
  suffix2 = filetype.guess(file_path)
410
414
  suffix2 = suffix2.extension if suffix2 else ''
411
- wb = read_test(suffix2)
415
+ wb, _ = read_test(suffix2)
412
416
  if wb is not None:
413
417
  return wb, suffix2
414
418
 
415
419
  # 3 如果还处理不了,再把其他可能的情况试一遍
416
420
  for suffix in ('xlsx', 'xls', 'csv'):
417
- wb = read_test(suffix)
421
+ wb, _ = read_test(suffix)
418
422
  if wb is not None:
419
423
  return wb, suffix
420
424
 
421
- return None, None
425
+ # 4 确实是处理不了的类型,返回报错信息
426
+ return None, error
422
427
 
423
428
 
424
429
  def parse_range_address(address):
@@ -2030,7 +2035,7 @@ class XlWorkbook(openpyxl.Workbook):
2030
2035
  'cells': extract_cells_content(ws)
2031
2036
  })
2032
2037
 
2033
- if not summary['cells']: # 如果没有数据,则大概率是数据透视表,是计算出来的,读取不到~
2038
+ if not summary['cells']: # 如果没有数据,则大概率是数据透视表,是计算出来的,读取不到~ 但是JSA等场景应该有办法获得
2034
2039
  summary['sheetType'] = 'PivotTable'
2035
2040
  del summary['cells']
2036
2041
  else:
@@ -2478,10 +2483,10 @@ def extract_workbook_summary2(file_path, *,
2478
2483
  res['fileName'] = file_path.name
2479
2484
  start_time = time.time()
2480
2485
  wb, suffix = load_as_xlsx_file(file_path, keep_links=keep_links, keep_vba=keep_vba)
2481
- if suffix:
2482
- res['fileType'] = suffix
2486
+ if wb is None:
2487
+ res['error'] = f'Load file error。{suffix}'
2483
2488
  else:
2484
- res['error'] = 'fileType error'
2489
+ res['fileType'] = suffix
2485
2490
 
2486
2491
  load_time = time.time() - start_time
2487
2492
  if wb is None: # 不支持的文件类型,不报错,只是返回最基本的文件名信息
@@ -0,0 +1,11 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <title>{{ title }}</title>
6
+ <script type="text/javascript" src="https://assets.pyecharts.org/assets/echarts.min.js"></script>
7
+ </head>
8
+ <body>
9
+ {{ body }}
10
+ </body>
11
+ </html>
@@ -0,0 +1,17 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>{{ title }}</title>
5
+ <script src="https://cdn.jsdelivr.net/gh/google/code-prettify@master/loader/run_prettify.js"></script>
6
+ {% if use_mathjax %}
7
+ <script src="https://a.cdn.histudy.com/lib/config/mathjax_config-klxx.js?v=1.1"></script>
8
+ <script type="text/javascript" async="" src="https://a.cdn.histudy.com/lib/mathjax/2.7.1/MathJax/MathJax.js?config=TeX-AMS-MML_SVG">
9
+ MathJax.Hub.Config(MATHJAX_KLXX_CONFIG);
10
+ </script>
11
+ {% else %}
12
+ {% endif%}
13
+ </head>
14
+ <body>
15
+ {{ body }}
16
+ </body>
17
+ </html>