目录
java 导入excel文件保存到数据库(二)(poi方式,兼容xls、xlsx)
java 导入excel文件保存到数据库
本文所用项目为Springboot项目,基本依赖数据库配置不过多赘述!
1.后台服务端
1.1技术介绍
jxl是一个开源的Java Excel API项目,通过Jxl,Java可以很方便的操作微软的Excel文档。除了Jxl之外,还有Apache的一个POI项目,也可以操作Excel,两者相比之下:Jxl使用方便,但功能相对POI比较弱,很多时候,一个软件应用程序需要生成Microsoft Excel文件格式的报告。有时,一个应用程序甚至希望将Excel文件作为输入数据。例如,一个公司开发的应用程序将财务部门需要所有输出生成自己的Excel。
1.2 所需依赖
<!-- https://mvnrepository.com/artifact/net.sourceforge.jexcelapi/jxl -->
<dependency>
<groupId>net.sourceforge.jexcelapi</groupId>
<artifactId>jxl</artifactId>
<version>2.6.12</version>
</dependency>
<!-- https://mvnrepository.com/artifact/jexcelapi/jxl -->
<dependency>
<groupId>jexcelapi</groupId>
<artifactId>jxl</artifactId>
<version>2.4.2</version>
</dependency>
1.3 测试代码
@RequestMapping(value="/upload")
@ResponseBody
public String upload_excel(@RequestParam("file") MultipartFile file, HttpServletResponse response,HttpServletRequest request)throws Exception {
//这种方法会在本地产生临时文件,用完后需要删除
if (file.exists()) {
file.delete();
System.out.println(1111111111);
int i;
Sheet sheet;
Workbook book;
List<Map> list=new ArrayList<>();
Cell cell1,cell2,cell3,cell4,cell5,cell6,cell7;
String bt1;
try {
//文件必须放到D盘下,excel需要另存为xls格式
book= Workbook.getWorkbook(file.getInputStream());
//获得第一个工作表对象(ecxel中sheet的编号从0开始,0,1s,2,3,....)
sheet=book.getSheet(0);
//获取左上角的单元格
cell1=sheet.getCell(0,0);
System.out.println("标题:"+cell1.getContents());
i=1;
//存表头集合
List<String> bt=new ArrayList();
//取表头,表格有多少列,k就是多少
for (int k = 0; k < 33; k++) {
bt1=sheet.getCell(k,0).getContents();
//这个方法是将表头改成自己想需要的字段名,逻辑就是if判断(如果不需要,请注释下一行)
bt1=btChange(bt1);
bt.add(k, bt1);
}
//获取除表头外行的数据
while(true)
{
Map<String,String> map=new HashMap<>();
//获取每一行的单元格
for (int j = 0; j <33 ; j++) {
cell1=sheet.getCell(j,i);//(列,行)
//map中的key
String key=bt.get(j);
//下面判断语句时作者代码需要,剔除账号和序号那一列的数据,如果不需要,请
if(key.equals("账号")){
}else if(key.equals("序号")){
}
else {
map.put(key,cell1.getContents());
}
}
list.add(i-1, map);
//直接遍历到最后一行,遍历完i++会抛出异常,可以自己修改
if("".equals(cell1.getContents())==true) //如果读取的数据为空
break;
i++;
}
book.close();
}
catch(ArrayIndexOutOfBoundsException e) {
return "success";
}catch (Exception e){
return "false";
}
finally {
//数据集合list
//可以添加保存数据库操作
}
}
return "success";
}
//转换方法
private static void inputStreamToFile(InputStream ins, File file) {
try {
OutputStream os = new FileOutputStream(file);
int bytesRead = 0;
byte[] buffer = new byte[8192];
while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
ins.close();
} catch (Exception e) {
e.printStackTrace();
}
}
2. 前端代码
2.1 js包
只需要这两个js文件
<script type="text/javascript" src="../../../assets/js/jquery-1.7.2.js"></script>
<script type="text/javascript" src="../../../assets/js/ajaxfileupload.js"></script>
2.2 方法
添加标签
<input type="file" id="file" name="file" @change="uploadFile123(this)" title="导入excel"/>
调用方法
function uploadFile123(file){
// var index = layer.msg('正在上传,请稍候',{icon: 16,time:false,shade:0.8});
$.ajaxFileUpload({
url : httpurl+'/payroll/upload' ,
secureuri : false, //一般设置为false
fileElementId : 'file', //文件上传空间的id属性 <input type="file" id="file" name="file" />
type : 'post',
dataType : 'text', //返回值类型 一般设置为
success : function(result) //服务器成功响应处理函数
{
alert(result)
},
error : function(result)//服务器响应失败处理函数
{
}
}
);
return false;
}
3. 运行结果
3.1文件截图
3.2 数据集合
- 方便插入数据库,我把表头提取首字母了。(代码有备注,如果业务逻辑需要,自己添加代码就行了)
[{sds=103.49, lsxbt=0, zfbt=1757, kylbx=507.355, zwgz=1250, gwjt=655, bksds=0, dwfdzynj=285.4, syshbt=585, dky=0, cgbt=0, bfgz=0, zfgjj=1761, kyanglbx=856.2, BASESALARY=563, REALWAGES=3550.925, kghf=77.595, dwfdsybxj=19.4, jtbt=250, NAME=arices, kfhj=3772.535, WAGESPAYABLE=5060, ybhj=7323.46, qtkk=0, dwfdghf=77.595, dwfdylbx=429.765, dwfdyanglbx=570.8, dwfdgjj=880.5, kzynj=428.1, ksybx=38.795, dke=0}, {sds=2, lsxbt=2, zfbt=2, kylbx=2, zwgz=2, gwjt=2, bksds=1, dwfdzynj=2, syshbt=2, dky=2, cgbt=2, bfgz=2, zfgjj=2, kyanglbx=2, BASESALARY=2, REALWAGES=2, kghf=2, dwfdsybxj=2, jtbt=2, NAME=21213, kfhj=2, WAGESPAYABLE=2, ybhj=2, qtkk=1, dwfdghf=2, dwfdylbx=2, dwfdyanglbx=2, dwfdgjj=2, kzynj=2, ksybx=1, dke=2}]
插入数据库代码就不写了,喜欢的请点个赞,如有问题私聊作者,作者会尽快恢复的!