From 504bd2f65f2ff67dbb3252034cfde43dbd833da6 Mon Sep 17 00:00:00 2001 From: MikiVL Date: Tue, 5 May 2026 12:58:22 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=A4=9A=E5=8D=A0?= =?UTF-8?q?=E4=BD=8D=E7=AC=A6=E8=AF=86=E5=88=AB=EF=BC=8C=E8=A1=A5=E5=85=85?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python/parser.py | 6 +++--- tests/create_fixtures.py | 3 ++- tests/fixtures/sample_template.xlsx | Bin 4866 -> 4894 bytes tests/python/test_parser.py | 9 +++++++++ 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/python/parser.py b/python/parser.py index 6737d44..662709c 100644 --- a/python/parser.py +++ b/python/parser.py @@ -13,10 +13,10 @@ def parse_template(file_path: str) -> dict: for row in ws.iter_rows(): for cell in row: if cell.value and isinstance(cell.value, str): - m = PLACEHOLDER_RE.search(cell.value) - if m: + matches = PLACEHOLDER_RE.findall(cell.value) + for name in matches: placeholders.append({ - "name": m.group(1), + "name": name, "sheet": sheet_name, "cell": cell.coordinate, }) diff --git a/tests/create_fixtures.py b/tests/create_fixtures.py index 671fdc4..0582fa9 100644 --- a/tests/create_fixtures.py +++ b/tests/create_fixtures.py @@ -5,6 +5,7 @@ ws = wb.active ws.title = "Sheet1" ws["B3"] = "{{编号}}" ws["C5"] = "{{姓名}}" -ws["D7"] = "normal_value" # not a placeholder, should NOT be detected +ws["D7"] = "normal_value" # 非占位符,不应被识别 +ws["E9"] = "{{客户名}}和{{编号}}" # 同一单元格内有两个占位符 wb.save("tests/fixtures/sample_template.xlsx") print("fixture created") diff --git a/tests/fixtures/sample_template.xlsx b/tests/fixtures/sample_template.xlsx index c6d220a9b73c1427c6f915ed73e4c76044575590..9b3092f4ed293adb787259aeb70694a92efdfc47 100644 GIT binary patch delta 980 zcmZoto2SMT;LXe;!oa}5!SFt9BF{R`_i0OGqMoYVc|Gy4X8o3>)-JL7KGuybM^ps1 zYkb_+^~||5aCg0b)HXgA^CdBlzJE-1&zvHDinWI8T=D|G$5|$Od!2srS_@V(3S8yv z?Wt7C;o{em@O&xN_h4z&boZ7?pG_rHR;qf=Xqg$`^JdYNtiWIW7tS-SWvDjE&~%z8 zUXaY$+*xmS=A={K#_0MLi4va{&f2*pka2xK|M}0KBGZ*US5Mg58|K71<%yH^-V^hW z?`zCI`poF}>V~SRY8+P8cQ#~y3c8#B-TK7GPswn4`|XAPfwVik!_a8MWE!K_T)~Q#WxcBT$f; zfk6T+r(d35lwF*Wnp#q<52g(DDsppbC!O`X?I3VG{^%|Cgy2O24%<|P9Nsc=HgX-$ z67GL2`a7{qeFsP3^8l7bLGlZx->Z6h>AL4{skwI(CVLlcurap&eEa_yzgrRIPqi6* z_GP8k9Mh^lQZ>KWeys!d{?u%PlAx&Ntdm}+-MP-^BG|p<(e1tW_^vxiO zbAg`B%k@4MuWj8e+qlX1nB4}m0=0C}V+`jnN1b^f^P$+6^~tBcU=QA7-q}LzsmI*@ z{$0E`LeN-G#iZ`2pOdk0_WGvJD^En|XE3n_^KdxsmzHP_s+Y9p@LH$*C1GV_`Haxr zN9B+I^StL$ArW1w$-TyC+v!P6UWVZnX|wx3T)X@r_R&IziObKKb)Jrx|HP-+@YUuP zp{1P8R_^YFp5}>l<=@|*?>~C^_21f46H8h&=3jDe;WN%Ke0(tK%%khykA8mac4os- z8NTZYJ{eK9I|Z}&q#ddQbT#&zwX)q`|F5>9caoU?eY5Q+!_~yi9=q(AX<`=`AhdV8 z>5^@Ci>`RH=gOLACJC&v%F}?X1XEhVk`?SfjrzVF9D#>F@6~Kf61`Unelcx)+ zgESlfYPdG}uAmHv^IK5HDwv0XA-*Uzr&wPPL>GKnz5GT_pfZ>5Z@41ftulZkWPJ|RsIXD5(TH~E^78rvxWka7SC?UalF delta 999 zcmbQI)}+Q0;LXe;!oa}5!EjY~BF{R`tGY{Lw11tqeKqm0X8o6DxkY;70_qbc%wTyW zrg|^zqDf%Vm3Q|iPg~1;us8XSU0sg$+HX#~8~hJe@?1&0m(2cpZqT%}S_UEZT*GMa^bX1cM$^vW*40F^O7=(cVQjw#-`8A^!TRkX58u_J9RWUL! ztYl(fkbp>*=NDxcXQZZ<6zhX2L%oXJoZ3mTeuoWsj;{}T%8+8vt9T{sR-1s0g0I2@ z!PM2e-A=oE+Hg6^FgCUv5w&2_k4b+dWg)3u%^1;y80-V)_3C^4dwq zT3e3g-|);xOL}W#aoqKom7}o6j3ft+Uw031OgVK!L1Sm%g@g58%=w11ze&|g{8q0N zewdhYb*avVQ#a(ixipSCJzSaF_h9$(d;Le48U2-v7*}x2Zq>{Lo*v|5(e!e_e(P zGfPXAuQ1gyf9w@I%;n!Q+tc*1FstfEtLWNG&%=x(Ei+#4_|)mT#cGzQt!jZ{<2mo_ zjirbDZe5>Q&xjnKn;&sjGcjG&ogB~e97t{U;EiSkahLKv264OieZbrs0yc;gKUr4L zOdb^5=t%(>;b73fcye-)pb}UOdWwLnY2=!`Sx_Bh*BwC_#$A(t3d&f64BhVjy6XT? zl^8Gyal=#t=>|q~9tMW^qSTyXeLWBv;LXS+!VJrklLLfg7!@Yx3dw;-aaC$AFH i1iN8&n^TK4FjZb>h9p^-sSS)tlRpWmv8@vTi2wkC)skKS diff --git a/tests/python/test_parser.py b/tests/python/test_parser.py index 537fcfb..8a025d3 100644 --- a/tests/python/test_parser.py +++ b/tests/python/test_parser.py @@ -26,3 +26,12 @@ def test_placeholder_has_cell_info(): biaohao = next(p for p in result["placeholders"] if p["name"] == "编号") assert biaohao["sheet"] == "Sheet1" assert biaohao["cell"] == "B3" + +def test_multiple_placeholders_in_one_cell(): + result = parse_template(FIXTURE) + names = [p["name"] for p in result["placeholders"]] + assert "客户名" in names + assert "编号" in names # 已在其他地方存在,但也在 E9 中 + # 验证 E9 中的两个占位符都被检测到 + e9_placeholders = [p for p in result["placeholders"] if p["cell"] == "E9"] + assert len(e9_placeholders) == 2