本站消息

站长简介/公众号


站长简介:高级软件工程师,曾在阿里云,每日优鲜从事全栈开发工作,利用周末时间开发出本站,欢迎关注我的微信公众号:程序员总部,程序员的家,探索程序员的人生之路!分享IT最新技术,关注行业最新动向,让你永不落伍。了解同行们的工资,生活工作中的酸甜苦辣,谋求程序员的最终出路!

  价值13000svip视频教程,java大神匠心打造,零基础java开发工程师视频教程全套,基础+进阶+项目实战,包含课件和源码

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2021-03(260)

2021-04(132)

2021-05(89)

2021-06(65)

2021-07(11)

java 导入excel文件保存到数据库(二)(poi方式,兼容xls、xlsx、直接复制)

发布于2021-11-25 20:51     阅读(182)     评论(0)     点赞(12)     收藏(3)


目录

java 导入excel文件保存到数据库(一)(jxl方式,直接复制)

1.后台服务端

1.1技术介绍

jxl是一个开源的Java Excel API项目,通过Jxl,Java可以很方便的操作微软的Excel文档。除了Jxl之外,还有Apache的一个POI项目,也可以操作Excel,两者相比之下:Jxl使用方便,但功能相对POI比较弱,很多时候,一个软件应用程序需要生成Microsoft Excel文件格式的报告。有时,一个应用程序甚至希望将Excel文件作为输入数据。例如,一个公司开发的应用程序将财务部门需要所有输出生成自己的Excel。

1.2 所需依赖

<!-- 添加poi 依赖 -->
   <dependency>
		<groupId>org.apache.poi</groupId>
		<artifactId>poi</artifactId>
		<version>3.17</version>
  </dependency>
  <dependency>
		<groupId>org.apache.poi</groupId>
		<artifactId>poi-ooxml</artifactId>
		<version>3.17</version>
  </dependency>

1.3 测试代码

  • 接口
@RequestMapping(value="/upload")
	@ResponseBody
	public String upload_excel(@RequestParam("file") MultipartFile file, HttpServletResponse response,HttpServletRequest request)throws Exception {

		File toFile = null;
		if (file.equals("") || file.getSize() <= 0) {
			file = null;
		} else {
			InputStream ins = null;
			ins = file.getInputStream();
			toFile = new File(file.getOriginalFilename());
			inputStreamToFile(ins, toFile);
			ins.close();

		}
		//所有excel数据,调用工具类
		List<List<Object>> payrollData = GetExcelData.getExcelData( toFile,file.getInputStream());
		System.out.println("haha:"+payrollData.toString());
		//这种方法会在本地产生临时文件,用完后需要删除
		if (toFile.exists()) {
			toFile.delete();
			//第一行表头数据
			List<Object> bt=payrollData.get(0);
			ListIterator li = bt.listIterator();
			while(li.hasNext()){
				Object obj = li.next();
				//String newBt=btChange(obj.toString());
					li.set(onj);

			}
			System.out.println(bt.toString());
			List<Map> data=new ArrayList<>();
			for (int i = 1; i < payrollData.size(); i++) {
				Map<String,String>  map=new HashMap<>();
				//存放临时数据
				List<Object> temp=payrollData.get(i);
				for (int j = 0; j <temp.size() ; j++) {
					String key=bt.get(j).toString();
					
						map.put(key,temp.get(j).toString());
						
				}
				data.add(i-1, map);

			}
			System.out.println(data.toString());
			//保存数据库操作
			payrollService.saveDr(data);
		}
		return "success";
	}
  • 工具类

public class GetExcelData {

    private static final String EXCEL_XLS = "xls";
    private static final String EXCEL_XLSX = "xlsx";
  
    public static List<List<Object>> getExcelData(File file,InputStream is) throws IOException {
        Workbook wb;
        wb = getWorkbok(is, file);
        // 获取工作表的数量
        int numberOfSheets = wb.getNumberOfSheets();
        // 获取第一个工作表
        Sheet sheet = wb.getSheetAt(0);
        //实例化一个二维list集合
        List<List<Object>> listData = new ArrayList<List<Object>>();
        Row row = null;// 行对象
        Iterator<Cell> cols = null;// 列对象
        List<Object> list = null;// 用来存放数据
        int rows = sheet.getPhysicalNumberOfRows();
        for (int i = 0; i < rows; i++) {// 循环每一行的数据
            String value="";
            row = sheet.getRow(i);
            if (row != null) {
                cols = row.cellIterator();
                list = new ArrayList<Object>();
                while (cols.hasNext()) {
                    Cell cell=cols.next();
                    value=getCellValue(cell);
                    list.add(value);//添加每一行的数据到list中
                }
                listData.add(list);//将每一行的list放到另一个list中
            }
        }
        return listData;
    }

    private static Workbook getWorkbok(InputStream in, File file) throws IOException {
        Workbook wb = null;
        if (file.getName().endsWith(EXCEL_XLS)) {
            wb = new HSSFWorkbook(in);
        } else if (file.getName().endsWith(EXCEL_XLSX)) {
            wb = new XSSFWorkbook(in);
        }
        return wb;
    }
 
	//表格中有公式调用该方法,直接得到表达式的值,而不是表达式
    public static String getCellValue(Cell cell) {
        int cellType = cell.getCellType();
        String cellValue = "";
        switch (cellType) {
            case HSSFCell.CELL_TYPE_NUMERIC:
                cellValue = String.valueOf(cell.getNumericCellValue());
                break;

            case HSSFCell.CELL_TYPE_FORMULA:
                try {
                    cellValue = cell.getStringCellValue();
                } catch (IllegalStateException e) {
                    cellValue = String.valueOf(cell.getNumericCellValue());
                }
                break;

            default:
                cellValue = cell.getStringCellValue();
        }

        return cellValue.trim();
    }

}

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}]

注意点:

1. 前端代码可以用任何方式上传文件,但是格式必须是MultipartFile类型
2. 如果不需要前端的话,直接在工具类中创建File文件,获得它的输入流,放入workbook中
3. 表格中有表达式,工具类下方有解决方案,有兴趣可以研究下,本文已调用。

本文知识大部分来源于一位博主的文章
传送去大神博主

如果有用,请点个赞!!!!!

原文链接:https://blog.csdn.net/yyclassmvp/article/details/121493250



所属网站分类: 技术文章 > 博客

作者:狗蛋来了

链接:http://www.javaheidong.com/blog/article/331408/5cf4cd362f9c56761928/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

12 0
收藏该文
已收藏

评论内容:(最多支持255个字符)