Java后端按照模板自动导出excel功能实现并合并多个页签

本文详细描述了如何通过Java后端利用XLSTransformer和ApachePOI库实现按照预定义模板动态生成Excel文件的功能,包括数据查询、服务层处理和文件导出的过程。
摘要由CSDN通过智能技术生成

Java后端实现按照模板自动导出excel功能

按照模板进行自动导出excel功能

本文主要是通过使用XLSTransformer与Apache POI库实现按照模板进行excel文件的导出功能。XLSTransformer是一种模板引擎(是JXLS库的一部分),它能够根据预定义的Excel模板文件以及传入的数据进行动态填充。这意味着它可以查找并替换模板中的特定标记(例如${list.xxx}),用实际数据填充这些位置。Apache POI库的Workbook对象是一个用于处理Microsoft Office格式文件的Java API,尤其是这里用来操作Excel工作簿。
本文主要是对数据库中简单表(无主子表、动态表头等复杂结构)进行查询后进行导出,过程为:首先从数据库按照特定条件对要输出数据进行查询并存储到List<Map<String,Object>>结构中,然后在service层进行导出路径拼接及导出方法调用。

dao层:
@Mapper
public interface YbCjjysMapper {
    List<Map<String,Object>> searchYbCjjys(@Param("dwxh")String dwxh, @Param("nf")String nf, @Param("yf")String yf);
}

在dao层中主要是对数据库中数据按照特定条件查询并保存。

service层

接口如下:

public interface ExportYbService {
	void searchYbCjjys(String templatePath, String outputPath, String dwxh, String nf, String yf);
}

实现类如下:

@Service
public class ExportYbServiceImpl implements ExportYbService {
	@Autowired
   YbCjjysMapper ybCjjysMapper;
	
	@Override
    public void searchYbCjjys(String templatePath, String outputPath, String dwxh, String nf, String yf){
       List<Map<String, Object>> CjjysData = ybCjjysMapper.searchYbCjjys(dwxh, nf, yf);
       String fileName = "123.xlsx";
       String filePath = templatePath+"/"+fileName;
       ExcelUtil.exportExcelByTemplate(filePath,outputPath,fileName,CjjysData);
   }

在service层主要是拼接模板路径并调用utils层的导出方法进行excel导出。其中templatePath是模板存储路径;outputPath为输出路径。

controller层
@RestController
@Api(value = "导出")
@RequestMapping("/yb/export")
public class YbExportController {

