From 118583c2c11a816a9d6027d617581bfb87250bae Mon Sep 17 00:00:00 2001 From: huangshuai Date: Tue, 22 Dec 2020 21:28:08 +0800 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=A0=BC=E6=89=B9=E9=87=8F=E5=90=88=E5=B9=B6=E7=9A=84?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes: github issues #7 --- .../excel/tablemodel/SheetTable.java | 24 ++++++++++++++++++- .../github/chimmhuang/excel/demo/Demo.java | 4 ++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/github/chimmhuang/excel/tablemodel/SheetTable.java b/src/main/java/com/github/chimmhuang/excel/tablemodel/SheetTable.java index 921b5d8..e7eef49 100644 --- a/src/main/java/com/github/chimmhuang/excel/tablemodel/SheetTable.java +++ b/src/main/java/com/github/chimmhuang/excel/tablemodel/SheetTable.java @@ -298,12 +298,34 @@ public class SheetTable implements Iterable { * col name start from "A" */ public void mergeCell(int firstRowNum, int lastRowNum, String firstColName, String lastColName) { + MergedRegion mergedRegion = new MergedRegion(firstRowNum, lastRowNum, firstColName, lastColName); + this.mergeCell(mergedRegion); + } + + /** + * 合并单元格 + * merge cells + * + * @param mergedRegion 合并类 + */ + public void mergeCell(MergedRegion mergedRegion) { + int firstRowNum = mergedRegion.getFirstRowNum(); + String firstColName = mergedRegion.getFirstColName(); Row row = rowMap.get(firstRowNum); Cell cell = row.getCell(firstColName); - MergedRegion mergedRegion = new MergedRegion(firstRowNum, lastRowNum, firstColName, lastColName); cell.setMergedRegion(mergedRegion); } + /** + * 合并单元格 + * merge cells + * + * @param mergedRegionList 合并类集合 + */ + public void mergeCellBatch(List mergedRegionList) { + mergedRegionList.forEach(this::mergeCell); + } + /** * 设置指定范围的边框的样式,你可以更改边框的样式,如粗线、虚线等 * set border style of the specified range, you can change the style of the border, such as thick line, dotted line, etc. diff --git a/src/test/java/com/github/chimmhuang/excel/demo/Demo.java b/src/test/java/com/github/chimmhuang/excel/demo/Demo.java index 310dd15..8ad98bd 100644 --- a/src/test/java/com/github/chimmhuang/excel/demo/Demo.java +++ b/src/test/java/com/github/chimmhuang/excel/demo/Demo.java @@ -4,6 +4,7 @@ import com.github.chimmhuang.excel.ExcelHelper; import com.github.chimmhuang.excel.school.Score; import com.github.chimmhuang.excel.tablemodel.BorderPositionEnum; import com.github.chimmhuang.excel.tablemodel.ExcelWorkbook; +import com.github.chimmhuang.excel.tablemodel.MergedRegion; import com.github.chimmhuang.excel.tablemodel.Row; import com.github.chimmhuang.excel.tablemodel.SheetTable; import com.github.chimmhuang.excel.school.ClassScore; @@ -116,6 +117,9 @@ public class Demo { // 合并单元格,【此处仅展示功能,需要合并的 rowNum 建议动态计算】 table.mergeCell(13, 15, "A", "A"); table.mergeCell(16, 19, "A", "A"); +// MergedRegion mergedRegion1 = new MergedRegion(13, 15, "A", "A"); +// MergedRegion mergedRegion2 = new MergedRegion(16, 19, "A", "A"); +// table.mergeCellBatch(Arrays.asList(mergedRegion1, mergedRegion2)); // 设置指定行的单元格样式,【此处仅展示功能:加粗,rowNum 建议动态计算】 table.getRow(19).setBorderStyle(BorderPositionEnum.BOTTOM, BorderStyle.MEDIUM); -- Gitee From 8d88c5d3b7f85168dc7754ce738de7c27a7ddc3c Mon Sep 17 00:00:00 2001 From: huangshuai Date: Tue, 22 Dec 2020 21:30:57 +0800 Subject: [PATCH 2/4] =?UTF-8?q?docs:=20=E6=9B=B4=E6=96=B0=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e03888f..33a984e 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ - [x] 支持带变量的公式,如:`SUM(A1,A2,${demo.value})` - [x] 操作表格添加/减少行 - [x] ⭐️添加行会自动更新公式 - - [x] 合并单元格 + - [x] 合并单元格(支持批量合并) - [x] 更改单元格边框样式(加粗、虚线等) ## 2. 功能展示 @@ -107,6 +107,7 @@ 在表格最后添加一行 - `mergeCell(int firstRowNum, int lastRowNum, String firstColName, String lastColName)` +- `mergeCellBatch(List mergedRegionList)` 合并单元格 - `setBorderStyle(int firstRowNum, int lastRowNum, String firstColName, String lastColName, BorderStyle borderStyle, BorderPositionEnum borderPositionEnum)` -- Gitee From 652d5f9fedb46233a2f1bc3e173eaa3b12f623aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=83=E8=8C=AB=E8=8C=AB?= Date: Mon, 18 Jan 2021 14:14:07 +0800 Subject: [PATCH 3/4] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E8=B6=85?= =?UTF-8?q?=E9=93=BE=E6=8E=A5=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes: gitee issues #I29Q35 --- .../github/chimmhuang/excel/ExcelHelper.java | 12 +++++ .../chimmhuang/excel/tablemodel/Cell.java | 46 ++++++++++++++++++ .../chimmhuang/excel/tablemodel/Font.java | 23 +++++++-- .../github/chimmhuang/excel/demo/Demo.java | 5 +- src/test/resources/demo.xlsx | Bin 11717 -> 11132 bytes 5 files changed, 80 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/github/chimmhuang/excel/ExcelHelper.java b/src/main/java/com/github/chimmhuang/excel/ExcelHelper.java index 17eb934..d1a749f 100644 --- a/src/main/java/com/github/chimmhuang/excel/ExcelHelper.java +++ b/src/main/java/com/github/chimmhuang/excel/ExcelHelper.java @@ -21,11 +21,14 @@ import com.github.chimmhuang.excel.tablemodel.MergedRegion; import com.github.chimmhuang.excel.tablemodel.Row; import org.antlr.v4.runtime.CharStreams; import org.antlr.v4.runtime.CommonTokenStream; +import org.apache.poi.common.usermodel.HyperlinkType; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.RichTextString; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.usermodel.XSSFCellStyle; +import org.apache.poi.xssf.usermodel.XSSFCreationHelper; import org.apache.poi.xssf.usermodel.XSSFFont; +import org.apache.poi.xssf.usermodel.XSSFHyperlink; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; @@ -210,6 +213,7 @@ public class ExcelHelper { XSSFWorkbook xssfWorkbook = new XSSFWorkbook(); XSSFSheet xssfSheet = xssfWorkbook.createSheet(table.getSheetName()); + XSSFCreationHelper xssfCreationHelper = new XSSFCreationHelper(xssfWorkbook); // set sheet style Map colWidthMap = table.getColWidthMap(); @@ -293,6 +297,14 @@ public class ExcelHelper { xssfSheet.addMergedRegion(cellRangeAddress); } + // set hyper link + String hyperlink = cell.getHyperlink(); + HyperlinkType hyperlinkType = cell.getHyperlinkType(); + if (hyperlink != null && !"".equals(hyperlink) && hyperlinkType != null) { + XSSFHyperlink link = xssfCreationHelper.createHyperlink(hyperlinkType); + link.setAddress(hyperlink); + xssfCell.setHyperlink(link); + } } } diff --git a/src/main/java/com/github/chimmhuang/excel/tablemodel/Cell.java b/src/main/java/com/github/chimmhuang/excel/tablemodel/Cell.java index d93312b..6791a41 100644 --- a/src/main/java/com/github/chimmhuang/excel/tablemodel/Cell.java +++ b/src/main/java/com/github/chimmhuang/excel/tablemodel/Cell.java @@ -1,10 +1,14 @@ package com.github.chimmhuang.excel.tablemodel; import com.github.chimmhuang.excel.ExcelHelper; +import org.apache.poi.common.usermodel.HyperlinkType; import org.apache.poi.ss.usermodel.BorderStyle; import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.FontUnderline; +import org.apache.poi.ss.usermodel.IndexedColors; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.usermodel.XSSFCell; +import org.apache.poi.xssf.usermodel.XSSFHyperlink; import java.io.Serializable; @@ -24,6 +28,8 @@ public class Cell implements Serializable { private CellStyle cellStyle; private CellType cellType; private MergedRegion mergedRegion; + private String hyperlink; + private HyperlinkType hyperlinkType; private Object value; public Cell(XSSFCell xssfCell) { @@ -64,6 +70,12 @@ public class Cell implements Serializable { this.mergedRegion = new MergedRegion(firstRow + 1, lastRow + 1, ExcelHelper.getColName(firstColumn), ExcelHelper.getColName(lastColumn)); } + + XSSFHyperlink xssfHyperlink = xssfCell.getHyperlink(); + if (xssfHyperlink != null) { + this.hyperlink = xssfHyperlink.getAddress(); + this.hyperlinkType = xssfHyperlink.getType(); + } } public int getRow() { @@ -98,6 +110,30 @@ public class Cell implements Serializable { this.cellType = cellType; } + public String getHyperlink() { + return hyperlink; + } + + public HyperlinkType getHyperlinkType() { + return hyperlinkType; + } + + /** + * 设置超链接 + * set hyper link + * + * @param hyperlink 链接地址 + * @param hyperlinkType 超链接类型 + * @param fontUnderline 下划线类型 + */ + public void setHyperlink(String hyperlink, HyperlinkType hyperlinkType, FontUnderline fontUnderline) { + this.hyperlink = hyperlink; + this.hyperlinkType = hyperlinkType; + this.cellStyle.getFont().setUnderline(fontUnderline); + this.cellStyle.getFont().setColor(IndexedColors.BLUE); + } + + public MergedRegion getMergedRegion() { return mergedRegion; } @@ -185,4 +221,14 @@ public class Cell implements Serializable { break; } } + + /** + * 设置超链接(URL) + * set hyper link(url) + * + * @param url hyper link + */ + public void setHyperlinkURL(String url) { + this.setHyperlink(url, HyperlinkType.URL, FontUnderline.SINGLE); + } } diff --git a/src/main/java/com/github/chimmhuang/excel/tablemodel/Font.java b/src/main/java/com/github/chimmhuang/excel/tablemodel/Font.java index 888ba87..3c1cfa2 100644 --- a/src/main/java/com/github/chimmhuang/excel/tablemodel/Font.java +++ b/src/main/java/com/github/chimmhuang/excel/tablemodel/Font.java @@ -1,6 +1,8 @@ package com.github.chimmhuang.excel.tablemodel; import org.apache.poi.ss.usermodel.FontScheme; +import org.apache.poi.ss.usermodel.FontUnderline; +import org.apache.poi.ss.usermodel.IndexedColors; import org.apache.poi.xssf.usermodel.XSSFFont; import java.io.Serializable; @@ -62,8 +64,15 @@ public class Font implements Serializable { return color; } - public void setColor(short color) { - this.color = color; + /** + * 设置字体颜色 + * set font color + * + * @param indexedColors {@link IndexedColors} + */ + public void setColor(IndexedColors indexedColors) { + this.color = indexedColors.getIndex(); + this.themeColor = indexedColors.getIndex(); } public int getFamily() { @@ -142,7 +151,13 @@ public class Font implements Serializable { return underline; } - public void setUnderline(byte underline) { - this.underline = underline; + /** + * 设置字体下划线 + * set font under line + * + * @param fontUnderline {@link FontScheme} + */ + public void setUnderline(FontUnderline fontUnderline) { + this.underline = fontUnderline.getByteValue(); } } diff --git a/src/test/java/com/github/chimmhuang/excel/demo/Demo.java b/src/test/java/com/github/chimmhuang/excel/demo/Demo.java index 8ad98bd..db6431f 100644 --- a/src/test/java/com/github/chimmhuang/excel/demo/Demo.java +++ b/src/test/java/com/github/chimmhuang/excel/demo/Demo.java @@ -4,7 +4,6 @@ import com.github.chimmhuang.excel.ExcelHelper; import com.github.chimmhuang.excel.school.Score; import com.github.chimmhuang.excel.tablemodel.BorderPositionEnum; import com.github.chimmhuang.excel.tablemodel.ExcelWorkbook; -import com.github.chimmhuang.excel.tablemodel.MergedRegion; import com.github.chimmhuang.excel.tablemodel.Row; import com.github.chimmhuang.excel.tablemodel.SheetTable; import com.github.chimmhuang.excel.school.ClassScore; @@ -96,7 +95,6 @@ public class Demo { Map> classScoreMap = tableData.getClassScoreList().stream() .collect(Collectors.groupingBy(ClassScore::getClassId)); for (Entry> entry : classScoreMap.entrySet()) { - Integer classId = entry.getKey(); for (ClassScore classScore : entry.getValue()) { // 复制模板的第13行 Row copy = row13.copy(); @@ -124,6 +122,9 @@ public class Demo { // 设置指定行的单元格样式,【此处仅展示功能:加粗,rowNum 建议动态计算】 table.getRow(19).setBorderStyle(BorderPositionEnum.BOTTOM, BorderStyle.MEDIUM); + // 设置超链接 + table.getRow(2).getCell("A").setHyperlinkURL("https://www.baidu.com"); + // 班级成绩设置好之后,将最后的校长评语添加进表格 table.appendRow(row14); diff --git a/src/test/resources/demo.xlsx b/src/test/resources/demo.xlsx index b7b8aaf21e828ca97b99cf712ba7937b9e737de6..40aad6a9c819cae944f34de4ab7d2ebd83761fca 100644 GIT binary patch literal 11132 zcmaJ{1ymi&vc=uq-QC^c;1FDb6Wk8LHMqN5aCavJ4elP?B}i~55a7eje^>JFf3?;* zGiz2=*YvLL>h7tnBnJ)w2l6T*id!PD*Z&CY%Z&-}ost94-jP}9MGfQS0n8t2NO`>M zyr3W;;$R>kD1TQovbSe)v$e^L>yia$MF~FjKSgl>&S0U^w$l2Crx+v8dXA2}fVavF zM#>%5yPcEVL1lU2LlXBKL4DT{aL*WezMSAru&K4RniCV*wiz$phBY^Aq>o(P`RU@# z$+wLlvnVz@E;jD!>qQz9Q>SiE1cobuMb5C>Mt0#ys-!tdLm;&%S?H9jjImsUTE!3* z3|~x)S3_ZzFjVTx=*O6Y^TV6uP1t4f6aHJC)$`3&k3I65(ed``C=HBHiE{Y?;+kkW zbhZq<6${@q#52Qk8C#)dGmQ%6Mba8MfT9WT2xIRAdL!#SgC-FN-OK%zlecollhZq@ z1XW_Qfy~6GZww}?(?UHw4o7mGwKC9oj}dEmI9x!($l*c)t;IPv6h5o?J%MB)`FREh zX4uz&<#0F-&I1XkABVAoJDEE{{|Pg1ln9sn3(OWTFr)q*=665`(^s6m;|=6`STOq5 zAv?u~JTnU3IR;ks2pRo6$Ane9JcYgGgX%hNQcMox> zW~&iO1pzRWU`(Rb+%H_{mBZkjh}u!NH4IYRnB?p17?$Xfu-zP*L)5DN0`M~-Kp%rU zZU^G@D;|kDra*+iZdEmVKG#oDx36c#L!zeA%C802aw`QACN%y-o4)$&GaPrt)mlRUNXGGGd_0M<{$%BV#& z8}80yA(s^& z)`8-})gy_?yWWBVq*PRgn7*9=<-w<|jii)`&CbE`(1=W7A}oAoxhF&ek?QVA%(Hx% z!y*}(@CB}NRLTaiMLJIr69t%Zt@aV3PuVC7BkTbppXfAvmV~8jxWkkbdKL%^BldZB z^1Uy+k|GNbl+$|=(PcHRqPII^w~0gIw$9($6)_jY-~a@r zHX=nyQp;@FjBPgV7KH_9@rJzF{h{YiKhT7@;PIYV-RPLpcA?v)@%u~bI34DKGWNH2 zHm+=qj4DM}u}Q^IkH-^tGXb`<47A8HigI(aJ9YfpDQ_mbtO*J&tbez_IgH)*wU z8$8Y)Q~;GX`$36rjs@y*EMAq0ir%Ht4k!WPE9XTsL8=tmmU6*4_b||cMD>YB79Nb! zLliQAi@>hu`;U6xgO9JzNIS%nR#2?B-wgC+dgcFES^UyTCP)8vhCHL7!M?z{hemU} z4BI>oDfEP*T)OOZeuNsu0A)&$ zL@HjVO{SK0pS|)ddV0-a_QG}E)oL7`Z%i&%P8ukrV?`%B+jtR7Oy|c$S-$w;N?bPC`^;J4Ksn za~BwzH19pCy%q{w|JRxhn_}y|pi6oQ8dR|)V`&pSmm(t|-d1#%U-puAh2JEo#2KnN zXh=PXwYgr8c9>Qu}kBG)6UCO+?JVjFqud%5$b(J{BK zc?pdc-t6nseQ+n7e@O7?ee5IQU>kB6CWONb13cnEB`V3gJcy4{i+TlxR9LV`m=JKY zj>1=@asCXsgWER;%PH9|^(0x3Z7$KS6fLS2PRt6;-_cJ_MRdgvYP&1=IPB5_1jrb{TomaXYQCMIjs?K*Rw-t%MTI z__JvXJaJTI;AWC49-^5zT0=_VOW81>3 zx5iu*-(4!lGDqkqT8(1bK&ba~1$Chom`@fmGK#yrf&79u zlVK{B&YeEl0H-}PVT#@K?wbfv{MjL*A5k&7Z%ks{E<6=agljF!#gD5A@#SZb|39(6 z?g(EJyOV{ft?6$&!n-E|lqe_=kW~C%>*b$ne<=Tvt&g?Wf%u#RK2lpgH7DNI(^Pt@ zjG5^i+D3;OoQso0nGueAeXc@_imh!5%i9zby&|5XVr^%>zA_mQXxrJj?<^23pTP{4 zT~iz#bB{Ird;#i?<~~0kA0O|n_qGc8QNZqsF!i;VEb5>c+^%sWsY9ne{7ZVsHE0mw6I>1fS!W;^M% z81m?I2>@6I(==Ke`-3V!c7U>Q#vD5F9V>Dcn}aOeimKAf#hF#MYS@}`z>_@iylK@d z)wE*j5b-fp+?6b!E#p?vW>5yNi)rNj`PQ_t>GRPB;^5Yyu)q zpnj{dK76G?3xOkyY#+G_%~Et^)14ydz6S-9+6617u zH8>=#(qmC?NK==2@L<9@!P^w=jrx&(IM_*FicMp4C@Y-yK!_WU?zexqIX*OhGkItp zgM2C|*mm2q`S=iW+wrO4W6&}WQaHSU_u~+;!3v;L_{YU;&&2R~UFh?5EA)iVQv(4E zE=R(C-(HN5=lxw@evH9~%NmFd+Or&()0t3drznCPK_Wl9ewL~o6B5NwdBn!wE549U zGLfz-=YqF!^;ICulU1GD!O;+zei=zvj;?4|lE+}&^rDO;*g)E==mV63R$1sn!rxNA zR~pxq4{sKXyd81-^!}*1iCreg%1rcNp@R@jYE&=yT@W}Lde9XCF}h0LDx)l6>xq(q z{g4#gYFqZ%&ysJTNk@LEOXPhz&LMgSXe*puru#&0(Sj= z^q_pUcyEH*ysm0v%w*Wb47kqFLutq?B$(|Ib_$i`%Fj$9>;5y|t>4%~H{2G#1wy`LNa-1>Dbc z3a5-l;CL=ZO4aP<(jJK91UX_Y6B6;jn3 zm8f?$IP=o-_U%X1=cu^$99Z0|@DO(A0>`05g&{QbgJwF-5cdd22bGpr?`a$(&bzf+ zq=Vh0RfsLy_q^3O6^D&Y6;Ufg5TU$X1p2KY?GP1i7@ISDWdJUXkVkB%?NKRpFj?-f zC4>r6Sl9^(efv2FoZm;Bk$>=5dXV$b^}I{;oiDVbVujyW8q(|zeykm`sq@+$lPpTj zfKYFKtZ~U!T_^<)i?xCunG6n2lNI;vOHWAh`HW;HNDnDnHZ@eBr5#{+H&6h=-%>@H zk9w{?wHSnI%m0v`tRkc=an-#EidPf1(6jM@uq();t7kw*sMTgv(_>_V6wR%^n$zN zZk?mUIYU(D+lAUjLLCdMv!f}Dpj>5_Sk`D(;Z#hY(XD{xjeW+uMZ@mIh6Y57?Kl5C z?WJr_`xd>NO5|feKoEZ|a*j^!Hl~iRr;Js-(-?dy+^6W?=NboyJXF`FdEs%zacqYU z9oW*Ga0uAaQnGdT)A9J@_9f4QLKxcEU=ih5B{;t_v_f?lVrgH03$^sC>@a56>^p2X zb2IZ>!qZWYBR3yZIo?wb^R+$iHS@K!)yze`PA7qVeD0&E<~;RywLEKr zHPD&oWsVlen<;|k9Q(~Ryi3f{$WkuF{8T|uk9pd3vk?J`K&=HWVj{!}KYlKk%>3MC zy04FVP!Hc)S2c32un;tKmJh%Z5Bs^-g&bBQo*%!HJ~*uL+#Wmb$<9Yb#AjDkO8gug zuC5Vo_~}}OA4E0~B$`+(YFNI9XtUb}tyI4D-KpJSPeX3%iPi^Ox6O%mX=s=OXF^85 z_0+uPUDo}Gweyrn*c>@!TU!$q?@eO_@afA*hx4&c!A|46^iW=LZq&7)Iga#DgBz$u@%xk)pL#w6M*`w@bTOYhE5wZ1^>n;5?R$o`!78Z|1E4<+60 zZERMOlTdZ>;$yki zPQCn|iM&U&@*q3lB0So?DVagquiw7xZ5=0W2#w)n`F=x_CdD+ng`WO09V4d$>KfHHPijrQH}=w(0bNr@7VaTQj}NNoqJ_ac`cOP{5PrY!$5^?m-hMY)xDu1j&4I z3O%SW85&&*lO3rG2O~_ok3*RMb^M4jtoj~Ka7z1!bz#?1wLxF>8=DGZ7u|UxM8*Y{ zwo^?YQMbJ#%$^E_SR5hu_Wq;to*8a`?Gj|aV&^<1&CRmg223%IUCc-QB#rs>F|&MK zAP3%&8)sPklJLVVFSIMvHDq& zLG9Qj0ckn`X7!>s_Qca5De1-%)0SyzJ^`;tiwu&$IWJ2%5t^eqgmlpMaCqW zT!Zt#V57OPJ9okuM^=XYRQSwC*;M5sg+8HpZMvJd=b_=1LrbRlLF%-~$cE&K>a00* zhx%lVgbT5yDxglS>;8x2XxGRssqqPwQkr7iK#nAasH5We!bw9C%xC3Y={}(?Va!L; zC)L^*mA7<1XAVuzV}8u-9z!2!(|(*g;mK!O!R2VnaG0g~s8Z*Rf9UNw5k$fJ{g^nm zv&vCgrD(fl9Hhg^Gt=9A;h<-pjJfLx?`JXNUMA`1)9x~V&q#azT6LU-)wL-Qm%4KB zO!E12yK#&#Kv#|=t}mr%AAAe+)!MrSjDeB}qLl)PvvBgZoB`zy4kUf9pMd6FmLwC# z?^C1UY3X^r6!-ZOp^5A>7EJA7qCobrbizzZE@$CS_FAY!Z@{+!i5JoZjm6u33nFCF zo{dy_1z40UM8Pm9GjZ^@M0vup_0P9!60tanhO+5fQHl`#eOueyq<7uRM{E>e&LHR? zj&)09mv)mZy(Ab2%cl1 zX_zN$aXjTs`suz$)iM$8PiNt~e(5e&sMm!BAbpXZr2A;z`K=MFIBw(2H6LD2|gt@xA+1#Y)+IJnj^5nTP&ie6&V(Se2xX)+|sFUBYlP0&ZF(-GhlTzmgXa%iG zEzHttve_e~1v0fI=jUeA^Gv@-ELl_l(+ zBYAQ~e43loP&1v%;6_33Ii#6Ne(G(C4!O|Z?@_$IOpJ6y%FxvyWd}@Q*jNct@RX?E zKVMU8v`IRv@Q51UGR*$4aNdhK?e9m?y)Kx5Lq^;N zwQH(wS^`8+Gv|=2`x}DU@95OnqLQJxQ;@vAk>F%#NekBllj5YI&3dT8;ITEReyoco zvi*d-5$$166pm-^m`QBd00|J%;e;0k$q%%A88`p68uZi#DZD2dI3<+ zymGqgI6Wp5OQ|wAxF(6x)BbH{bLJRbZx_ehC}q=#+5HX%W6XGs|qUl$I<% zuRO}2Ll(g<*K0$>00N-C3eaEJK}Unkz;FgUBNSoJh)Bom268tK5?ebU7faDG@~PF1 zI{Z2zHRT2`VHbcIYuX&^lJkK5D_FnL0ug{e2-KYd-RvS0L3dgTD~Vc6u?PWA{#vVj z2+`R5)^Btb#b<-!QGP`)Im0_6u3aj9Iz3<;z4iFj9gEsTnF53yLU{Y^Y&9HJWdh_)2Qenr;NL93sDofCG00;={-SzMt|Wh~fSK>@u+g&|)p{5% z7xHHg2`4JbeClT<5VnJe=%3=5&ciBVsp{1EJ2#$1JJkWa*5bT@+OuQvrQX`#w8MBg z3`e4~l2XON>j@0Umr&%TCUQZwklc_E8{&He=4Z7Eo5fc@ND?YtbD0Q9uhkh+_7OSI zmXRiy&X9TYBJHru$Lf?=#xb=^ybqXrHLGw8ByS^eDpf*X3^MUm&@tZfq?IF{bVDmiA=MT+fcW8S=r1-t3pc7yJ!lu{H;N7Fe zN@eij{r&ASb!RKT`_GM|gcwDiA8DJn@RNXiS&?$Kk%`kcCjvWWxioa3Dg36CG#dI~ zXnb^{#7>-uP7bFx5$3m4op(PLLx@SRNh|Z>uVzPPD9hRP0tG_oN^9o3F9!zBEWDlq z^Mfz~khlxmjGNmCI2_fY+dsGr%X(93Sh$y<#WqH+_^k7`KL6aA{~$5QXrLyG*OTJo zhIEwm^B5c{MX?QmLTdetYwUREazZiN%lT$wXasqkA5j~#ki77EC)p2}bBNblp!Qs!wobeyp9n+Q{~?&JxF8hN22$r<;h?98fV}iIZbx%Xov1oNwWY@LP;oec|^_ z0a-r}z9m3^KxKvR>V}nxOLzm!{CU2)vj(JgwafPUS!kf4h76LNsBUKI69}aZ!~Zs+ zi9jYD*`IM3ZXBM1M@s|tfrN_EP)X%xhuHOv-D60r!u$bAav`JP#aWt9+d@j33TXD~ z{bEFM%p+M|pka6uL{hvq4DAT~4g##4w3T*uMYWGxh(Hxcvi4{Id5I(jE(%SlU>9$QT+}+FbFsc$WS!V}aiAcqqdMtZs$3zOg55Xkh;yW+`w<24i z@i93sAHvR7uw^)9h5W4~#=7C&%5b8&dNsy#ep(=;&6On(<;*iP;`|H|!uAL?8=4-( zITCM0adKxFB`|~7N^Z+9>-u8X*!>QKk|*&5Vm8#OQYK(D_!tUTuoeOg$dIVD9r8nv zNN%yK43bCLp8w27x!I7w{sZm)10I=)~^#hg62FVq<&?HjmesY(G_wjG(`vKukjNal)dR@x~P%+1?v zux;_x8uLS2`{%iprKZs&Nz3|LmCA+2Br{t_>p~4%pq;JuSiH8?GlVhUKJox|^vJBn z<`-vVW{imKRdCNq+-f9`R&w*BqtE57XZJGZ!0J!d*aIQttuutg3r+m{*kdZC+BR6w zg!jWzB|F{C$Wl>lIG(JnXh+tVlTZ=D^T~CI{znVbUbBDi?CWq{If*T0iCf zxz>7nbiHSkBPh<=lgN`($n6&#Dz%*IL~v$!dDEC7@{S;$3xP%y$;}T(%e7j+7I!<{ z1lG}a!rf_vC3PA~r7EbvJXO`j&PfSRdKx(I6}mO^sVG5l8P(H&tsS_+r0>!zR6*9tx4#_-w| z5tc(&19rlWYR4_VPQxN-KFZPy5~KG{ddKu*!t#Q5O7fCrg4Fwz+m}p?JUAKr8 z>B|j%Wk#=~gV9b3s#p@!5F|Z(7CU%)h%X$}ryl9C6j~nc%)*jm}P*FD-H_)78X$_aW6`JY2UG-pw*EGST|P zWR@h77q2c3Sh%<}3en4SOu8F6LH?is_itg<-4}<SmX4( z$zn^7=fyTAlZ!+iCO#yVc*<`i__bU^dL;@Q)$ABwRryvMEN(Q!oC)j#ZWu-(X1*IC zlz(v`A-1-arXI}V(Q{`G5L>khd-T|tMRE|dTjT?Hzc1EsX2cpr1=Zy9ri?CiVnhP) zT!Bm^kxq&x2t#loke>N-F%oW7rMK7CO^8Kz4v#9MlAN}n%Zo1)v)*XyBJm#j|1XZb z6hA-=987I~FJ^o4xU{`83D#do9PoeYFuiJ4#!txhvY_<8(qwi!6kIV;7oC{NjucG1 zeN*M1C#lfmwU0a6MU@%8wm`?E{n*V|_cCe4UnS9JEsAdQcUJZn0S>x!D4%(`X|4K8 zSG3Q9yQ|rEL$rRsFn$OO*cC`zVxoxC^HP~)3*o0tu$($jQxeJM=L8h<3cn){;A*#1 zvKzjT?9V1rQV{4{qYL$Hg?i5u)b;}iEISb(=Z~< z7f6|R_)Nhz(7TiDF2rdd?Qp?Z?)v{@`M-sxe}nVeSsu>u3yduDw(O@pEFgUt1$W&JESd>h7X%Lw1xxPYmAe|yJ=Y-mxHAR3TMoQPvpPn`mFK8#reQf}z zeGhArV??CiNHuQ=q>TWFI#6T1P6iacMV=$Hjq*s?o8WuA_I21Sy;&1kdZ1Pcc^|v; z-2P6z5otZ|;e_=p2}U7GVPBYc$c>_(YjzL{>zjP2s6mLkE@tq6qP}BM>Q&|4So%2w ze>bmpya!)|4nki#LUC&JSCWg-_q1^~a(vi0?RW3L{Z@@DIe+VD{xZuEU()|8dqqba zXy;^V=VYMfZg1+S_d44v6Gs%mSTTZcsXBTJbl6qxjUtT)LFE!L=5sqDSFsg&A=|%0(7tYM^Sj8#Jd5 zc-_?5y%mc#^cVj!!nq0=S^@j$I#BwW3s8bFdG7|YDVA|J6bB}=FF?|im~cR3gKeYs5n&hrCZ zc3rZGzBLQ)pMV2XjBtL*6N@D{O&pDfQb5cSO z(S98_2lccnf+Z-b=v3;v2kdkN(cXnP8yWafe0w=w)6+nEJq&j|zOlzBw&Y!Quy)-M z*VM_-cG-3Lj_W6sk{l=)#ve=YFXr6uk$DLY2q*~2%l`o7zsBiT1OLvWc}+RLc5-)FIn(+ zh<<0i{be2fGNk`>`X3J5@8-WVxBfDReIX|OW&S6R>%VpSmCE!>UOUYT@xR2T*Y5s% zNdAeEC&k|q)bB6)dnSAJ^9!ZCznlG^y!LxLzwh<_YG;u6-*!@Vm#~=>mUwa_ zj6uUjLPm8=$fTIdOSH7~-P9*QNsG%mS<3qGo55tzMliq0C3 z`aYv$Cz`SQbs1)#*6Rh_7{$H@p1j*xDANS%D&tQPPoa(pT%3?dyPZ>Sx5X$a+Ja!N z#h7~`ZypU!!38xKRwKYKoqc&9i+hH84o$>AyS#Q0^@pO(r82OF&n+>y?|0nvOsujX&NNvyb?v2vp9!R*^1e&nzkve)o}ZxrN`GN1mR`FFS#GJ9rqy|_dFUR_m`Rcdei^3IE$UtJkByCR81W8L zk%ux}z7$ra2VX8ZBI&nt<}Zc9$~JQYn5myZ_@AWJd;J8Pbj^7+6CLoiFXYflsdW># zUj?lZDvfgXj>*6aI6~zL-L&4ea`Pxwm=C+#4i-={#1u-5#c18cEQtL$=gL*jDWK}C z^d8y|8M>zcLXpsFKYrdjv7A&-R{ZOxZ-#PV5AmGazWZDmI*(zIb2 z%)Mr-5(JKEjPqcQtybT??84tE69<=Y2>n7CVJHBA5C9M1YQ^#|*0|U@SQ^>dTK?wZ z{=*=M7eDv1_P=|S#SL5Zup&!d2R`{vw%fCNDFxY^PO79>r+b6!5_lDi;B>sUPApaU z2f;Bm)oe0d*Ce4WOFk}NZ>UHKKjIk6BKnm%n*c3gPI`w&DMP?!@>ZGDFiX z8WyqNiwx3)LW+(2A-k7t3y>F;g30X#7kEoDPGW%jmJ4}8Mv4ycg=kabTx7!2*ug5k z!U+vzVL8!b&z3Ev7My|tkCU<6NVx2$6MZlezU?&Xr#iH;7+WUyqiI*f<6`mmnnP!! zN%+-V1nn8Zu;M*f{UtbCyjlTG`dCuHFQ1XQo&EUgl9(MDEM6nK)343HWFb1I#Gd|Ks(<$ ztof@~8S!`M3Q(#wVX4Kl*BljO>ckDBytsH0m0Z1|Gv=Vqz>`@^=WOv%1e>J<;;tDzl4OGZ zim)-Pw58rYwTuv?8LE;JOoGja6ONazP2Wr}>MSi*qHD{gVuY`h(s)A&F+mUSwG=l)4i%<*H8}My2{mB7WSpRP8Bv zRC+qR?)B~ESTm}1T19PjB7Ll?inY*A*XbM4UDiY$Z(aDk_`?mqRPdryXVEy{wy3!g+tvl{jW;IW2l<&TO#sW3L5URiW{}13g}Nc zqNL2)+P0jvkSq>wljWYaM$ASKmDL(rfvr8-Y*r#P#xld|Y~^QI!Bf-UPtiyUMhfA@ zwVh{Nz9-W`!qAg=HgXR6o*6w6Se!+!ikoCV-9D`|Tm6u3;8JC4@@hryc8iH*Svh<| zQN9b8nrVUOMD_T&Qr6 zFky3Zb+Wo&-}kHzTUnYtf~MOjU0BjN?(u;Q+QT~m9L=jX)$84CQmn?-BQMKyl%?YN z;~ZSR{R6%?eP)A6LscL2QxMJ`o|I002{CoeSJ}UyBrWd2L-u+fPRC*~S)Ycp=}}4hK;C#!C2!MdIi)WA*YW0*jd1& zdPfiM2WH`A;ToEp8JZ9u7MS#iuq9t44Kj3{P;3RQ%t=Ym#6vhMkxB3U2OP1<`=pPb z6F6IMnN5n(kJX(&O-gD0lb z@xTHc&m>=!rPWHaj+mcePsaSKSzhlW+ot4H#Ju9N%_i~XP?Rs=&Q~kg6Y~y9n|h<| z+voJ}N)&ECUq1aKlzQo)2cTaJudM z21L~IkSa=%61 zk87-Kg%oAjKL(YrGvOwMPT94HX|Rq!QD=L;qL#&yxRtqLYLAPfH@Gmv zI6v!dZ?SixJ>{ETYU~6hUn}a~3=i|o-?Wc9=BV|p5?@fQhHj3Jw?CZ;a6a!JX>9#C z;?N5TeI@ATvnd<3%pj2w{1~`P0&oHV%<-=tub1--p}>EMQ`+w-+s*Ndl7k zXB{Mkplnf2I9TAxW>N1Qhc(^H4dYocg=0N2`$+LEU|aonX8RzjbEfgr!QpMQ`RsflhdGAeMVTL*CnKx zmY{9y5*32ex>DYDRB_+Hs5ai^#VV|kiVlbW;&=&}9||-KvU9RtF7JKqKK<6E@2z>k ztk7&CjpC!gE={r_<81D>p5-V11%H-eA^eP&fRbN zo5wKo#T1kAysDWP5;@K3`Rpq=?|PUu>pKxi7k)<22NE#`0}Jj%d>1@7+6>U@sqi}5 z*oS_ee-U$wJ*xsk{G?Ma?ZV8W<4sc>9`xHurv&ggf(f>#cYvGEh zy5p+bsKZ6N{jH3#NEA3ZXP3_0ihqT&q}`0_VAxNx0cIcc?m$R> zy_~ii#R(TOp+Q11)942VDj$r$dUF+%AdsT`<8xUE96s z_Yw5jeF8#uH3XectWukZPIis%7)0cYL?(3aOhjUQWf`|kY$%%#hS#$$LK1_&UIPR+ zun5{Dnv06wiuG10b;l+FCvI^x@RX_cj8I~zF|bm~p>0;*XvC=$6CKJMq>c9^lflmn zC9~gj%)S}GB)+yvOWTGuI_93>`hh#jaRGj>ZO80bN(M0i&@#_X!;x7d;+-hklyZc- zo7tP!Ro*h)>QEcq9g`~HhzF{xWM%2i2-C=waMnMi5Tzu%{*-?AF%`JV8o#+}2z&(9 zJ23?@@@4957+v)fMO`;R19o|v7S(}8hN9&<&2guWg-MoWrYXBw7ZHRXs~HDWB6klJ zMo==g!5!!;R(&xHKdP<-wuTbC%?%96-_z@`wGbMb@J&$%jFhW=kM#>|>T6S(YnV1Vih~GQn{gpj3oXIzT;YmD{_Tj$Nk-87fwctId&zr`q#ST^hT^OeHL* zQiHU;8>r##ZXfz%Qs`Marg0-QnSAD3K`A6)KT3^I4pV8`k*nPrUX?H)*yrx%Y)#ll z{$g~YuNrC?1x;5J*5?iam3~Mf6#v%Gg9s_AGTn&q>{YuI?xu>7#rFO{ODdBx} zz@jqREb}zw@@|m9%SC6duU2LNW4MZc|Lv3n&CmB)5h@ZiMT3*x4uy%v^*7 zi~;yBRTZAaFp!^@VRhCKrYF5z*uQP7OA~+6F7>Nb*C0~VPU9z0q;c0s=skn0WTP|s z=Kn+KT``JexK^i|r0mfx_xqTx*htFsHojVvn;uCsE^Sp91KKK=?fM(B_@1Ql5EXfA zqD=LouVzdi;-IckO$0T zcIBwdpZ@b%CFi`M-HP>(xvrcU2`1 zob*8}6?!SAvz90wLJu%s37L5~6W!FOgGd&jQ(jeloPG$bv70IbvL8L8N8<5wxs9=b z1QVZuIzJ0vC9lQ92+MFE3`~6ZBDP7-KdgsTHIl+Q=ji($U zx=NF$FvS$3nokNwD%cDj2T-lI!Ir((*;D&Yr6)R%2;*mKmX@EnsS117ZhbRFnP#SZ ziKi_)-)|UmBdw$gACWwX>U&e(?vEJAf)?4e0bCCaL&V{j4s2fA6)a4S@1`nwZ1Sv4 z=7J`x)tEz}VW8tx!ItuDZLyGI19YZ>fj*SItz5>q%fW(?0%HC`csA=F_3JpOLKAL+Fe)>n@!1HWb&+rt1<-8sjc4z5W!_Az5oDj}i&ScQ z5Czj5OObV=$H|10zCI+2BIJ=-(Af;KlMxKDYG^CL<$>_UsuyPr3ek)kAy=~vm2%37^Q>E?dzU4!j;E8 z#yM_r)Qxbxm)`aK`6&h9!%?AAP*Y3s<~qFS5GoD7$M}# z+t%Zbt-wn#Y)OdBWF1~>3D}Vs*bH(9ggZ8#pf>}dX_PGc=Dt*RuWv+1cg@BeBFj=x z??8Yk>zqMeCjgN~n?P?!c!gs1$Tf|!5ZmDWGFB=9@i-X-QU%y5(6L=O4!r(?h5T7v z^(wqfabbMLH=|`keoExQu^1|qu6G%}7`%Cpr+j^QmY;Sl)#_ribJVnBdjyL)hOv(n zl&8X^7>Nkt+mlVQQZ&Ts&>?}`aoM7I(@~7F*u|H`X1C4OqK^r69FnpO?DFt%{yNps z-!+^EQeFA1v?p~5E_xdCXi9{f2Gs1Z+Zhxs3l1R+h|ZmvbbgnuV_rhxsPaet=hHXK%u;bmugsv@d<>Mb z`vV>&h~y`oD&Ja0EaB!WbQQw0d>#-|Gc~kl!cLBlo1yjgwJM9yV`%+!v%dJYY}try zgVXI$n$C!Da~hAZ^R#-|k9`3ZC>B75c8EURP6y&al4Qw&jm;#d#nJ-hy_5lY^b zK6Te@j~UeYlkPn%cx8_&7kAR~>W*;=cCb8ao*!1i3WuUpCLjgj*1 z6#7$l2^x`VF_br}nInd?CB0v@Jq<3pXuk-W*eT+Q<9fc5B#T`^07WNMUqR^!x3DzM zz9jhn;qaUv9cKlC1pvy4eyhp-o^En7GqE;d`ThF4^*+>kXNx6`-J$Wr1^?)k6|Hj! zB{8-Dw>ddFbx_!MSHaa+Z(3^72xxDD)^2|b`kifkq`aZc*ve)}y?|5ymLX5iJ8HwscN&DVoZou4KS zshKpm?+%k1sIp@7y<)S32A7YcHE%^BqIauw`b#Ns3yYdR8X;6{r>AIFHdIysy?=V$ z20hsgo?3Cz|nDZL`5iZ{vA+N$cZjkN5brHLQUqeE!`8SJ?xr^{THpJ80%{GtQ6s>`T#Tw&3Uz|{od^#QU&CPvt7vI5lI@f8I=-2Q zOoQ4Xpdym(d?T%gYgG}Vw;QhYP4m$}GhTRXF3Fh2W)Fmo<5-%mD~g@uIlX41fE=Z; zBOCpuGu!I*na#$Gy|qVz=(h~$0^q&60x_El{#%?V89D5!@tYX*Xy=C4pAMT9#XG4< zUps~8(iG~&JDHCoM2W;{n9LwYM$-Ph%Jo*WF9Vtz{iRUNG@KA_lo{f4b);qGeWj&3`f3 z8pg*$!E;-Q^PTE^NMX7$~2uT)zdB2j)%103KUwxt~8Y?mpO5vXp*j6ymT^jwMD!H5+6x^qaz)5NwM5fDPg;* z+$>JUuoGSEf^+vF5cTOC$6cBEv)6~LM5E%V8oec_)xoYl4-tYTRiIS4+_Z;0FX--- zCa1V>Dsqv(CT@3s>!^!eEZ7tcQ`bvEtrhP(^4(P!0VQQ>d=%ACV}RQvV|r5(agMdr zd&I9Tsoa+Cs8xyLMs=h2&TdV-wr>Yh_Bq%&jshmDY3x)?hw)aUw0h<0CalUWa46I0 z!lEox6FY;?OFK7b(k2$j_JYAf46Kiq3x=zm5f^nUM~p)D;ig`N%yDeT@ypWMCvK!_ z5%Dxt>;yvN!wyT4<`rA7x%JYJM>tsaTLt5y7@25jaREq;p?t$?O0S6=LpL{gc*RQ%4z1|uYp&E;o zDl!6z2zQi8AQ`#*+hTo6U`+)XV65_=Vd#=H$nl@J>A+FtmV*W&Vrov#hP}%k_#%38 zw=x)2c-Lr3(UCpOu-6AlFkW}>yCQ>2;O~%h$IUI%rEToT;>%s>OzoUs)iCzCHGQMw zA2dedaeI^4=~**HcqYPAaVXU^{l!S-DdIg{(Al#Bj#m~Kr^i9xgDgPa$TxOuP6`|t z#`ivlvCvQ&+?!hR3Z2QW7b%*&c)fJ-0nb?fxqoI2fFx53y#yaoI_JK7t4%pHbu*90qm1iWI)~$P#Un;o*Cp z8SAGxH(!EUc{Ptad@O9pqQZpz*rlv=o#jbJ7A&&zyiB7rcr1u8k% z+BvcSKRG(tTK~I=IXp}14jFzSs-@cfh7w(-`>WE9Qg_1&?pHE+dsd^AvRJM+ zgMhiwBNUIbSy|FVWHLI1;te(_4MXA^EzJE!&(J!cc$Y4Hnp-tZ8KGg7r%!`tnIjv!7ZfBA4-77p)dixVM(PbNo zfte~yelgDT3AqlVKoe_vyR#PE%W$Ja#1Gq_RJH@(!)BL416}< zxFfcX_9K@w#GiqtvNY$rhsG;RJ1`%t0*_@4)Tw zoi)kpEuQX<+37slC%SjGylHf|cm9|9FaOKm%U+b>JMLO9Xf}Q+ePR3=%|KfRlmEf_ zKVSv`0^-)>x>>RNPGHt@w%X;V2D!!NHb|YfMeK52@#1Qj=JTmTom=KyFg;0FJdviI zzq~@!%ko^i%{(EF8>{D!)&ujarO@R<`BAXu#tfAe?b+}})4q1dA{spJ0%IS6bF`e@ z=`GUq`%Ht57OAz!*Ij>XOA8n-q>DS9?X3+_`;z{G&wg44_0a5=m)Mo#M6~E(uy7k$telza*oWM7H0X}$E^!=>A1H`D z3qO3_Bd^t+!b z`(##mP28V7W0+%3PsU}j@tY17OTPhB(_Ei*479(X?(cYf?Ruk||FY}fUncs?d}&+& z8d?Fx%?!2 zJ3-KX(8tqF-_Q?KFp6saBJB1KP8xP?89dVH8C;5s(qb?y#`t%ar5uatlNQpsjOYxN zeB-oq3!2DjUwA1Kw{TS_n&zF7-_Xur>GTk{F3)~q5GMe&b5PLXr@w+P$}VQn5b?g< z5VjF^-9PdXVZOfOd3oM{y%7W?(@PQgpF37x7X4-XL;tFh{9hIPwTbS}(&aBs=ua(m zzY6}fmFUlc8!xBz|9@lAuX=uMC;3AYHNxMTOMVspwX*()ume9J66gP({BNn|U$y+2-}pmI!b`^EWgmadcKoW~ukq#|;sAgo z#f$O%d-VCMg1<%`e^vmZ`jdix#~{B-|JBO>S^6#QpQQg|^M4ipm6U%dSf%^@_5VUq XC3%<^Z~*|wFQ4ZZw^B*}+qeG*B7zrr -- Gitee From ae3888e5e16c57159752d1ba943185338d6c3667 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=83=E8=8C=AB=E8=8C=AB?= Date: Mon, 18 Jan 2021 15:08:17 +0800 Subject: [PATCH 4/4] =?UTF-8?q?pom:=20=E6=9B=B4=E6=94=B9=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7=E4=B8=BA=EF=BC=9Av.1.2.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 50 ++++++++++++++++++++++++++++++++++++++------------ pom.xml | 2 +- 2 files changed, 39 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 33a984e..116c00c 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@

