poi-tl根据word模板导出word、使用spring-thymeleaf模板生成html并通过docx4j把html转word,使用jxls根据excel模板导出excel(3)

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

官网

http://jxls.sourceforge.net/

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后缀

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Poi-tl库根据Word模板填充内容生成Word文档时,可以使用Poi-tl提供的模板语法来处理空值。以下是一个示例代码: ```java import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFRun; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.ParagraphAlignment; import org.apache.poi.xwpf.usermodel.TextAlignment; import fr.opensagres.poi.xwpf.converter.pdf.PdfConverter; import fr.opensagres.poi.xwpf.converter.pdf.PdfOptions; import org.apache.poi.util.Units; import org.apache.poi.xwpf.usermodel.Document; import org.apache.poi.xwpf.usermodel.HeaderFooterType; import org.apache.poi.xwpf.usermodel.IBodyElement; import org.apache.poi.xwpf.usermodel.XWPFTable; import org.apache.poi.xwpf.usermodel.XWPFTableRow; import org.apache.poi.xwpf.usermodel.XWPFTableCell; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.HashMap; import java.util.Map; public class WordTemplateFiller { public static void main(String[] args) { try { // 加载Word模板文件 FileInputStream templateStream = new FileInputStream("template.docx"); XWPFDocument document = new XWPFDocument(templateStream); // 填充内容 Map<String, Object> placeholders = new HashMap<>(); placeholders.put("name", "John Doe"); placeholders.put("age", "30"); placeholders.put("address", ""); replacePlaceholders(document, placeholders); // 保存填充后的文档 FileOutputStream outputStream = new FileOutputStream("filled_template.docx"); document.write(outputStream); outputStream.close(); System.out.println("Word文档生成成功!"); } catch (IOException e) { e.printStackTrace(); } } private static void replacePlaceholders(XWPFDocument document, Map<String, Object> placeholders) { for (XWPFParagraph paragraph : document.getParagraphs()) { for (XWPFRun run : paragraph.getRuns()) { String text = run.getText(0); if (text != null) { for (Map.Entry<String, Object> entry : placeholders.entrySet()) { String placeholder = "${" + entry.getKey() + "}"; if (text.contains(placeholder)) { Object value = entry.getValue(); if (value != null && !value.toString().isEmpty()) { text = text.replace(placeholder, value.toString()); } else { text = text.replace(placeholder, ""); // 替换为空字符串 } run.setText(text, 0); } } } } } } } ``` 在上述代码中,我们首先加载Word模板文件,然后定义了一个`placeholders`的映射,其中包含了要替换的占位符和对应的值。接下来,我们调用`replacePlaceholders`方法来替换文档中的占位符。 在`replacePlaceholders`方法中,我们遍历文档中的每个段落和文本运行,通过检查文本内容中是否包含占位符来确定是否需要替换。如果找到了匹配的占位符,则根据占位符对应的值来进行替换。如果值不为空且非空字符串,则将占位符替换为对应的值;如果值为空或空字符串,则将占位符替换为空字符串。 请注意,上述代码中使用的占位符格式为`${placeholder}`,你可以根据实际情况修改为其他格式。 以上是一个基本示例,你可以根据自己的需求进行修改和扩展。同时,需要确保在项目中添加了Poi-tl的依赖库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值