From 9b720b24d4a71584f11e3eba81fa68e21436fe29 Mon Sep 17 00:00:00 2001 From: lbw Date: Fri, 27 May 2022 16:54:54 +0800 Subject: [PATCH] :bookmark: Releasing / Version tags. 1.2.2 --- LICENSE | 202 ------------------ .springjavaformatconfig | 1 + README.md | 5 +- pom.xml | 8 +- .../excel/ResponseExcelAutoConfiguration.java | 4 +- .../excel/annotation/ResponseExcel.java | 6 + .../excel/handler/ManySheetWriteHandler.java | 10 +- .../handler/SingleSheetWriteHandler.java | 10 +- .../pig4cloud/plugin/excel/FillExcelTest.java | 11 + src/test/resources/tmp/fill.xlsx | Bin 0 -> 8525 bytes 10 files changed, 44 insertions(+), 213 deletions(-) delete mode 100644 LICENSE create mode 100644 .springjavaformatconfig create mode 100644 src/test/java/com/pig4cloud/plugin/excel/FillExcelTest.java create mode 100644 src/test/resources/tmp/fill.xlsx diff --git a/ LICENSE b/ LICENSE deleted file mode 100644 index ceee3cb..0000000 --- a/ LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/.springjavaformatconfig b/.springjavaformatconfig new file mode 100644 index 0000000..6d408bb --- /dev/null +++ b/.springjavaformatconfig @@ -0,0 +1 @@ +java-baseline=8 diff --git a/README.md b/README.md index 95d018b..f31943e 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目 com.pig4cloud.excel excel-spring-boot-starter - 1.2.1 + 1.2.2 ``` @@ -46,7 +46,7 @@ public class Demo { @ExcelProperty(index = 1) private String password; } -```RequestExcel +``` - 测试表格 @@ -82,6 +82,7 @@ public @interface ResponseExcel { ### 基础用法 - 返回单 `sheet`, 全部字段导出 +- ```java @ResponseExcel(name = "test", sheets = @Sheet(sheetName = "testSheet1")) @GetMapping("/e1") diff --git a/pom.xml b/pom.xml index b42b60a..a4e3538 100644 --- a/pom.xml +++ b/pom.xml @@ -5,12 +5,12 @@ org.springframework.boot spring-boot-starter-parent - 2.6.7 + 2.7.0 com.pig4cloud.excel excel-spring-boot-starter - 1.2.1 + 1.2.2 excel-spring-boot-starter easy and high performance excel https://pig4cloud.com @@ -37,8 +37,8 @@ 1.8 3.1.0 - 2.2.2 - 0.0.29 + 2.3.0 + 0.0.32 2.2.5 diff --git a/src/main/java/com/pig4cloud/plugin/excel/ResponseExcelAutoConfiguration.java b/src/main/java/com/pig4cloud/plugin/excel/ResponseExcelAutoConfiguration.java index 2c2f9ce..ebcf5aa 100644 --- a/src/main/java/com/pig4cloud/plugin/excel/ResponseExcelAutoConfiguration.java +++ b/src/main/java/com/pig4cloud/plugin/excel/ResponseExcelAutoConfiguration.java @@ -7,10 +7,10 @@ import com.pig4cloud.plugin.excel.processor.NameProcessor; import com.pig4cloud.plugin.excel.processor.NameSpelExpressionProcessor; import lombok.RequiredArgsConstructor; +import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.HandlerMethodReturnValueHandler; @@ -27,8 +27,8 @@ * 配置初始化 */ @Import(ExcelHandlerConfiguration.class) +@AutoConfiguration @RequiredArgsConstructor -@Configuration(proxyBeanMethods = false) @EnableConfigurationProperties(ExcelConfigProperties.class) public class ResponseExcelAutoConfiguration { diff --git a/src/main/java/com/pig4cloud/plugin/excel/annotation/ResponseExcel.java b/src/main/java/com/pig4cloud/plugin/excel/annotation/ResponseExcel.java index 9069a1f..2e13ee1 100644 --- a/src/main/java/com/pig4cloud/plugin/excel/annotation/ResponseExcel.java +++ b/src/main/java/com/pig4cloud/plugin/excel/annotation/ResponseExcel.java @@ -89,4 +89,10 @@ */ boolean i18nHeader() default false; + /** + * 填充模式 + * @return + */ + boolean fill() default false; + } diff --git a/src/main/java/com/pig4cloud/plugin/excel/handler/ManySheetWriteHandler.java b/src/main/java/com/pig4cloud/plugin/excel/handler/ManySheetWriteHandler.java index 09dc456..6d231cb 100644 --- a/src/main/java/com/pig4cloud/plugin/excel/handler/ManySheetWriteHandler.java +++ b/src/main/java/com/pig4cloud/plugin/excel/handler/ManySheetWriteHandler.java @@ -53,8 +53,14 @@ public void write(Object obj, HttpServletResponse response, ResponseExcel respon Class dataClass = eleList.get(0).getClass(); // 创建sheet sheet = this.sheet(sheets[i], dataClass, responseExcel.template(), responseExcel.headGenerator()); - // 写入sheet - excelWriter.write(eleList, sheet); + // 填充 sheet + if (responseExcel.fill()) { + excelWriter.fill(eleList, sheet); + } + else { + // 写入sheet + excelWriter.write(eleList, sheet); + } } excelWriter.finish(); } diff --git a/src/main/java/com/pig4cloud/plugin/excel/handler/SingleSheetWriteHandler.java b/src/main/java/com/pig4cloud/plugin/excel/handler/SingleSheetWriteHandler.java index a9f7790..a6f7080 100644 --- a/src/main/java/com/pig4cloud/plugin/excel/handler/SingleSheetWriteHandler.java +++ b/src/main/java/com/pig4cloud/plugin/excel/handler/SingleSheetWriteHandler.java @@ -51,7 +51,15 @@ public void write(Object obj, HttpServletResponse response, ResponseExcel respon Class dataClass = list.get(0).getClass(); WriteSheet sheet = this.sheet(responseExcel.sheets()[0], dataClass, responseExcel.template(), responseExcel.headGenerator()); - excelWriter.write(list, sheet); + + // 填充 sheet + if (responseExcel.fill()) { + excelWriter.fill(list, sheet); + } + else { + // 写入sheet + excelWriter.write(list, sheet); + } excelWriter.finish(); } diff --git a/src/test/java/com/pig4cloud/plugin/excel/FillExcelTest.java b/src/test/java/com/pig4cloud/plugin/excel/FillExcelTest.java new file mode 100644 index 0000000..982d618 --- /dev/null +++ b/src/test/java/com/pig4cloud/plugin/excel/FillExcelTest.java @@ -0,0 +1,11 @@ +package com.pig4cloud.plugin.excel; + +/** + * fill 填充测试 + * + * @author lengleng + * @date 2022/5/27 + */ +public class FillExcelTest { + +} diff --git a/src/test/resources/tmp/fill.xlsx b/src/test/resources/tmp/fill.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..5a39a0ff25ed32986d87a15f3914b8da896d900a GIT binary patch literal 8525 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