- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
在我们日常开发中常常有需求,需要以Word格式导出各种合同信息,收费凭证等问题。格式较为复杂(如下图)。我们该怎么解决呢?
下面通过五步带大家学习如何使用EasyPOI导出复杂的Word表格!
easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板语言(熟悉的表达式语法),完成以前复杂的写法。
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-web</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-annotation</artifactId>
<version>4.1.0</version>
</dependency>
注意:整体风格和el表达式类似,采用的写法是{{}}代表表达式,然后根据表达式里面的数据取值。
指令 | 作用 |
---|---|
{{test ? obj:obj2}} | 三目运算 |
n: | 表示 这个cell是数值类型 {{n:}} |
le: | 代表长度{{le:()}} 在if/else 运用{{le:() > 8 ? obj1 : obj2}} |
fd: | 格式化时间 {{fd:(obj;yyyy-MM-dd)}} |
fn: | 格式化数字 {{fn:(obj;###.00)}} |
fe: | 遍历数据,创建row |
!fe: | 遍历数据不创建row |
$fe: | 下移插入,把当前行,下面的行全部下移.size()行,然后插入 |
#fe: | 横向遍历 |
v_fe: | 横向遍历值 |
!if: | 删除当前列 {{!if:(test)}} |
‘’ | 单引号表示常量值 ‘’ 比如’1’ 那么输出的就是 1 |
&NULL& | 空格 |
]] | 换行符 多行遍历导出 |
sum: | 统计数据 |
这里Word版本最好在07版本以上,模板后缀为.docx
)将上面修改好的Word模板上传至项目的Resources目录下
编写Word文档的下载方法
@GetMapping(value = "/download")
public void test(HttpServletResponse response) throws Exception{
//获取模板文档
File rootFile =new File(ResourceUtils.getURL("classpath:").getPath());
File templateFile= new File(rootFile,"/word/test.docx");
//填充数据
List<Map> resultList =new ArrayList<>();
Map<String,Object> resultListParams =new HashMap<>();
Map<String,Object> resultListParams2 =new HashMap<>();
resultListParams.put("id","1");
resultListParams2.put("id","2");
resultListParams.put("name","测试1");
resultListParams2.put("name","测试2");
resultListParams.put("zh","111");
resultListParams2.put("zh","222");
resultListParams.put("xx","xx1");
resultListParams2.put("xx","xx2");
resultListParams.put("je","je1");
resultListParams2.put("je","je2");
resultListParams.put("hh","hh1");
resultListParams2.put("hh","hh2");
resultList.add(resultListParams);
resultList.add(resultListParams2);
//准备数据
Map<String,Object> params =new HashMap<>();
params.put("zhandian","测试站点");
params.put("kpsj", "2022-4-1");
params.put("kprs", "5");
params.put("zje", "100");
params.put("je", "50");
params.put("je2", "22");
params.put("xuexiaomingchenghebianhao", "测试学校-55556555");
params.put("resultList",resultList);
XWPFDocument word = WordExportUtil.exportWord07(templateFile.getPath(),params);
String filename = "1+X幼儿照护职业技能等级证书.docx";
response.setHeader("content-disposition","attachment;filename="+new String(filename.getBytes(),"ISO8859-1"));
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
word.write(response.getOutputStream());
}
项目启动成功后我们访问本地接口进行下载!发现所有的值都完成了替换!
我想标记一个字符串,例如 Best Beat Makers,以几乎类似于 NGram 的方式为每个单词生成标记,例如: IN: "Best Beat Makers" OUT: ["Best", "B
这个问题在这里已经有了答案: Is there a way to word-wrap long words in a div? (6 个答案) 关闭 7 年前。
我想编写一个 Python 代码来检查字符串是否包含类似于以下内容的内容: 'word.Word' => 将其替换为 'word.\nWord'。 smallLetter.capitalLetter
我想编写一个 Python 代码来检查字符串是否包含类似于以下内容的内容: 'word.Word' => 将其替换为 'word.\nWord'。 smallLetter.capitalLetter
我有以下正则表达式: ^--([\w|-]+) 我想匹配 --word --no-word 但不是: ---word ----word 最佳答案 将表情更改为 ^--(\w[-\w]*) 这需要在两个
在我的加载项中,我需要为每个打开的文档创建一个任务 Pane 。在加载项的启动方法中,我订阅了 ApplicationEvents4_Event.NewDocument 和 Application.D
我使用 word javascript api 开发了一个 word 插件。我的文档 .docx 文件在服务器上,我需要在加载项中单击按钮打开该 .docx 文档作为新的 Word 文档。 请指导我如
我需要在某个地方修复一些 CSS,因为我的文本没有环绕,如果它是一个非常长的单词,它会无限期地继续下去。 在大多数情况下,我在我的 CSS 文件中尝试了 word-wrap: break-word;
这个问题在这里已经有了答案: What is the difference between "word-break: break-all" versus "word-wrap: break-word
这个问题在这里已经有了答案: What is the differect between word-wrap and overflow-wrap? [duplicate] (1 个回答) Is t
问题详细描述如下: 给定两个单词(beginWord 和 endWord)和字典的单词列表,找出是否存在从 beginWord 到 endWord 的转换序列,这样: 一次只能更改一个字母 每个转换后
我以前没有使用过邮件合并字段,我发现的所有内容都要求您在能够插入合并字段之前选择一个数据源。我想要做的就是将字段放在 word 文档上,并且在代码使用它之前不要将其合并。我基本上是在创建文档模板。这在
将此代码放置在ThisDocument_Startup之外的Word文档级VSTO解决方案中的某个位置(创建带单击事件的功能区按钮): int zero = 0; int divideByZero =
有没有办法在没有加载项的情况下启动 MS Word(仅此实例)?我只能找到一种方法来完全禁用加载项。 最佳答案 来自Word command line switches documentation ,
有没有办法在没有加载项的情况下启动 MS Word(仅此实例)?我只找到一种方法来完全禁用加载项。 最佳答案 来自Word command line switches documentation ,您
当使用 URI 方案从网页上托管的 word 模板打开新文档时不起作用。 https://msdn.microsoft.com/en-us/library/office/dn906146.aspx 这
我的问题: overflow-wrap: break-word 和 word-break: break-word 有区别吗? 非重复: 这里有一些现有的问题,乍一看可能是重复的,但实际上不是。 Wha
我希望使用 WordNet 从一组基本术语中寻找相似术语的集合。 例如,单词'discouraged' - 潜在的同义词可能是:daunted, glum, deterred, pessimistic
部署 Word Add in 时,发布没有错误。复制文件后出现以下错误。 我没有太多事情要做。这是堆栈跟踪。 ************** Exception Text **************
我需要一个 Java 正则表达式来匹配除某个单词之外的任何单词,同时包含另一个单词。 例如字符串中不能包含Apple,但必须有Peach。 Apple and Peach - Not match Pe
我是一名优秀的程序员,十分优秀!