vue下载和上传excle数据文件,解析excel文件数据并存在数据库中
上传:
VUE:
<el-upload
class="upload-demo"
drag
:action="doUploadUrl"
:on-error ="uploadError"
:before-upload="beforeUpload"
:on-success="handleSuccess"
multiple
:limit="1"
:on-exceed="handleExceed"
:file-list="fileList">
<i class="el-icon-upload"></i>
<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
</el-upload>
<el-alert class="mar-top-15" title="只能上传xlsx/xls文件,且不超过10M" type="error" :closable="false"></el-alert>
JAVA:
/**
* 获取Excel文件(.xls和.xlsx都支持)
* @param file
* @return ResultVo
* @throws IOException
* @throws FileNotFoundException
* @throws InvalidFormatException
*/
@RequestMapping("/uploadOldTaskDataFile.do_")
@ResponseBody
public ResultVo uploadOldTaskDataFile(@RequestBody MultipartFile file) { //对应excel模板内容总行数
int excelTemplateRowNum = 2;
//以excel模板某行作为JSON对象键
int jsonRowNum = 1; JSONArray array = new JSONArray();
try {
array = new ParseExcelToJSONArrayUtil().parseExcelFile(file, excelTemplateRowNum, jsonRowNum);
} catch (Exception e) {
log.error("excel文件解析异常");
return null;
} return historyImportService.addOldFinishedTask(array);
}
public class ParseExcelToJSONArrayUtil { private static final Logger log = LoggerFactory.getLogger(ParseExcelToJSONArrayUtil.class); /**
* description: 解析excel文件成JSONArray
*
* @param file
* @param excelTemplateRowNum 对应excel模板内容总行数
* @param jsonRowNum 以excel模板某行作为JSON对象键
*
* @return JSONArray
*/
public JSONArray parseExcelFile(MultipartFile file, int excelTemplateRowNum, int jsonRowNum) throws Exception{ JSONArray array = new JSONArray(); File newFile = multipartFileToFile(file); array = readXLSOrXLSX(newFile, excelTemplateRowNum, jsonRowNum); //删除在项目目录下自动生成一个临时的file文件
File del = new File(newFile.toURI());
del.delete(); return array;
} /**
* MultipartFile转换成能解析的File文件
*
* @param multipartFile
* @return File
*/
public File multipartFileToFile (MultipartFile multipartFile) throws Exception{
File f = null;
if(multipartFile.equals("")||multipartFile.getSize() <= 0){
multipartFile = null;
}else{
InputStream ins = multipartFile.getInputStream();
f = new File(multipartFile.getOriginalFilename());
inputStreamToFile(ins, f);
}
return f;
} /**
* 流转换成File文件
*
* @param file
* @param inputStream
*/
public void inputStreamToFile(InputStream inputStream, File file) {
FileOutputStream os = null;
try {
os = new FileOutputStream(file);
int bytesRead = 0;
byte[] buffer = new byte[1024];
while ((bytesRead = inputStream.read(buffer)) != -1){
os.write(buffer,0,bytesRead);
}
}catch (Exception e){
throw new RuntimeException("调用inputStreamToFile产生异常:"+e.getMessage());
}finally {
try {
if (os != null){
os.close();
}
if (inputStream != null){
inputStream.close();
}
}catch (IOException e){
throw new RuntimeException("inputStreamToFile关闭io产生异常:"+e.getMessage());
}
}
} /**
* 读取XLS或者XLSX文件
* @param file,excelTemplateRowNum,jsonRowNum
* @return
* @throws Exception
*/
public JSONArray readXLSOrXLSX(File file, int excelTemplateRowNum, int jsonRowNum) throws Exception {
Workbook book = null;
try {
book = new XSSFWorkbook(file);
} catch (Exception ex) {
book = new HSSFWorkbook(new FileInputStream(file));
}
Sheet sheet = book.getSheetAt(0);
return read(sheet, book, excelTemplateRowNum, jsonRowNum);
} /**
* 解析数据
* @param sheet 表格sheet对象
* @param book 用于流关闭
* @return
* @throws IOException
*/
public JSONArray read(Sheet sheet, Workbook book, int excelTemplateRowNum, int jsonRowNum) throws IOException{
int rowStart = sheet.getFirstRowNum(); // 首行下标
int rowEnd = sheet.getLastRowNum(); // 尾行下标
// 如果首行+excelTemplateRowNum-1与尾行相同,表明只有excelTemplateRowNum行,直接返回空数组
if (rowEnd == rowStart + excelTemplateRowNum - 1) {
book.close();
return new JSONArray();
}
// 获取第jsonRowNum行JSON对象键
Row lastExcelTemplateRow = sheet.getRow(rowStart + jsonRowNum - 1);
int cellStart = lastExcelTemplateRow.getFirstCellNum();
int cellEnd = lastExcelTemplateRow.getLastCellNum();
Map<Integer, String> keyMap = new HashMap<Integer, String>();
for (int j = cellStart; j < cellEnd; j++) {
keyMap.put(j,getValue(lastExcelTemplateRow.getCell(j), rowStart, j, book, true));
}
// 从第excelTemplateRowNum+1行开始获取每行JSON对象的值
JSONArray array = new JSONArray();
for(int i = rowStart + excelTemplateRowNum; i <= rowEnd ; i++) {
Row eachRow = sheet.getRow(i);
JSONObject obj = new JSONObject();
StringBuffer sb = new StringBuffer();
for (int k = cellStart; k < cellEnd; k++) {
if (eachRow != null) {
String val = getValue(eachRow.getCell(k), i, k, book, false);
sb.append(val); // 所有数据添加到里面,用于判断该行是否为空
obj.put(keyMap.get(k),val);
}
}
if (sb.toString().length() > 0) {
array.add(obj);
}
}
book.close();
return array;
} /**
* 获取每个单元格的数据
* @param cell 单元格对象
* @param rowNum 第几行
* @param index 该行第几个
* @param book 主要用于关闭流
* @param isKey 是否为键:true-是,false-不是。 如果解析Json键,值为空时报错;如果不是Json键,值为空不报错
* @return
* @throws IOException
*/
public String getValue(Cell cell, int rowNum, int index, Workbook book, boolean isKey) throws IOException{ // 空白或空
if (cell == null || cell.getCellTypeEnum() == CellType.BLANK ) {
if (isKey) {
book.close();
throw new NullPointerException(String.format("the key on row %s index %s is null ", ++rowNum,++index));
}else{
return "";
}
} // 0. 数字 类型
if (cell.getCellTypeEnum() == CellType.NUMERIC) {
if (HSSFDateUtil.isCellDateFormatted(cell)) {
Date date = cell.getDateCellValue();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return df.format(date);
} /*String val = cell.getNumericCellValue()+"";
val = val.toUpperCase();
if (val.contains("E")) {
val = val.split("E")[0].replace(".", "");
}*/
//防止数字变成科学计数法的形式,使数据最后的0保留
DecimalFormat df = new DecimalFormat("0");
String val = df.format(cell.getNumericCellValue()); //解析excel获得的数字去除末尾的.0
if (val.endsWith(".0")) {
val = val.substring(0, val.length() - 2);
}
return val;
} // 1. String类型
if (cell.getCellTypeEnum() == CellType.STRING) {
String val = cell.getStringCellValue();
if (val == null || val.trim().length()==0) {
if (book != null) {
book.close();
}
return "";
}
return val.trim();
} // 2. 公式 CELL_TYPE_FORMULA
if (cell.getCellTypeEnum() == CellType.FORMULA) {
return cell.getStringCellValue();
} // 4. 布尔值 CELL_TYPE_BOOLEAN
if (cell.getCellTypeEnum() == CellType.BOOLEAN) {
return cell.getBooleanCellValue()+"";
} // 5. 错误 CELL_TYPE_ERROR
return "";
}
}
最后对解析excel文件得到的 JSONArray 数据进行处理,然后批量插入到数据库中
SQL:
<!--批量往 T_HI_TASKINST 表中插入数据-->
<insert id="addOldFinishedTask" parameterType="java.util.List">
INSERT INTO T_HI_TASKINST
(proc_inst_id,node_id,node_type,node_name,assignee,status,operate_time,is_delete,create_time,remark)
values
<foreach collection="list" item="item" index="index" separator="," >
(#{item.processInstanceId},#{item.nodeId},#{item.nodeType},#{item.nodeName},#{item.assignee},#{item.status},#{item.operateTime},#{item.isDelete},#{item.createTime},#{item.remark})
</foreach>
</insert>
POM:
<!-- poi,excel解析xls格式 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<!-- poi-ooxml,excel解析xlsx格式 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency> <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<encoding>UTF-8</encoding>
<nonFilteredFileExtensions>
<nonFilteredFileExtension>xls</nonFilteredFileExtension>
<nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>
vue下载和上传excle数据文件,解析excel文件数据并存在数据库中的更多相关文章
- C#仪器数据文件解析-Excel文件(xls、xlsx)
不少仪器工作站可以将数据导出为Excel文件,包括97-2003版本的xls文件和2007+的xlsx文件. 采集Excel文件相比采集pdf文件更容易.程序更健壮,毕竟Excel中数据有明确的行.列 ...
- 重新想象 Windows 8 Store Apps (66) - 后台任务: 下载和上传
[源码下载] 重新想象 Windows 8 Store Apps (66) - 后台任务: 下载和上传 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 后台任务 后台 ...
- 重新想象 Windows 8.1 Store Apps (91) - 后台任务的新特性: 下载和上传的新特性, 程序启动前预下载网络资源, 后台任务的其它新特性
[源码下载] 重新想象 Windows 8.1 Store Apps (91) - 后台任务的新特性: 下载和上传的新特性, 程序启动前预下载网络资源, 后台任务的其它新特性 作者:webabcd 介 ...
- 解析Excel文件并把数据存入数据库
前段时间做一个小项目,为了同时存储多条数据,其中有一个功能是解析Excel并把其中的数据存入对应数据库中.花了两天时间,不过一天多是因为用了"upload"关键字作为URL从而导致 ...
- github下载和上传项目
git下载和上传项目 下载: git clone +地址 上传: 1.git init 在当前项目的目录中生成本地的git管理(多一个.git文件夹,为隐藏文件) 2.git add .(注意最后面有 ...
- 效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中【附源代码下载】) 转
效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中[附源代码下载]) 本文目录: (一)背景 (二)数据库数据导入到Excel的方法比较 ...
- PHP实时生成并下载超大数据量的EXCEL文件
最近接到一个需求,通过选择的时间段导出对应的用户访问日志到excel中, 由于用户量较大,经常会有导出50万加数据的情况.而常用的PHPexcel包需要把所有数据拿到后才能生成excel, 在面对生成 ...
- Java通过jxl解析Excel文件入库,及日期格式处理方式 (附源代码)
JAVA可以利用jxl简单快速的读取文件的内容,但是由于版本限制,只能读取97-03 xls格式的Excel. 本文是项目中用到的一个实例,先通过上传xls文件(包含日期),再通过jxl进行读取上传 ...
- 数据导出至Excel文件--好库编程网http://code1.okbase.net/codefile/SerializeHelper.cs_2012122018724_118.htm
using System; using System.IO; using System.Data; using System.Collections; using System.Data.OleDb; ...
随机推荐
- PAT 乙级 1048 数字加密(20) C++版
1048. 数字加密(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 本题要求实现一种数字加密方法.首先固 ...
- [UE4]Tool Tip - 提示信息
一.每一个Widget都有Tool Tip,在运行时鼠标移动到UI上,就会显示填写的Tool Tip文字 二.Toop Tips的字体样式和大小不可更改.但是可以Tool Tip可以绑定到一个Wi ...
- Android接听、挂断电话
新建一个名为ITelephony的aidl文件,注意包名不能改变,因为是通过反射方式来实现接听和挂断的
- 如何查看yum 安装的软件路径
1.首先安装一个redis [root@iZbp1eem925ojwyx17ao9kZ ~]# yum install redis 2.查找redis的安装包 [root@iZbp1eem925ojw ...
- Mysql 之闪回技术 binlog2sql
1.下载 https://github.com/danfengcao/binlog2sql http://rpmfind.net Search: python-pip pip 是一个Python包管理 ...
- pandas函数get_dummies的坑
转载:https://blog.csdn.net/mvpboss1004/article/details/79188190 pandas中的get_dummies得到的one-hot编码数据类型是ui ...
- 在Ubuntu16.04下安装 labelImg
首先按照 http://www.linuxdiyf.com/linux/13934.html 和 http://www.linuxdiyf.com/linux/13934.html 在ubuntu ...
- javascript-添加 class 类 和 移出 class 类 方法
/* 添加 class 类 和 移出 class 类 方法*/ function addClass(element, className) { if(!new RegExp("(^|\\s) ...
- Servlet --简单用户留言系统
1.创建用户表和留言表 2.编写数据库连接工具类 public class SqlserverDBConn { private Statement stmt; private Connection c ...
- js中的substring
"ABCDEFG".substring(2,3) 结果为"C"