参考文章
SpringBoot+LayUI+poi 实现Excel文件上传下载
前言
需求:给有几个excel表格,分析整合其中的数据并存入一个记录表(数据库)中。
简单记录一下实现过程。并超级感谢参考文章的博主大大~~。
Ps:个人认为其中DataObject 或DataStore只是数据存储的一种格式而已,公司框架自定义好的。以后可以使用list或Map或其他的方式代替实现。
思路
1、点击【文件导入】按钮,选择一个excel文件
2、读取文件数据
3、存数据库
4、有多个excel文件,重复前三步
Maven依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.14</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.14</version>
</dependency>
前端代码
<div class="layui-row layui-col-md12">
<div class="layui-col-md10 layui-form-col-item ">
<label class="layui-form-label title" style="width: 6vw">记录添加</label>
<div class="layui-input-block upload content1">
<button class="layui-btn layui-btn-normal" data-type="import" id="importData">文件导入</button>
</div>
</div>
</div>
layui.use(['upload', 'element', 'layer','index'], function() {
var $ = layui.jquery
, upload = layui.upload
, element = layui.element
, layer = layui.layer;
upload.render({
elem: '#importData', //与按钮id对应
accept: 'file',
exts: 'pdf|zip|rar|7z|word|xlsx|xls|xlt|xltx|xltm|doc|docx',
size:20480,
auto: true,
data:{
},
url: layui.sight.compileUrl('${rc.contextPath}/sysmanage/generateMisOrDisRecordTableByFile') //此处配置你自己的上传接口即可
,before: function(obj) {
layer.msg('文件上传中...', {
icon: 16,
shade: 0.01,
time: 0
})
}
,done: function(res){
layer.close(layer.msg());//关闭上传提示窗口
// if(res.code == 0){
// //上传成功后,根据文件数据插入数据表
// layer.msg("生成成功,请查看数据库内容是否正确!")
//
// }else{
// layer.msg("上传失败!请重试!")
// }
},error: function(){
//layer.msg('网络异常,请稍后再试!', {icon: 2});
}
});
});
Controller层
/**
* Description:从excel表格中读取数据生成行为临时表,以便插入正式库
* date: 2022年03月1日
*
* @author tcy
*/
@PostMapping("/generateMisOrDisRecordTableByFile")
@ResponseBody
public DataObject generateMisOrDisRecordTableByFile(@RequestPart(value = "file") MultipartFile file) throws AppException {
return manageService.generateMisOrDisRecordTableByFile(file);
}
Service层
/**
* Description:从excel表格中读取数据生成行为临时表,以便插入正式库
* date: 2022年03月1日
*
* @author tcy
*/
@Override
public DataObject generateMisOrDisRecordTableByFile(MultipartFile file) throws AppException {
DataStore result = DataStore.getInstance();
String datetime = "";
try {
InputStream inputStream = file.getInputStream();
//System.out.println("============fileName=============="+file.getOriginalFilename());
//读取excel表格内容---重点
result = ExcelUtil.readExcel(inputStream, filename);
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
//对得到的数据进行分析、储存操作操作
//省略
return null;
}
ExcelUtil工具类
public class ExcelUtil {
/**
* 处理上传的文件
*
* @param in
* @param fileName
* @return
* @throws Exception
*/
public static DataStore readExcel(InputStream in, String fileName) throws Exception {
//创建Excel工作薄
Workbook work = getWorkbook(in, fileName);
if (null == work) {
throw new Exception("创建Excel工作薄为空!");
}
Row row = null;
//Cell cell = null;
DataStore result = DataStore.getInstance();
//将取出来的数据与关键字联系起来
String[] mapkey = new String[]{
"id","name","orgname","bdxwlb","bdxwnr"};
//获取工作空间中的第一个工作簿
Sheet sheet = work.getSheetAt(0);
//获取表格中总列数
row = sheet.getRow(0);
//int colLength = row.getLastCellNum();
// 获取第一个实际行的下标
//System.out.println("======sheet.getFirstRowNum()========="+sheet.getFirstRowNum());
// 获取最后一个实际行的下标
//System.out.println("======sheet.getLastRowNum()========="+sheet.getLastRowNum());
for (int i = sheet.getFirstRowNum(); i <= sheet.getLastRowNum(); i++) {
row = sheet.getRow(i);
// 获取在某行第一个单元格的下标
//System.out.println("======row.getFirstCellNum()========="+row.getFirstCellNum());
// 获取在某行的列数
//System.out.println("======row.getLastCellNum()========="+row.getLastCellNum());
if (row == null || row.getFirstCellNum() == i) {
continue;
}
//DataStore增加一行
result.addRow();
//循环列取数据存入DataStore中
for (int j = row.getFirstCellNum() + 1; j < row.getLastCellNum(); j++) {
//统一取出数据格式为String
row.getCell(j).setCellType(Cell.CELL_TYPE_STRING);
//获取值
String value = row.getCell(j).getStringCellValue();
//存入数据
result.put(result.rowCount() - 1,mapkey[j-1],value);
}
}
work.close();//这行报错的话 看下导入jar包的版本
return result;
}
/**
* 判断文件格式
*
* @param inStr
* @param fileName
* @return
* @throws Exception
*/
public static Workbook getWorkbook(InputStream inStr, String fileName) throws Exception {
Workbook workbook = null;
String fileType = fileName.substring(fileName.lastIndexOf("."));
//System.out.println("==========fileType========"+fileType);
if (".xls".equals(fileType)) {
workbook = new HSSFWorkbook(inStr);
} else if (".xlsx".equals(fileType)) {
workbook = new XSSFWorkbook(inStr);
} else {
throw new Exception("请上传excel文件!");
}
return workbook;
}
}