JAVA 按Excel模板导出Excel文件之 Jxls

createh51个月前 (02-01)技术教程17

最近要做一个Excel文件导出的功能,多方对比下选用Jxls实现,按Excel模板,填充数据,导出文件。Jxls上手相对来说复杂,对于新手可能还有点抽象,所以打算写几篇文章记录下上手过程,后续也会把比较常用的场景,把对应的实现配置分享上来,希望前人栽树后人乘凉,哈哈。

导出Excel一般有Apache POI、JExcelAPI、EasyExcel、Jxls四种方案来实现。

Apache POI、JExcelAPI都是在代码中动态生成 Excel 内容的,需要在代码里调用API实现创建工作簿(Workbook)、工作表(Sheet)、单元格(Cell)等对象,并在代码中设置它们的属性,如单元格的数值、样式、格式等。JExcelAPI是封装了 Apache POI,API更简单易用点。这两种都是比较“死”的实现,说实话真的应对不了“老板”多变的“心”(需求)啊,说不定没写完A001,数据模板已经变成A95887了,代码里面调整太折磨了,当然还是看自己具体的场景来选方案。

Apache POI示例:

 				// 创建工作簿
        Workbook workbook = new XSSFWorkbook();
        // 创建工作表
        Sheet sheet = workbook.createSheet("Sheet1");
        // 创建行,并设置行号(索引从0开始)
        Row row = sheet.createRow(0);
        // 创建单元格,并设置单元格内容
        Cell cell1 = row.createCell(0);
        cell1.setCellValue("Hello Apache POI");
        Cell cell2 = row.createCell(1);
        cell2.setCellValue("YesYesYes666");
        // 设置单元格样式(可选)
        CellStyle style = workbook.createCellStyle();
        Font font = workbook.createFont();
        font.setBold(true);
        style.setFont(font);
        cell1.setCellStyle(style);
        cell2.setCellStyle(style);
        // 保存 Excel 文件
        try (FileOutputStream outputStream = new FileOutputStream("文件导出.xlsx")) {
            workbook.write(outputStream);
            System.out.println("Excel 文件生成成功!");
        } catch (IOException e) {
            e.printStackTrace();
        }

JExcelAPI示例:

try {
            // 创建工作簿
            WritableWorkbook workbook = Workbook.createWorkbook(new File("output.xls"));
            // 创建工作表
            WritableSheet sheet = workbook.createSheet("Sheet1", 0);
            // 创建并添加单元格
            Label label1 = new Label(0, 0, "Hello JExcelAPI");
            WritableCellFormat cellFormat = new WritableCellFormat(new WritableFont(WritableFont.ARIAL, 12, WritableFont.BOLD));
            label1.setCellFormat(cellFormat);
            sheet.addCell(label1);
            Label label2 = new Label(1, 0, "World");
            label2.setCellFormat(cellFormat);
            sheet.addCell(label2);
            // 写入数据并关闭工作簿
            workbook.write();
            workbook.close();
            System.out.println("Excel 文件生成成功!");
        } catch (Exception e) {
            e.printStackTrace();
        }

EasyExcel、Jxls这两种则是可以基于Excel文件模板来实现的。

