需要用到下面两个jar包,可以自行到网上下载或者从我提供的百度云链接下载。
链接: https://pan.baidu.com/s/1pFLM7VEKM4WNSQ3FBbHKXQ 提取码: bhje
通过调用工具类,先判断在服务器中指定的文件夹中有没有存在同名的 excle 表,有的话就先删除掉,没有的话,就在指定的文件夹中生成一份新的 excle 表格,再调用浏览器的下载接口,把 excle 表下载到自己电脑上的指定位置,然后删除掉服务器上的 excle 表格。
package com.utils;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import jxl.Sheet;
import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.format.VerticalAlignment;
import jxl.read.biff.BiffException;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
public class MakeExcel {
/**
* 创建 excel 表格
*
* @param list
* 一条数据存一个map对象,map对象中存列和值得对应关系
* @param destFile(目标文件)
* 当然就是要存的文件信息,即表格保存的路径
* @param headList
* 很重要,它是列的展示,当然和数据的列要对应不然找不到对应的地方存储
* @param message
* 表格第一行的表头信息
* @throws WriteException
* @throws IOException
*/
public static void CreateExcelFile(List
/**
* 下载用户 excel 表接口
*
* @param response
* @throws IOException
*/
@RequestMapping("/download")
public void download(HttpServletResponse response) throws IOException {
// 指定一个地方临时存放生成的 excel 文件,然后后面调用浏览器接口下载完后再删除
String FILEPATH = "d:/test.xls";
// 判断 "c:/test.xls" 文件是否已经存在,如果存在就删除掉
MakeExcel.deleteFile(FILEPATH);
// 首行表头信息
List ll = new ArrayList<>();
ll.add("用户ID");
ll.add("姓名");
ll.add("电话");
// 获取所有用户信息
List allUserList = userService.getUserList();
// 将用户的相关信息遍历到 List
根据 controller 层中的提示自己写,主要是对数据库的操作。
数据库中的数据表:
数据库中的数据导入到 excel 表中的效果:
在页面上选中要上传的文件,点击上传按钮。后台接收到上传的 excel 文件,先临时存放到指定的路径,然后再读取临时存放的 excel 文件中数据,读取一条插入一条,或者可以把 excel 中的数据,全部读取出来放到 list 里面,再执行插入数据库操作,等 excel 数据都导入到数据库中后,再把临时存放的 excel 文件给删除掉即可。
提示:在插入数据前,可以检验当前这条数据是否已经存在数据库中,如果存在可以进行更新数据操作。
问:为什么要把 excel 文件临时存放起来?
答:因为浏览器的愿意,无法获取到上传文件的绝对路径。
/**
* 从 excel 中添加数据到数据库中
*
* @param filename
* @param request
* @throws IOException
* @throws BiffException
*/
@RequestMapping(value = "/getexcelfile", produces = "application/json;charset=utf-8")
@ResponseBody
public String getExcelFile(MultipartFile file, HttpServletRequest request) throws IOException, BiffException {
/** 临时存放 excel 文件 **/
// 设置相对路径
String realPath = request.getSession().getServletContext().getRealPath("/upload");
System.out.println(" realPath:" + realPath);
// 存放 excel 文件的绝对路径
String uploadPath = "";
// 获取文件的格式
String extention = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1);
// 对格式进行筛选
// 仅支持上传 excel 文件,xls 或 xlsx
if (extention.equalsIgnoreCase("xls") || extention.equalsIgnoreCase("xlsx")) {
File f = new File(realPath);// 在路径下创建文件夹
String fileName = file.getOriginalFilename();// 获取上传文件原命名
uploadPath = realPath + File.separator + fileName;// 拼接上传路径
System.out.println(" uploadPath:" + uploadPath);
// 如果指定文件 upload 不存在,则先新建文件夹
if (!f.exists()) {
f.mkdirs();
}
file.transferTo(new File(uploadPath));// 文件的传输
} else {
System.out.println("上传文件格式不对!");
}
/** 读取临时存放的 excel 文件,并将数据导入数据库 **/
// 获取 excel 表的文件流
File excelFile = new File(uploadPath);
Workbook book = Workbook.getWorkbook(excelFile);
// 获取 sheet 表
// 可以使用下面的写法,"test0" 表示 sheet 表的名字
// Sheet rs = book.getSheet("test0");
// getSheet(0):表示获取第一张 sheet 表(从左到右数起)
Sheet rs = book.getSheet(0);
int columns = rs.getColumns();// 得到所有的列
int rows = rs.getRows();// 得到所有的行
System.out.println(" columns:" + columns + " rows:" + rows);
List list = new ArrayList<>();// 临时存放 excel 数据
/** 将 excel 数据存放到 List **/
// i=2:表示第三行
for (int i = 2; i < rows; i++) {
User user = new User();
// j=0:表示第一列
// excel 中默认左边编号也算一列,所以需要从第二列开始获取数据,则下面都使用 j++
for (int j = 0; j < columns; j++) {
String id = rs.getCell(j++, i).getContents();
String name = rs.getCell(j++, i).getContents();
String phone = rs.getCell(j++, i).getContents();
System.out.println("id=" + id);
System.out.println("name=" + name);
System.out.println("phone=" + phone);
// 将数据 set 进 user 对象中
user.setId(Integer.parseInt(id));
user.setName(name);
user.setPhone(phone);
// 将 user 对象添加到 List 里
list.add(user);
}
}
/** 将 List 中的数据插入或者更新到数据库 **/
User userOne = new User();
User tempUser = new User();
for (int k = 0; k < list.size(); k++) {
userOne = list.get(k);
tempUser = userService.selectUserById(userOne.getId());
if (tempUser != null) {
// 查询返回值 tempUser 不为空,则说明当前这条信息已经存在数据库
// 进行数据更新操作即可
userService.updataUserByKey(userOne);
} else if (tempUser == null) {
// tempUser 为空,数据库没有当前信息
// 将数据插入即可
userService.insertUser(userOne);
}
}
/** 删除临时存放的 excel 文件 **/
boolean deleteFileState = MakeExcel.deleteFile(realPath + "/test.xls");
if (deleteFileState) {
System.out.println("服务器上文件删除成功!!!");
} else {
System.out.println("服务器上文件删除失败!!!");
}
return " excel 数据更新到数据库成功";
}
根据 controller 层中的提示自己写,主要是对数据的更新和插入操作。
我上面 excel 数据插入的代码是基于第一部分生成的 excel 格式来写的。所以上传 excel 文件可以使用刚刚下载下来的那一个。然后直接修改或者新增数据即可。如下图所示。
数据库中表的数据在导入 excel 数据前的前后对比图:左边是导入数据前,右边是导入数据后。
可以看到,如果数据已经存在,则直接更新数据,如果不存在则插入新的数据。
开发工具:Eclipse
直接 clone 或者下载下来导入即可。
github:https://github.com/yyzheng1729/excelData