    @Autowired
    ExportYbService exportYbService;
    @GetMapping("/exportYb")
    @ApiOperation(value = "按照模板导出")
    void exportYb(String dwxh,String nf,String yf, HttpServletResponse httpServletResponse) throws Exception{
    	exportYbService.searchYbCjjys(ybTemplatePath, ybOutPath, dwxh, nf, yf);
    }

在controller层直接调用service层即可进行导出。

utils层(核心)

其中在service层调用的ExcelUtil.exportExcelByTemplate方法具体代码如下:

public static void exportExcelByTemplate(String templatePath, String outputPath, String fileName, List<Map<String, Object>> exportData) {
        File file = new File(outputPath);
        if (!file.exists()) {
            file.mkdir();
        }
        String filePath = outputPath + System.getProperty("file.separator") + fileName;
        exportFileByTemplate(templatePath, filePath, exportData);
        LOGGER.info("Excel按模板生成成功,文件落地:{}", file.getAbsolutePath());
    }
  • public static: 这意味着该方法是公开的,并且是静态的,因此可以直接通过类名调用,而不需要创建类的实例。
  • void: 方法没有返回值。
  • 首先,创建一个File对象,表示outputPath指定的目录。
  • 接下来,检查这个目录是否存在。如果不存在,则使用mkdir()方法创建它。
  • 然后,使用outputPathfileName和系统属性file.separator(在Windows上通常是\,在Unix/Linux上通常是/)来构建完整的文件路径filePath
  • 调用exportFileByTemplate方法,该方法是用来根据模板生成Excel文件的。它接收三个参数:模板路径、目标文件路径和要导出的数据。
  • 最后,使用LOGGER记录一条信息,表示Excel文件已成功生成并存储在指定的路径。
  • 参数列表:
    • String templatePath: 模板文件的路径。
    • String outputPath: 输出文件的目录路径。
    • String fileName: 输出文件的名称。
    • List<Map<String, Object>> exportData: 要导出到Excel的数据。这是一个列表,其中每个元素都是一个映射,该映射的键是字符串类型(可能是列名),值是对象类型(可能是要填充到相应单元格的数据)。
      • LOGGER的定义如下:
private static final Logger LOGGER = LoggerFactory.getLogger(ExcelUtil.class);
//主要用于初始化一个日志记录器(Logger)对象,通常用于记录日志信息。这里,它使用了SLF4J(Simple Logging Facade for Java)和Logback(或其他SLF4J实现)这样的日志框架。且这个LOGGER变量只能在当前类(在这里是ExcelUtil类)中被访问。可以使用它来记录不同级别的日志信息,如DEBUG、INFO、WARN、ERROR等。

其中exportFileByTemplate方法具体代码如下:

public static void exportFileByTemplate(String templatePath, String outputPath, List<Map<String, Object>> data) {
        Map<String, Object> param = new HashMap<>();
        param.put("list", data);
        Workbook workbook = getWorkBookByTemplate(templatePath, param);
        try (FileOutputStream fileOut = new FileOutputStream(outputPath)) {
            workbook.write(fileOut);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

首先,创建一个新的 HashMap 对象 param,并向其中添加一个键为 “list” 的条目,该条目的值是传入的 data 列表。这一步是为了将数据包装在一个单一的对象中,以便在后续处理中能够方便地访问它。接下来,调用 getWorkBookByTemplate 方法,并传入模板路径 templatePath 和包含数据的 param 映射。这个方法负责根据模板和数据创建一个 Workbook 对象(这是一个Excel工作簿的实例)。使用 try-catch 语句创建一个 FileOutputStream 对象 fileOut,它负责将 Workbook 对象写入到指定的输出路径 outputPath。try-catch 语句确保在写入完成后或发生异常时,FileOutputStream 会被正确关闭。在 try 块内,调用 workbook.write(fileOut) 方法将工作簿的内容写入到文件输出流中,从而生成Excel文件。如果在写入过程中发生 IOException,则捕获该异常并打印其堆栈跟踪信息。

其中getWorkBookByTemplate方法具体代码如下:

public static Workbook getWorkBookByTemplate(String templatePath, Map<String, Object> beanParams) {
        try {
            //读取模板
            InputStream is = new FileInputStream(templatePath);
            XLSTransformer transformer = new XLSTransformer();
            //向模板中写入内容
            return transformer.transformXLS(is, beanParams);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

负责根据提供的模板路径 templatePath 和参数映射 beanParams 来生成一个 Workbook 对象。这个 Workbook 对象代表了一个Excel工作簿,它包含了根据模板填充了数据的内容。具体分析如下:
使用 try-catch 块来捕获可能在读取模板或转换过程中发生的异常。在 try 块内,首先通过 new FileInputStream(templatePath) 创建一个 InputStream 对象 is,用于读取位于 templatePath 路径的Excel模板文件。接下来,创建一个 XLSTransformer 对象,主要用于处理Excel模板的转换工作。调用 transformer.transformXLS(is, beanParams) 方法,并传入之前创建的输入流 is 和参数映射 beanParams。这个方法会读取Excel模板,然后根据提供的参数替换模板中的占位符或变量,并生成一个新的 Workbook 对象。如果在读取模板或转换过程中发生任何异常,catch 块会捕获这些异常,并打印其堆栈跟踪信息。

导入的第三方库
<dependency>
	<groupId>net.sf.jxls</groupId>
	<artifactId>jxls-core</artifactId>
	<version>1.0.6</version>
</dependency>
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi</artifactId>
	<version>3.15</version>
</dependency>
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi-ooxml</artifactId>
	<version>3.15</version>
</dependency>
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi-scratchpad</artifactId>
	<version>3.15</version>
</dependency>

合并多个页签点击此处

  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值