EasyExcel是阿里开源的(https://easyexcel.opensource.alibaba.com/docs/current/),目前看最新版本是3.3.3,说明文档提到的jxl内存溢出的问题后续文章会提到解决方案,在本文就先不说明。


主要介绍下EasyExcel通过模板生成Excel的方案,直接把官方说明文档的例子“拿来”~。


    /**
     * 最简单的填充
     *
     * @since 2.1.1
     */
    @Test
    public void simpleFill() {
        // 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替
        String templateFileName =
            TestFileUtil.getPath() + "demo" + File.separator + "fill" + File.separator + "simple.xlsx";

        // 方案1 根据对象填充
        String fileName = TestFileUtil.getPath() + "simpleFill" + System.currentTimeMillis() + ".xlsx";
        // 这里 会填充到第一个sheet, 然后文件流会自动关闭
        FillData fillData = new FillData();
        fillData.setName("张三");
        fillData.setNumber(5.2);
        EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(fillData);

        // 方案2 根据Map填充
        fileName = TestFileUtil.getPath() + "simpleFill" + System.currentTimeMillis() + ".xlsx";
        // 这里 会填充到第一个sheet, 然后文件流会自动关闭
        Map<String, Object> map = MapUtils.newHashMap();
        map.put("name", "张三");
        map.put("number", 5.2);
        EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(map);
    }

使用EasyExcel可以满足简单场景下的Excel文件导出,而且是国内开源,中文文档还是很友好的,满足场景的也可以选择这个方案,而且还招成员,感兴趣的可以试试!



那么对于Jxls(https://jxls.sourceforge.net/)来说,优势在于Jxls可以通过Excel模板的填充数据(包括模板格式、样式、内容等),还支持各种如多Sheet页生成、数据循环回填、if判断、动态网格、照片、甚至数据源配置等。永恒java8当然后续选择v2.14.0版本来实现啦。


Jxls可以选择基于Apache POI或Java Excel API实现Excel操作。选择哪一种需要将对应的依赖全部加上才可以正确执行,不然会报错初始化失败、找不到类、找不到方法等错误。本文选择Apache POI。

导入依赖:

		<dependency>
			<groupId>org.jxls</groupId>
			<artifactId>jxls</artifactId>
			<version>2.14.0</version>
		</dependency>
		<dependency>
			<groupId>org.jxls</groupId>
			<artifactId>jxls-poi</artifactId>
			<version>2.14.0</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>4.1.2</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>4.1.2</version>
		</dependency>

org.jxls:jxls:2.14.0: jxls是jxls库的核心模块,提供了Excel模板引擎和数据填充功能。它允许您在Excel模板中定义布局,样式和数据填充规则,并通过jxls引擎来处理模板并生成最终的Excel报表。

org.jxls:jxls-poi:2.14.0: xls-poi是jxls与Apache POI集成的模块。它提供了jxls与POI库交互的功能,使得jxls能够与POI一起使用来生成和操作Excel文件。jxls-poi模块实现了jxls引擎与POI API之间的桥梁,使得jxls能够利用POI的功能来生成Excel报表。

org.apache.poi:poi:4.1.2: Apache POI是一个用于操作Microsoft Office文档的Java库,包括对Excel等文件格式的读写功能。poi模块是POI库的核心模块,提供了基本的Excel文件操作功能,如创建、读取、修改和保存Excel文件等。

org.apache.poi:poi-ooxml:4.1.2: poi-ooxml模块是POI库中用于处理OOXML格式(即Office Open XML格式)文件的模块。OOXML是一种基于XML的文件格式,用于存储Microsoft Office文档(如.xlsx格式的Excel文件)。poi-ooxml模块扩展了poi模块,使POI库能够处理OOXML格式的Excel文件。

模版文件:




Context context = new Context();
JxlsHelper.getInstance().processTemplate(in,out, context);

模板是通过批注来配置数据的,通过context传入值。

可以通过这个显示设置是否显示批注:

默认需要在A1位置(第一个单元格)批注模板配置的范围(jx:area),不然会报错:


jx:area(lastCell=”A2”)表示模板配置的跟区域定义为 A1:A2。

取值占位符默认为 ${} ,这个也可以通过重写方法改变。

${name}表示从context中取key为name的值赋值给单元格。

${message}表示从context中取key为message的值赋值给单元格。

更多内容请关注后续更新~

相关文章

java读写xml文件(java读取xml工具类)

1.读取xml文件文件格式如下: 张无忌 男 光明顶 minmin 3 4...

java进行后台数据写入word模板再进行压缩包下载

经常会遇到这样需求,写一个导出功能,进行word模板格式进行导出,数据库相应数据回填到word模板中,再对这个模板进行导出功能。如果一次性需要导出多个模板情况下,就要对多个进行压缩成一个压缩包再一次性...

java实现文件上传到服务器(java实现文件上传的三种方式)

java实现文件上传到服务器,java实现大文件上传,java实现大文件分块上传,java实现大文件分片上传,java实现大文件切片上传,java实现大文件批量上传,java实现大文件加密上传,jav...

Java高级特性——注解:注解实现Excel导出功能

注解是 Java 的一个高级特性,Spring 更是以注解为基础,发展出一套“注解驱动编程”。这听起来高大上,但毕竟是框架的事,我们也能用好注解吗?的确,我们很少有机会自己写注解,导致我们搞不清楚注解...

Android 读写文件(安卓开发读写文件)

Android使用一个非常类似与其他平台上的基于磁盘的文件系统. 这节课讲述如何利用File APIs在Android文件系统中读写文件.File 对象非常适合于流式顺序数据的读写. 如图片文件或是网...

Java中excel文件解析总结以及超大文件读写的分析报告

在系统与系统之间进行数据传递时,经常需要使用Excel文件来进行数据的导入或者导出。因此,在Java语言实现这类需求时,往往会面临着数据的导入(解析)或者导出(生成)。Java中可以用来处理Excel...