Excel文件的导入和导出的配置和测试
- 配置依赖POI 版本可以自己选择
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.11</version>
</dependency>
- 创建一个控制层Controller
(1)声明一下:首先我是从前台选择那些需要导出,这里是前后台连接在一起的。
function exportUsers() {
//alert("导出Excel文件~~~~~");
var ids=new Array();
var childs = $("[name='child']:checked");
if(childs.length>0){
for(var i=0;i<childs.length;i++){
var id=childs[i].value;
ids.push(id);
location.href="/user_exportUsers/"+ids;
}
}else{
alert("请选中要导出的数据!");
}
}
(2)我们要首先要获取前台jsp传过来的id值,根据id来确定需要导出的是谁。然后我会用到mybatis-plus使用注解的方式来查出具体的数据。
(3)以上都是准备工作,现在才是正题:
1.先创建工作簿对象
HSSFWorkbook workbook=new HSSFWorkbook();
2.创建一个sheet对象
HSSFSheet sheet = workbook.createSheet("用户信息统计表");
3.如果我们需要在导出的excel中给一个标题 那么自己可以设置每个字段对应的是什么内容
HSSFRow titleRow = sheet.createRow(0);
String[] titles={"工号","姓名","头像","性别","手机","邮箱"};
for (int i = 0; i < titles.length; i++) {
HSSFCell cell = titleRow.createCell(i);
cell.setCellValue(titles[i]);
}
4.接下来就是你需要把数据库的那些数据给导出去,自己去设置和选择,先要遍历上面用mybatis-plus获取的list集合
for (int i = 0; i <users.size() ;) {
User user = users.get(i);
HSSFRow row = sheet.createRow(++i);
5.开始创建单元格并且赋值就是写入到excel表格中
HSSFCell unoCell = row.createCell(0);
unoCell.setCellValue(user.getUno());
HSSFCell unameCell = row.createCell(1);
unameCell.setCellValue(user.getUname());
HSSFCell uimageCell = row.createCell(2);
uimageCell.setCellValue(user.getUimage());
HSSFCell usexCell = row.createCell(3);
usexCell.setCellValue(user.getUsex()==1?"男":"女");
HSSFCell phoneCell = row.createCell(4);
phoneCell.setCellValue(user.getUphone());
HSSFCell uemailCell = row.createCell(5);
uemailCell.setCellValue(user.getUemail());
6.接下来有两种选择方式
(1)第一种就是我在前台界面手动导入选择的方式
首先要string一个excel表格的名字
String fileName="用户信息统计表.xls";
然后获取输出流 ServletOutputStream out = response.getOutputStream();
我们在这里设置的强制下载不打开的模式 response.setContentType("application/force-download");
在这里会出现乱码,中文需要给编码格式
response.addHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName, "utf-8"));
最后一步就是导出文件
workbook.write(out);
System.out.println("Excel文件导出成功~~~");
(2)第二种就是直接导出文件不需要其他的下载强制那些。但是需要给一个导出到哪的路径
File file=new File("F:/用户信息统计表.xls");
workbook.writ(new FileOutputString(file));
Excel文件导入
文件的导入跟导入没多大差别
- 首先要在导出的Controller里面创建一个导入的方法。
要获取到上传文件的值
jsp里面的代码:
<input type="file" id="user-name" required placeholder="导入文件" name="uploadExcel">
后台获取方式:
String filename = uploadExcel.getOriginalFilename();
2.先判断获取的filename有没有,然后创建一个工作簿对象,然后创建一个sheet但是在这里是getSheetAt跟导出有一点不同
HSSFWorkbook workbook = new HSSFWorkbook(inputStream);
HSSFSheet sheet = workbook.getSheetAt(0);
3.在这里需要创建一个实体类对象和集合,好存值导入到数据库
List<User> users = new ArrayList<User>();
User user = new User();
接下来的代码跟导出需要导出的具体数据一样
for (int j = 0; j < row.getLastCellNum(); j++) {
HSSFCell cell = row.getCell(j);
String cellStr = "";
if (cell == null) {// 单元格为空设置cellStr为空串
cellStr = "";
} else if (cell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN) {// 对布尔值的处理
cellStr = String.valueOf(cell.getBooleanCellValue());
} else if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {// 对数字值的处理
cellStr = cell.getNumericCellValue() + "";
} else {
// 其余按照字符串处理
cellStr = cell.getStringCellValue();
}
if (j == 0) {
user.setUno(cellStr);
}
if (j == 1) {
user.setUname(cellStr);
}
if (j == 2) {
user.setUimage(cellStr);
}
if (j == 3) {
user.setUsex(cellStr.equals("男") ? 1 : 0);
}
if (j == 4) {
user.setUphone(cellStr);
}
if (j == 5) {
user.setUemail(cellStr);
}
}
最后一步调用mybatis-plus方法把值给存进到数据库
boolean b = us.saveBatch(users);
如果对你有所帮助,麻烦点赞支持一下,谢谢