lisence - version + version jdk poi antlr4 @@ -23,19 +23,27 @@ ## 1. 项目介绍 -1. `Chimm.Excel` 是什么? -该程序是一个基于 Apache POI 和 Antlr4 打造的 excel 生成的 Java 工具,主要作用在于减少了开发人员通过程序生成表格的工作量,提高了工作效率。 +### 1.1 简介 +`Chimm.Excel` 是什么? +该程序是一个用 Java 写的 Excel 生成工具,基于模板操作,简单,快捷,易上手。 -2. `Chimm.Excel` 的优势是什么? - - 和网上部分的开源软件的区别是,该程序是基于 excel 模板进行工作的,并非基于注解。也就是说,我们首先需要在 office 中编写好我们的 excel 模板才行,优势在于,我们可以直接在 office 中就直接定制化表格的样式,也就是说,样式直接由 excel 软件进行控制了,这大大降低了我们在程序中操作样式的时间。 - - 由于该程序是基于 `Antlr4` 进行开发的,所以在变量定义上面,非常的灵活,我们可以定义集合变量,甚至我们还可以在公式中定义变量。一个表格对应一个数据对象,开发人员只需查询数据、组装数据即可。 - - 可以自定义模板样式,该程序也提供了部分操作表格样式的功能,如:复制一行、合并单元格、更改边框样式等等。 - - 主要的重点功能暂时介绍这么多,这些功能基本能解决绝大部分问题了。如果各位遇到了其他需要解决的应用场景,欢迎评论提出 `issue`,我们一起探讨。 +### 1.2 特性 +1. 数据组装方式大有不同 + + 和网上部分开源软件的区别是,这个程序是基于 excel 模板驱动的,需要在模版里填写变量名称,而并非在程序中添加注解。 -3. excel 模板如何生成? -模板生成非常的简单,我们定义变量的时候,只需要使用 `$` + `大小括号` 包围的形式即可,如:`${school.name}`。 +2. 为什么不采用基于注解的方式? + + 网上一些基于注解的 excel 导出,基本上只能导出简单的表格样式。该程序使用的是 excel 模板,所以可以导出一些比较复杂的表格样式。 + +3. Antlr4 + + Antlr (ANother Tool for Language Recognition) 是一个强大的跨语言语法解析器,可以用来读取、处理、执行或翻译结构化文本或二进制文件。它被广泛用来构建语言,工具和框架。Antlr可以从语法上来生成一个可以构建和遍历解析树的解析器。由于该程序是基于 `Antlr4` 进行开发的,所以在变量定义上面,非常的灵活,我们可以定义集合变量,甚至我们还可以在公式中定义变量。一个表格对应一个数据对象,开发人员只需查询数据、组装数据即可。 -4. `Chimm.Excel` 功能简介 +4. excel 模板如何生成? +模板生成非常的简单,我们定义变量的时候,只需要使用 `$` + `大小括号` 包围的形式即可,如:`${school.name}`。 + +5. `Chimm.Excel` 功能简介 - [x] 导出excel二进制文件 - [x] 根据模板中的变量,将值写入 - [x] 支持公式 @@ -44,6 +52,7 @@ - [x] ⭐️添加行会自动更新公式 - [x] 合并单元格(支持批量合并) - [x] 更改单元格边框样式(加粗、虚线等) + - [x] 支持设置超链接(v1.2.0) ## 2. 功能展示 @@ -149,7 +158,7 @@ com.github.chimmhuang chimm.excel - 1.1.0 + 1.2.0 ``` @@ -270,6 +279,23 @@ public void testFillInTable() throws Exception { } ``` +#### 4.3.6 设置超链接 +```java +public void testFillInTable() throws Exception { + /* + 获取文件的二进制 + 通过 ExcelHelper 获取 excel 表格对象 + ... + */ + + // 获取指定的 sheet 页(该对象即是我们设置好的表格模板) + SheetTable table = excelWorkbook.getSheet(0); + + // 设置超链接 + table.getRow(2).getCell("A").setHyperlinkURL("https://www.baidu.com"); +} +``` + ## 5. 参与贡献 非常欢迎你的加入![提一个 Issue](https://github.com/chimmhuang/chimm.excel/issues/new) 或者提交一个 Pull Request。 diff --git a/pom.xml b/pom.xml index 7a2865c..771f0ab 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.github.chimmhuang chimm.excel - 1.1.0 + 1.2.0 jar chimm.excel chimm.excel 是一款能够简单操作 excel 的程序,该程序提供了如:填充excel模板数据、动态更改表格样式、导出excel等功能,降低了我们对excel的操作难度 -- Gitee