java使用jxls导出Excel

1. jxls简介

jxls是一个使用XML作为配置文件的Java Excel导出工具,可以将Java中的任何数据结构渲染到Excel中,使用Apache POI进行底层操作,可以轻松地导出Excel报表。

2. jxls的安装与使用

2.1 安装

jxls需要在项目中添加以下依赖项:

```xml

org.jxls

jxls

2.7.0

org.jxls

jxls-poi

2.7.0

```

2.2 使用

使用jxls导出Excel主要有以下几个步骤:

① 构造数据模型

数据模型的构造由业务逻辑决定,可以是Java对象、List集合等。

例如,我们构造了一个用户类:

```java

public class User {

private Integer id;

private String name;

private Integer age;

private String address;

// 省略 getter 和 setter 方法

}

```

构造一个包含多个用户的数据集合:

```java

List userList = new ArrayList<>();

userList.add(new User(1, "Tom", 20, "北京市"));

userList.add(new User(2, "Mary", 22, "上海市"));

// ...

```

② 编写Excel模板

jxls将数据模型渲染到Excel模板中,Excel模板即为承载数据的框架。

模板文件格式为.xls或.xlsx,jxls支持Office 2003和Office 2007格式的Excel文件。

在模板中使用jxls标签表达式,如下:

```xml

${user.id}

${user.name}

${user.age}

${user.address}

```

以上代码表示,在循环遍历`userList`数据集合时,将`id`、`name`、`age`、`address`字段渲染到Excel的单元格中,从A1到D6。

其中,`items`属性表示要遍历的数据集合,`var`属性为遍历时当前元素的别名,`lastCell`属性表示当前遍历到的最后一个单元格,通过`lastCell`属性可以解决循环嵌套和空行的问题。

③ 渲染并导出Excel

数据模型和Excel模板准备就绪后,即可渲染数据并导出Excel。

```java

InputStream is = new FileInputStream(templatePath);

OutputStream os = new FileOutputStream(savePath);

Context context = new Context();

context.putVar("userList", userList);

JxlsHelper.getInstance().processTemplate(is, os, context);

os.flush();

is.close();

os.close();

```

在代码中使用`Context`对象将数据模型传递给Excel模板,使用`JxlsHelper.getInstance().processTemplate()`方法将数据渲染到Excel模板中,`is`和`os`分别是模板文件和输出文件的输入流和输出流。

④ 完整代码

```java

public class JxlsExportDemo {

public static void main(String[] args) throws IOException {

List userList = new ArrayList<>();

userList.add(new User(1, "Tom", 20, "北京市"));

userList.add(new User(2, "Mary", 22, "上海市"));

userList.add(new User(3, "Jack", 25, "深圳市"));

String templatePath = "E:/template.xls";

String savePath = "E:/data.xls";

InputStream is = new FileInputStream(templatePath);

OutputStream os = new FileOutputStream(savePath);

Context context = new Context();

context.putVar("userList", userList);

JxlsHelper.getInstance().processTemplate(is, os, context);

os.flush();

is.close();

os.close();

}

}

```

3. jxls进阶使用

3.1 样式设置

样式设置是Excel报表开发中一个非常重要的环节,好的样式可以提升用户的视觉体验。

jxls通过使用`jx:area`标签设置Excel区域,然后使用`jx:each-cell`标签设置单元格。

```xml

${user.id}

${user.name}

${user.age}

${user.address}

```

以上代码表示,将`tr`和`td`标签分别用`jx:forEach`和`jx:each-cell`标签包裹,`style`属性表示应用的样式。其中,`jx:area`标签用于定义整个Excel区域。

如果想要设置整个Excel区域的样式,可以将`style`属性设置在`jx:area`标签上:

```xml

```

`ss:ID`属性值与`style`属性值对应。

3.2 公式计算

Excel中的公式计算,可以通过jxls的`jx:each-cell`标签实现。

```xml

${user.id}

${user.name}

${user.saleNum}

${user.unitPrice}

${user.saleSum}

${user.address}

```

以上代码表示,在渲染数据时,通过`user.saleNum`和`user.unitPrice`计算出`user.saleSum`,并在Excel中渲染出来。

3.3 条件格式

jxls通过`jx:area`标签和`jx:each-cell`标签实现Excel条件格式。

```xml

${user.id}

${user.name}

${user.age}

${user.address}

```

以上代码表示,通过表达式判断年龄是否大于20岁,当符合条件时应用自定义的样式`s_red`,否则应用自定义的样式`s_green`。

4. jxls注意事项

4.1 jxls标签表达式不支持所有的Java表达式

jxls标签表达式只支持除了类类型 Java 表达式外的所有 Java 表达式,例如:String、Set、HashMap、Object 等等。这意味着,您可能需要在生成报表时使用封装性更好的 Java 类型。

4.2 数据类型的匹配问题

jxls无法自动将数据类型从Java转换为Excel,比如,当你在Excel中使用一个公式时,要确保公式中的变量数据类型和实际数据类型匹配,否则会造成误差。

4.3 jxls标签表达式不支持函数

相对传统的Excel报表开发,jxls还不支持函数,如果需要用到函数,可以使用公式来代替。

5. jxls案例展示

某公司员工表单:

| 工号 | 姓名 | 年龄 | 部门 | 性别 |

| :---: | :---: | :---: | :---: | :---: |

| 1 | 张三 | 28 | 技术部 | 男 |

| 2 | 李四 | 30 | 财务部 | 女 |

| 3 | 王五 | 35 | 人事部 | 男 |

用户类:

```java

public class User {

private Integer id;

private String name;

private Integer age;

private String dept;

private String sex;

// 省略 getter 和 setter 方法

}

```

模板文件:

![模板文件](https://img-blog.csdn.net/20180822154330106?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BpbG90ZnVuMTIz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

代码:

```java

public class EmployeeDemo {

public static void main(String[] args) throws IOException {

List userList = new ArrayList<>();

userList.add(new User(1, "张三", 28, "技术部", "男"));

userList.add(new User(2, "李四", 30, "财务部", "女"));

userList.add(new User(3, "王五", 35, "人事部", "男"));

String templatePath = "E:/Employee_template.xls";

String savePath = "E:/Employee_data.xls";

InputStream is = new FileInputStream(templatePath);

OutputStream os = new FileOutputStream(savePath);

Context context = new Context();

context.putVar("userList", userList);

JxlsHelper.getInstance().processTemplate(is, os, context);

os.flush();

is.close();

os.close();

}

}

```

导出文件:

![导出文件](https://img-blog.csdn.net/20180822154519872?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BpbG90ZnVuMTIz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.ynyuzhu.com/

点赞(67) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部