poi-tl根据word模板导出word、使用spring-thymeleaf模板生成html并通过docx4j把html转word,使用jxls根据excel模板导出excel(3)
导出word使用技术
https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html
https://www.docx4java.org/trac/docx4j 官网
https://github.com/plutext/docx4j/tree/master/docx4j-samples-docx4j 例子
使用jxls根据excel模板生成excel
官网
Jxls是一个小型Java库,可简化Excel报表的生成。Jxls在Excel模板中使用特殊的标记来定义输出格式和数据布局。
具有某些报告功能的许多Java应用程序都需要Excel生成。
Java有一些用于创建Excel文件的库,例如Apache POI。
这些库虽然很棒,但级别很低,因为它们要求开发人员甚至创建一个简单的Excel文件也要编写许多Java代码。
通常,必须手动设置电子表格的每个单元格格式和数据。根据报表布局和数据格式的复杂性,Java代码可能会变得非常复杂,并且难以调试和维护。
此外,并非所有Excel功能都受支持,并且可以使用库API进行操作(例如,对宏,图形等的有限支持)。对于不受支持的功能,建议的解决方法是在Excel模板中手动创建对象,然后在模板中填充数据。Jxls将这种方法带入了更高的层次。
使用Jxls时,只需要在Excel模板文件中定义所需的报告格式和数据布局,然后运行Jxls引擎以将数据填充到模板中即可。开发人员只需编写少量Java代码即可触发模板的Jxls引擎处理
1.导入依赖
<dependency> <groupId>cn.belier</groupId> <artifactId>jxls-spring-boot-starter</artifactId> <version>1.2.0</version> </dependency> <dependency> <groupId>org.jxls</groupId> <artifactId>jxls-reader</artifactId> <version>2.0.6</version> </dependency>
2.定制模板 和所在位置
3.修改配置指定后缀
4.代码
package com.shan.mydemo.controller;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import sun.misc.BASE64Encoder;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.*;
import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.IntStream;
/**
* @author shanc
* @version 1.0
*/
@Controller
@RequestMapping("/thymeleafDemo")
public class ThymeleafDemoController {
/**
* 作者: shanc
* 时间: 2021/4/19 10:55
* 描述: jxls根据excel模板导出excel
*/
@GetMapping("/title-registry-form-excel")
public String titleRegistryFormExcel(Model model) {
String [] gender={"男","女"};
Date now = new Date();
model.addAttribute("org_name", "中国中煤能源集团有限公司");
model.addAttribute("year_yyyy", "2020");
model.addAttribute("series_name_short", "会计");
model.addAttribute("qualification_name", "高级会计师");
model.addAttribute("proj_level", "高级");
model.addAttribute("fill_form_user_name", "管理员");
model.addAttribute("telephone", "18888888888");
model.addAttribute("fill_form_date", TasDateTimeUtils.format(now, "yyyy年MM月dd日"));
List<Map<String,Object>> list =new ArrayList<>();
ThreadLocalRandom random =ThreadLocalRandom.current();
IntStream.range(0,random.nextInt(10,30)).mapToObj(i ->{
Map<String,Object> row=new LinkedHashMap<>();
row.put("sys_no","00000"+i);
row.put("org_name", "单位_" + i);
row.put("full_name", "姓名_" + i);
row.put("gender_desc", gender[random.nextInt(0, 2)]);
row.put("birth_date_str", TasDateTimeUtils.format(now, "yyyy-MM-dd"));
List<String> strings = Arrays.asList("2020-12-01", "2020-12-02");
String graduation_date_list_str = StringUtils.join(strings,"\n\r" );
System.out.println(graduation_date_list_str);
row.put("graduation_date_list_str", graduation_date_list_str);
row.put("graduation_school_list_str",StringUtils.join(Arrays.asList("烟台大学","南京大学"),"\n\r") );
return row;
}
).forEach(list::add);
model.addAttribute("dataList", list);
// file name
model.addAttribute("JXLS_FILENAME_KEY",
"title-registry-form-" + System.currentTimeMillis());
// generate view
return "report/title-registry-form-v1";
}
/**
* 作者: shanc
* 时间: 2021/4/19 10:55
* 描述: 自定义模板 jxls根据excel模板导出excel
*/
@GetMapping("/jxls-demo2")
public String jxlsDemo2(Model model) {
String [] gender={"男","女"};
Date now = new Date();
model.addAttribute("org_name", "中国中煤能源集团有限公司");
model.addAttribute("fill_form_user_name", "管理员");
List<Map<String,Object>> list =new ArrayList<>();
ThreadLocalRandom random =ThreadLocalRandom.current();
IntStream.range(0,random.nextInt(10,30)).mapToObj(i ->{
Map<String,Object> row=new LinkedHashMap<>();
row.put("sys_no","00000"+i);
row.put("org_name", "单位_" + i);
row.put("full_name", "姓名_" + i);
row.put("gender_desc", gender[random.nextInt(0, 2)]);
row.put("birth_date_str", TasDateTimeUtils.format(now, "yyyy-MM-dd"));
System.out.println(row);
return row;
}
).forEach(list::add);
model.addAttribute("dataList", list);
// file name
model.addAttribute("JXLS_FILENAME_KEY",
"jxls-demo2-" + System.currentTimeMillis());
// generate view
return "report/jxls-list3";
}
}
画模板
title-registry-form-v1.xls 模板
测试
localhost:9001/thymeleafDemo/title-registry-form-excel
打开下载文件
jxls-list3.xls 模板
通过编辑批注写表达式
jx:area(lastCell="E4")
jx:each(items="dataList" var="item" lastCell="E3")
代码
//自定义模板
@GetMapping("/jxls-demo2")
public String jxlsDemo2(Model model) {
String [] gender={"男","女"};
Date now = new Date();
model.addAttribute("org_name", "中国中煤能源集团有限公司");
model.addAttribute("fill_form_user_name", "管理员");
List<Map<String,Object>> list =new ArrayList<>();
ThreadLocalRandom random =ThreadLocalRandom.current();
IntStream.range(0,random.nextInt(10,30)).mapToObj(i ->{
Map<String,Object> row=new LinkedHashMap<>();
row.put("sys_no","00000"+i);
row.put("org_name", "单位_" + i);
row.put("full_name", "姓名_" + i);
row.put("gender_desc", gender[random.nextInt(0, 2)]);
row.put("birth_date_str", TasDateTimeUtils.format(now, "yyyy-MM-dd"));
System.out.println(row);
return row;
}
).forEach(list::add);
model.addAttribute("dataList", list);
// file name
model.addAttribute("JXLS_FILENAME_KEY",
"jxls-demo2-" + System.currentTimeMillis());
// generate view
return "report/jxls-list3";
}
测试
http://localhost:9001/thymeleafDemo/jxls-demo2
问题
报template might not exist or might not be accessible by any of the configured Template Resolvers
网上百度方法都试了不好使
追源码发现
实际使用的这个 导致的找不到模板 因为我项目中使用了spring- thymeleaf 模板 thymeleaf 默认为.html 而jxls是找.xls 所以找不到
解决方法添加配置类
package com.shan.mydemo.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
/**
* @author shanc
* @version 1.0
* Date:2020/12/12 20:32
* Description:
**/
@Configuration
public class CorsConfig extends WebMvcConfigurationSupport {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowCredentials(true)
.allowedMethods("GET", "POST", "DELETE", "PUT", "OPTIONS", "")
.maxAge(3600);
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations(
"classpath:/static/");
super.addResourceHandlers(registry);
}
}
即可
但是此时去找模板都是找.xls后缀,thymeleaf模板则无法使用 因为 thymeleaf 默认为.html 现在去找.xls后缀