Java импортирует данные в Excel и предоставляет интерфейс загрузки файлов.

Java задняя часть база данных Excel

В недавнем проекте я столкнулся с необходимостью импортировать информацию из базы данных в файл Excel, а также предоставить интерфейс для загрузки файла Excel.После этого я сделал резюме, надеясь принести вам помощь.

Исходный код:GitHub.com/Хоуи Юань/E…

полагаться

<!-- 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++;
}

导入数据后的 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++;
    }
}

Здесь разделены по количеству данных в каждой таблице, также можно разделить на различные таблицы по одному из атрибутов и т. д.

Обеспечить интерфейс загрузки файлов

Этот метод использует файловый поток для записи файла.Тип метода - void, возврат не требуется.Кроме того, в параметры интерфейса необходимо добавить HttpServletResponse.

    @RequestMapping(value = "/getExcel", method = RequestMethod.GET)
    public void createBoxListExcel(HttpServletResponse response) throws Exception {
        String filePath = "人员数据.xlsx";
        
        /**
         *  这部分是刚刚导入 Excel 文件的代码,省略
         */
        
        String fileName = new String("人员数据.xlsx".getBytes(), "ISO-8859-1");
        //设置文件名
        response.addHeader("Content-Disposition", "filename=" + fileName);
        OutputStream outputStream = response.getOutputStream();
        FileInputStream fileInputStream = new FileInputStream(filePath);
        byte[] b = new byte[1024];
        int j;
        while ((j = fileInputStream.read(b)) > 0) {
            outputStream.write(b, 0, j);
        }
        fileInputStream.close();
        outputStream.flush();
        outputStream.close();
    }

Затем вводим прямо в адресную строкуlocalhost:8080/getExcelМгновенная загрузка ваших файлов

Уведомление:String fileName = new String("人员信息.xlsx".getBytes(), "ISO-8859-1");Я использовал кодировку ISO-8859-1, причина в том, что кодировка ISO-8859-1 является однобайтовой кодировкой, обратно совместимой с ASCII, но в заголовке поддерживается только ASCII, и имя передаваемого файла должно быть ASCII