EasyPoi 使用html模板导出Excel

文章目录

  • EasyPoi 使用html模板导出Excel
    • 依赖
    • 编写freemarker(.ftl)页面模版
    • 将数据渲染到模板中生成html并转换成Excel

EasyPoi 使用html模板导出Excel

总体思路如下
1、编写freemarker(.ftl)页面模版
2、将数据渲染到模板中生成html
3、将html转换成Excel表格

依赖

使用springboot集成的包

		
        <dependency>
            <groupId>cn.afterturngroupId>
            <artifactId>easypoi-spring-boot-starterartifactId>
            <version>4.1.2version>
        dependency>
        
        <dependency>
            <groupId>org.freemarkergroupId>
            <artifactId>freemarkerartifactId>
            <version>2.3.23version>
        dependency>
        
        <dependency>
            <groupId>org.jsoupgroupId>
            <artifactId>jsoupartifactId>
            <version>1.12.1version>
        dependency>

如果不使用springboot,请替换成如下依赖(具体版本可自己上maven仓库查寻)

 		
 		<dependency>
            <groupId>cn.afterturngroupId>
            <artifactId>easypoi-baseartifactId>
            <version>4.1.0version>
        dependency>
        <dependency>
            <groupId>cn.afterturngroupId>
            <artifactId>easypoi-webartifactId>
            <version>4.1.0version>
        dependency>
        <dependency>
            <groupId>cn.afterturngroupId>
            <artifactId>easypoi-annotationartifactId>
            <version>4.1.0version>
        dependency>

编写freemarker(.ftl)页面模版

freemarker语法可自行百度(于JSP有点类似)、这里提供简单的取值、循环模版

<html>
<head>
  <title>excelpoi 测试title>
head>
<body>
  
  
  
  
  <table sheetName="sheetName">
  	<tbody>
	  	<tr>
	  	  <td style="width: 20px;">姓名td>
          <td style="width: 15px;">性别td>
          <td style="width: 30px;">生日td>
	  	tr>
	  	<#list students as stu>
	  		<tr>
	  		  <td>${stu.name}td>
	          <td>${stu.gender}td>
	          <td>${stu.birthday?string["yyyy-MM-dd HH:mm:ss"]}td>
	  		tr>
	  	#list>
  	tbody>
  table>
body>
html>

文件保存未 .ftl 后缀

将数据渲染到模板中生成html并转换成Excel

将所有模版丢到一个文件夹里

		// 第一步:创建一个Freemarker的配置类对象(可以用单例)(全路径为:freemarker.template.Configuration;注意名字可能会和spring的有点冲突)
		Configuration configuration = new Configuration(Configuration.getVersion());
        // 第二步:设置模板文件所在的路径(相对路径,绝对路径都可以,自己把握)。
        configuration.setDirectoryForTemplateLoading(new File("/xxx/xxx/templates"));
        // 第三步:设置模板文件使用的字符集。一般就是utf-8.
        configuration.setDefaultEncoding("utf-8");
        // 第四步:加载一个模板,创建一个模板对象(上面定义的模版文件名)。
        Template template = configuration.getTemplate("test.ftl");
        // 创建输出流
        Writer out = new FileWriter(new File("/xxx/test.html"));
        // 渲染数据并输出
        template.process(result, out);
        // 关闭流
        out.close();
        // 到这一步html已经渲染完毕、读取html将其转换成Excel
        StringBuilder html = new StringBuilder();
        Scanner s = new Scanner(new File("/xxx/xxx/test.html"), "utf-8");
        while (s.hasNext()) {
            html.append(s.nextLine());
        }
        s.close();
        // ExcelType.XSSF 表示 .xlsx格式;ExcelType.HSSF 表示 .xls格式
        Workbook workbook = ExcelXorHtmlUtil.htmlToExcel(html.toString(), ExcelType.XSSF);
        for (int i = 0,len = workbook.getNumberOfSheets();i < len;i++){
        	// 这个操作是设置冻结首行
        	// 可填4个参数 前两个参数是你要用来拆分的列数和行数。后两个参数是下面窗口的可见象限,其中第三个参数是右边区域可见的左边列数,第四个参数是下面区域可见的首行
            workbook.getSheetAt(i).createFreezePane(0,1);
        }
        //存放位置输出流
        FileOutputStream fos = new FileOutputStream("/xxx/xxx/"+System.currentTimeMillis()+".xlsx");
        workbook.write(fos);
        fos.close();
        // Excel文件生成结束、会有两个文件、一个html文件一个Excel文件,可根据自己的业务进行操作

更多easypoi的操作可以百度官方文档查阅(有提供Excel装html的,适用于产品丢个模版过来,我们生成一个ftl的模板;MVC之类的)

文档中提到有个Excel模板导出的做法,试了一遍很多坑,比如遍历的操作

语法如下:{{$fe: mapList t t.id}} 它的键名t改了没有效果 然后多行遍历也跑不起来、可能是我写法有问题,感觉很多坑,用html模板来的熟练点

效果图就不贴了、没啥内容,就一行标题,几行数据

你可能感兴趣的:(Java,springboot)