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.
- {pyxllib-0.3.91/pyxllib.egg-info → pyxllib-0.3.93}/PKG-INFO +1 -1
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/data/echarts.py +2 -2
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/file/xlsxlib.py +202 -152
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/prog/pupil.py +6 -4
- {pyxllib-0.3.91 → pyxllib-0.3.93/pyxllib.egg-info}/PKG-INFO +1 -1
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/data/gptlib.py +1 -1
- {pyxllib-0.3.91 → pyxllib-0.3.93}/setup.py +1 -1
- {pyxllib-0.3.91 → pyxllib-0.3.93}/LICENSE +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/MANIFEST.in +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/README.md +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/algo/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/algo/disjoint.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/algo/geo.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/algo/intervals.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/algo/matcher.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/algo/newbie.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/algo/pupil.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/algo/shapelylib.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/algo/specialist.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/algo/stat.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/algo/treelib.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/algo/unitlib.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/cv/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/cv/expert.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/cv/imfile.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/cv/imhash.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/cv/pupil.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/cv/rgbfmt.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/cv/trackbartools.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/cv/xlcvlib.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/cv/xlpillib.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/data/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/data/oss.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/data/pglib.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/data/sqlite.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/data/sqllib.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/ext/JLineViewer.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/ext/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/ext/autogui/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/ext/autogui/autogui.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/ext/autogui/virtualkey.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/ext/demolib.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/ext/kq5034lib.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/ext/old.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/ext/qt.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/ext/seleniumlib.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/ext/tk.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/ext/unixlib.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/ext/utools.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/ext/webhook.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/ext/win32lib.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/ext/yuquelib.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/file/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/file/docxlib.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/file/gitlib.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/file/movielib.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/file/newbie.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/file/onenotelib.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/file/packlib/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/file/packlib/zipfile.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/file/pdflib.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/file/pupil.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/file/specialist/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/file/specialist/dirlib.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/file/specialist/download.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/file/specialist/filelib.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/prog/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/prog/deprecatedlib.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/prog/ipyexec.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/prog/newbie.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/prog/sitepackages.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/prog/specialist/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/prog/specialist/bc.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/prog/specialist/browser.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/prog/specialist/common.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/prog/specialist/datetime.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/prog/specialist/tictoc.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/prog/specialist/xllog.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/prog/xlosenv.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/stdlib/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/stdlib/tablepyxl/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/stdlib/tablepyxl/style.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/stdlib/tablepyxl/tablepyxl.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/text/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/text/ahocorasick.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/text/charclasslib.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/text/jiebalib.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/text/jscode.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/text/latex/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/text/levenshtein.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/text/nestenv.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/text/newbie.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/text/pupil/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/text/pupil/common.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/text/pupil/xlalign.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/text/pycode.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/text/specialist/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/text/specialist/common.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/text/specialist/ptag.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/text/spellchecker.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/text/vbacode.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/text/xmllib.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/xl.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib/xlcv.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib.egg-info/SOURCES.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib.egg-info/dependency_links.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib.egg-info/requires.txt +2 -2
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxllib.egg-info/top_level.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ai/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ai/clientlib.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ai/specialist.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ai/torch_app.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ai/xlpaddle.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ai/xltorch.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/data/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/data/coco.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/data/datacls.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/data/datasets.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/data/icdar/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/data/icdar/deteval.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/data/icdar/icdar2013.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/data/icdar/iou.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/data/icdar/rrc_evaluation_funcs_1_1.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/data/imtextline.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/data/labelme.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/data/removeline.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/data/specialist.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/eval/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/paddleocr.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/configs/rec/multi_language/generate_multi_language_configs.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/imaug/ColorJitter.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/imaug/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/imaug/copy_paste.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/imaug/east_process.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/imaug/gen_table_mask.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/imaug/iaa_augment.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/imaug/label_ops.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/imaug/make_border_map.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/imaug/make_pse_gt.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/imaug/make_shrink_map.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/imaug/operators.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/imaug/pg_process.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/imaug/randaugment.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/imaug/random_crop_data.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/imaug/rec_img_aug.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/imaug/sast_process.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/imaug/text_image_aug/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/imaug/text_image_aug/augment.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/imaug/text_image_aug/warp_mls.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/lmdb_dataset.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/pgnet_dataset.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/pubtab_dataset.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/data/simple_dataset.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/ace_loss.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/basic_loss.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/center_loss.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/cls_loss.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/combined_loss.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/det_basic_loss.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/det_db_loss.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/det_east_loss.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/det_pse_loss.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/det_sast_loss.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/distillation_loss.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/e2e_pg_loss.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/kie_sdmgr_loss.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/rec_aster_loss.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/rec_att_loss.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/rec_ctc_loss.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/rec_enhanced_ctc_loss.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/rec_nrtr_loss.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/rec_sar_loss.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/rec_srn_loss.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/losses/table_att_loss.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/metrics/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/metrics/cls_metric.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/metrics/det_metric.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/metrics/distillation_metric.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/metrics/e2e_metric.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/metrics/eval_det_iou.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/metrics/kie_metric.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/metrics/rec_metric.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/metrics/table_metric.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/architectures/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/architectures/base_model.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/architectures/distillation_model.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/backbones/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/backbones/det_mobilenet_v3.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/backbones/det_resnet_vd.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/backbones/det_resnet_vd_sast.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/backbones/e2e_resnet_vd_pg.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/backbones/kie_unet_sdmgr.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/backbones/rec_mobilenet_v3.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/backbones/rec_mv1_enhance.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/backbones/rec_nrtr_mtb.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/backbones/rec_resnet_31.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/backbones/rec_resnet_aster.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/backbones/rec_resnet_fpn.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/backbones/rec_resnet_vd.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/heads/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/heads/cls_head.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/heads/det_db_head.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/heads/det_east_head.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/heads/det_pse_head.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/heads/det_sast_head.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/heads/e2e_pg_head.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/heads/kie_sdmgr_head.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/heads/multiheadAttention.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/heads/rec_aster_head.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/heads/rec_att_head.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/heads/rec_ctc_head.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/heads/rec_nrtr_head.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/heads/rec_sar_head.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/heads/rec_srn_head.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/heads/self_attention.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/heads/table_att_head.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/necks/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/necks/db_fpn.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/necks/east_fpn.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/necks/fpn.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/necks/pg_fpn.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/necks/rnn.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/necks/sast_fpn.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/necks/table_fpn.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/transforms/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/transforms/stn.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/transforms/tps.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/modeling/transforms/tps_spatial_transformer.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/optimizer/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/optimizer/learning_rate.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/optimizer/lr_scheduler.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/optimizer/optimizer.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/optimizer/regularizer.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/postprocess/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/postprocess/cls_postprocess.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/postprocess/db_postprocess.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/postprocess/east_postprocess.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/postprocess/locality_aware_nms.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/postprocess/pg_postprocess.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/postprocess/pse_postprocess/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/postprocess/pse_postprocess/pse/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/postprocess/pse_postprocess/pse/setup.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/postprocess/pse_postprocess/pse_postprocess.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/postprocess/rec_postprocess.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/postprocess/sast_postprocess.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/eval.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/export_center.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/export_model.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/infer/predict_cls.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/infer/predict_det.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/infer/predict_e2e.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/infer/predict_rec.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/infer/predict_system.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/infer/utility.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/infer_cls.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/infer_det.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/infer_e2e.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/infer_kie.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/infer_rec.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/infer_table.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/program.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/test_hubserving.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/train.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/tools/xlprog.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/EN_symbol_dict.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/ar_dict.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/arabic_dict.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/be_dict.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/bg_dict.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/chinese_cht_dict.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/cyrillic_dict.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/devanagari_dict.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/en_dict.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/fa_dict.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/french_dict.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/german_dict.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/hi_dict.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/it_dict.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/japan_dict.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/ka_dict.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/korean_dict.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/latin_dict.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/mr_dict.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/ne_dict.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/oc_dict.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/pu_dict.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/rs_dict.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/rsc_dict.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/ru_dict.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/ta_dict.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/table_dict.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/table_structure_dict.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/te_dict.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/ug_dict.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/uk_dict.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/ur_dict.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict/xi_dict.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/dict90.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/e2e_metric/Deteval.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/e2e_metric/polygon_fast.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/e2e_utils/extract_batchsize.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_fast.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_slow.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/e2e_utils/pgnet_pp_utils.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/e2e_utils/visual.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/en_dict.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/gen_label.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/ic15_dict.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/iou.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/logging.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/network.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/ppocr_keys_v1.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/profiler.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/save_load.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/stats.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppocr/utils/utility.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppstructure/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppstructure/predict_system.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppstructure/table/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppstructure/table/eval_table.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppstructure/table/matcher.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppstructure/table/predict_structure.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppstructure/table/predict_table.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppstructure/table/table_metric/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppstructure/table/table_metric/parallel.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppstructure/table/table_metric/table_metric.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppstructure/table/tablepyxl/__init__.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppstructure/table/tablepyxl/style.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppstructure/table/tablepyxl/tablepyxl.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/ppstructure/utility.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/pyxlpr/xlai.py +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/requirements.txt +0 -0
- {pyxllib-0.3.91 → pyxllib-0.3.93}/setup.cfg +0 -0
@@ -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,
|
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
|
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
|
-
|
727
|
-
|
728
|
-
|
729
|
-
|
730
|
-
|
731
|
-
|
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
|
-
|
735
|
-
|
736
|
-
|
737
|
-
|
738
|
-
|
739
|
-
cur_col += 1
|
740
|
-
|
741
|
-
|
742
|
-
|
743
|
-
|
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
|
-
|
748
|
-
|
749
|
-
|
750
|
-
|
751
|
-
|
752
|
-
|
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
|
-
|
755
|
-
|
756
|
-
|
757
|
-
|
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
|
-
|
895
|
-
|
896
|
-
|
897
|
-
|
898
|
-
|
899
|
-
|
900
|
-
|
901
|
-
|
902
|
-
|
903
|
-
|
904
|
-
|
905
|
-
|
906
|
-
|
907
|
-
|
908
|
-
|
909
|
-
|
910
|
-
|
911
|
-
|
912
|
-
|
913
|
-
|
914
|
-
|
915
|
-
|
916
|
-
|
917
|
-
|
918
|
-
|
919
|
-
|
920
|
-
|
921
|
-
|
922
|
-
|
923
|
-
|
924
|
-
|
925
|
-
|
926
|
-
|
927
|
-
|
928
|
-
|
929
|
-
|
930
|
-
|
931
|
-
|
932
|
-
|
933
|
-
|
934
|
-
|
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
|
-
|
991
|
-
|
992
|
-
|
993
|
-
|
994
|
-
|
995
|
-
|
996
|
-
|
997
|
-
|
998
|
-
|
999
|
-
|
1000
|
-
|
1001
|
-
|
1002
|
-
|
1003
|
-
|
1004
|
-
|
1005
|
-
|
1006
|
-
|
1007
|
-
|
1008
|
-
|
1009
|
-
|
1010
|
-
|
1011
|
-
|
1012
|
-
|
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
|
-
|
1015
|
-
|
1016
|
-
|
1017
|
-
|
1018
|
-
|
1019
|
-
|
1020
|
-
|
1021
|
-
|
1022
|
-
|
1023
|
-
|
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
|
-
|
1579
|
-
|
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
|
-
|
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
|
-
|
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 =
|
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 =
|
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 =
|
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
|
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 =
|
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 =
|
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 =
|
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 =
|
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 =
|
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 =
|
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 =
|
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
|
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 =
|
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 =
|
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 =
|
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 =
|
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 =
|
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 =
|
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=
|
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
|
-
|
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
|
-
|
2960
|
+
if debug:
|
2961
|
+
raise e
|
2912
2962
|
res['error'] = f'提取摘要时发生错误:{format_exception(e, 2)}'
|
2913
2963
|
|
2914
2964
|
if return_mode == 1:
|