Code前端首页关于Code前端联系我们

Java将数据导入Excel并提供接口传输文件

terry 2年前 (2023-09-25) 阅读数 64 #后端开发

依赖

<!-- https://mvnrepository.com/artifact/net.sourceforge.jexcelapi/jxl -->
<dependency>
	<groupId>net.sourceforge.jexcelapi</groupId>
	<artifactId>jxl</artifactId>
	<version>2.6.12</version>
</dependency>
复制代码

我们需要用到jxl包类,jxl.jar是管理Excel表格的工具类库。除了jxl之外,poi包也是一类用于处理excel的工具。类库。
对比两个包,jxl更适合数据量较大的情况,而poi在数据量不大(5000左右以内)时效率更高,但消耗内存较多,更有可能使内存溢出。

测试数据

private int id;
private String name;
private int age;
private String gender;
复制代码
public List<Person> getPersonList() {
    List<Person> list = new ArrayList<>();
    list.add(new Person(1, "Howie", 20, "female"));
    list.add(new Person(2, "Wade", 25, "male"));
    list.add(new Person(3, "Duncan", 30, "male"));
    list.add(new Person(4, "Kobe", 35, "male"));
    list.add(new Person(5, "James", 40, "male"));
    return list;
}
复制代码

1.将所有数据导入到一张表中

//创建文件本地文件
//直接将文件创建在项目目录中
String filePath = "人员数据.xlsx";
File dbfFile = new File(filePath);
//使用 Workbook 类的工厂方法创建一个可写入的工作薄(Workbook)对象
WritableWorkbook wwb = Workbook.createWorkbook(dbfFile);
//如果文件不存在,则创建一个新的文件
if (!dbfFile.exists() || dbfFile.isDirectory()) {
    dbfFile.createNewFile();
}
//获得人员信息 list (PersonFactroy 类已经被依赖注入)
List<Person> list = personFactroy.getPersonList();
 //创建一个可写入的工作表
WritableSheet ws = wwb.createSheet("列表 1", 0); 
//添加excel表头
ws.addCell(new Label(0, 0, "序号"));
ws.addCell(new Label(1, 0, "姓名"));
ws.addCell(new Label(2, 0, "年龄"));
ws.addCell(new Label(3, 0, "性别"));
int index = 0;
for (Person person : list) {
    //将生成的单元格添加到工作表中
    //(这里需要注意的是,在Excel中,第一个参数表示列,第二个表示行)
    ws.addCell(new Label(0, index + 1, String.valueOf(person.getId())));
    ws.addCell(new Label(1, index + 1, person.getName()));
    ws.addCell(new Label(2, index + 1, String.valueOf(person.getAge())));
    ws.addCell(new Label(3, index + 1, person.getGender()));
    index++;
}
复制代码
Java 导入数据到Excel并提供文件下载接口

2。将数据导入到多个表中

//前面的代码一致

//每个工作表格最多存储2条数据(注:excel表格一个工作表可以存储65536条)
int mus = 2; 
//数据的总大小
int totle = list.size();
//总表格数
int avg = totle / mus + 1;
for (int i = 0; i < avg; i++) {
    //创建一个可写入的工作表
    WritableSheet ws = wwb.createSheet("列表" + (i + 1), i);  
    //添加excel表头
    ws.addCell(new Label(0, 0, "序号"));
    ws.addCell(new Label(1, 0, "姓名"));
    ws.addCell(new Label(2, 0, "年龄"));
    ws.addCell(new Label(3, 0, "性别"));
    int num = i * mus;
    int index = 0;
    for (int m = num; m < list.size(); m++) {
        //判断index == mus的时候跳出当前for循环
        if (index == mus) {
            break;
        }
        Person person = list.get(m);
        //将生成的单元格添加到工作表中
        //(这里需要注意的是,在Excel中,第一个参数表示列,第二个表示行)
        ws.addCell(new Label(0, index + 1, String.valueOf(person.getId())));
        ws.addCell(new Label(1, index + 1, person.getName()));
        ws.addCell(new Label(2, index + 1, String.valueOf(person.getAge())));
        ws.addCell(new Label(3, index + 1, person.getGender()));
        index++;
    }
}
复制代码

这里是按照每个表的数据量来划分的。也可以根据每个表的数据量进行拆分。属性等分为不同的表Java 导入数据到Excel并提供文件下载接口Java 导入数据到Excel并提供文件下载接口

提供文件传输接口

该方法使用文件流来写入文件。该方法类型为void,不需要返回。另外,需要在接口参数中添加HttpServletResponse。.xlsx".getBytes(),"ISO-8859-1");我用的是ISO-8859-1编码,因为ISO-8859-1编码是单字节编码并向后兼容 ASCII,而 Header 仅支持 ASCII。 , 必须是下载的 ASCII 文件的名称。

作者:Howie_Y

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门