`
xiaoxiong_it
  • 浏览: 130104 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

POI 导入导出Excel文件到数据库

阅读更多

刚刚做了JXL导入导出Excel的练习,于是就试着用POI来实现Excel的导入导出,下面是自己POI导入导出Excel的一些代码,仅供参考,如有错误,希望加好友讨论指正。QQ:84926183

 

1.导入相应的poi jar包,我用的是3.7;

 

2.导入Excel文件到数据的类(这里我把解析Excel文件的操作封装成一个类,在action中只要调用该类就可以了):

/**
	 * POI:解析Excel文件中的数据并把每行数据封装成一个实体
	 * @param fis 文件输入流
	 * @return List<EmployeeInfo> Excel中数据封装实体的集合
	 */
	public static List<EmployeeInfo> importEmployeeByPoi(InputStream fis) {
		//这里是解析出来的Excel的数据存放的List集合
		List<EmployeeInfo> infos = new ArrayList<EmployeeInfo>();
                //这里是解析出来的Excel中的每一条数据封装的实体BEAN.
		EmployeeInfo employeeInfo = null;
		
		try {
			//创建Excel工作薄
			HSSFWorkbook hwb = new HSSFWorkbook(fis);
			//得到第一个工作表
			HSSFSheet sheet = hwb.getSheetAt(0);
			HSSFRow row = null;
			//日期格式化
			DateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
			//遍历该表格中所有的工作表,i表示工作表的数量 getNumberOfSheets表示工作表的总数 
			for(int i = 0; i < hwb.getNumberOfSheets(); i++) {
				sheet = hwb.getSheetAt(i);
				//遍历该行所有的行,j表示行数 getPhysicalNumberOfRows行的总数
				for(int j = 1; j < sheet.getPhysicalNumberOfRows(); j++) {
					row = sheet.getRow(j);
					employeeInfo = new EmployeeInfo();
					
					/*此方法规定Excel文件中的数据必须为文本格式,所以在解析数据的时候未进行判断
				  	//方法1:Excel解析出来的数字为double类型,要转化为Long类型必须做相应的处理(一开始用的方法,比较笨。)
					//先把解析出来的double类型转化为String类型,然后截取String类型'.'以前的字符串,最后把字符串转化为Long类型。
					String orgId = row.getCell(0).toString();
					String orgId1 = orgId.substring(0, orgId.indexOf('.'));
					//方法2:其实double类型可以通过(long)Double这样直接转化为Long类型。
					employeeInfo.setOrgId((long)(row.getCell(0).getNumericCellValue()));
					employeeInfo.setEmployeeNumber(row.getCell(1).toString());
					employeeInfo.setFullName(row.getCell(2).toString());
					employeeInfo.setSex(row.getCell(3).toString());
					if(row.getCell(4) != null) {
						try {
							employeeInfo.setDateOfBirth(ft.parse(row.getCell(4).toString()));
						} catch (ParseException e) {
							e.printStackTrace();
						}
					}
					employeeInfo.setTownOfBirth(row.getCell(5).toString());
					employeeInfo.setNationalIdentifier(row.getCell(6).toString());*/
					
					//此方法调用getCellValue(HSSFCell cell)对解析出来的数据进行判断,并做相应的处理
					if(ImportEmployee.getCellValue(row.getCell(0)) != null && !"".equals(ImportEmployee.getCellValue(row.getCell(0)))) {
						employeeInfo.setOrgId(Long.valueOf(ImportEmployee.getCellValue(row.getCell(0))));
					}
					employeeInfo.setEmployeeNumber(ImportEmployee.getCellValue(row.getCell(1)));
					employeeInfo.setFullName(ImportEmployee.getCellValue(row.getCell(2)));
					employeeInfo.setSex(ImportEmployee.getCellValue(row.getCell(3)));
					if(ImportEmployee.getCellValue(row.getCell(4)) != null && !"".equals(ImportEmployee.getCellValue(row.getCell(4)))) {
						try {
							employeeInfo.setDateOfBirth(ft.parse(ImportEmployee.getCellValue(row.getCell(4))));
						} catch (ParseException e) {
							e.printStackTrace();
						}
						employeeInfo.setTownOfBirth(ImportEmployee.getCellValue(row.getCell(5)));
					}
					employeeInfo.setNationalIdentifier(ImportEmployee.getCellValue(row.getCell(6)));
					infos.add(employeeInfo);
				}
				
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return infos;
	}
	//判断从Excel文件中解析出来数据的格式
	private static String getCellValue(HSSFCell cell){
        String value = null;
        //简单的查检列类型
        switch(cell.getCellType())
        {
            case HSSFCell.CELL_TYPE_STRING://字符串
                value = cell.getRichStringCellValue().getString();
                break;
            case HSSFCell.CELL_TYPE_NUMERIC://数字
                long dd = (long)cell.getNumericCellValue();
                value = dd+"";
                break;
            case HSSFCell.CELL_TYPE_BLANK:
                value = "";
                break;   
            case HSSFCell.CELL_TYPE_FORMULA:
                value = String.valueOf(cell.getCellFormula());
                break;
            case HSSFCell.CELL_TYPE_BOOLEAN://boolean型值
                value = String.valueOf(cell.getBooleanCellValue());
                break;
            case HSSFCell.CELL_TYPE_ERROR:
                value = String.valueOf(cell.getErrorCellValue());
                break;
            default:
                break;
        }
        return value;
    }

 action中的写法:

    因为是做练习,只是熟悉它的用法,这里做的比较简单。

//从页面接收参数:文件的路径
		String excelPath = request.getParameter("excelPath");
		//输入流
		InputStream fis = new FileInputStream(excelPath);
		
		//JXL:得到解析Excel的实体集合
		// List<EmployeeInfo> infos = ImportEmployee.importEmployee(fis);
		
		//POI:得到解析Excel的实体集合
		List<EmployeeInfo> infos = ImportEmployee.importEmployeeByPoi(fis);
		
		//遍历解析Excel的实体集合
		for(EmployeeInfo info:infos) {
			//判断员工编号是否存在(存在:做修改操作;不存在:做新增操作)
			EmployeeInfo info1 = this.selectEmpByEmpNum(info.getEmployeeNumber());
			if(info1 == null) {
				//把实体新加到数据库中
				this.service.addEmployeeInfo(info);
			}else{
				//把personId封装到实体
				info.setPersonId(info1.getPersonId());
				//更新实体
				this.updatEmployeeInfo(info);
			}
		}
		//关闭流
		fis.close();

 为了整个导入的完整性,最后附上jsp页面的代码:

<input type="file" id="excelPath" name="excelPath"/>&nbsp;&nbsp;
<input type="button"  value="导入Excel" onclick="importEmp()"/>

-----------------------JS对导入的文件做简单的判断------------------------

//Excel文件导入到数据库中
function importEmp(){
	//检验导入的文件是否为Excel文件
	var excelPath = document.getElementById("excelPath").value;
	if(excelPath == null || excelPath == ''){
		alert("请选择要上传的Excel文件");
		return;
	}else{
		var fileExtend = excelPath.substring(excelPath.lastIndexOf('.')).toLowerCase(); 
		if(fileExtend == '.xls'){
		}else{
			alert("文件格式需为'.xls'格式");
		    return;
		}
	}
	//提交表单
	document.getElementById("empForm").action="<%=request.getContextPath()%>/EmpExcel.action.EmpExcelAction.do?method=importEmployeeInfos";  
	document.getElementById("empForm").submit();
}

 到此为止就是导入Excel文件的所有代码。

 

 

3.导出为Excel文件:

 /**
	 * POI : 导出数据,存放于Excel中
	 * @param os 输出流 (action: OutputStream os = response.getOutputStream();)
	 * @param employeeInfos 要导出的数据集合
	 */
	public static void exportEmployeeByPoi(OutputStream os, List<EmployeeInfo> employeeInfos) {
		
		try {
			//创建Excel工作薄
			HSSFWorkbook book = new HSSFWorkbook();
			//在Excel工作薄中建一张工作表
			HSSFSheet sheet = book.createSheet("员工信息");
			//设置单元格格式(文本)
			//HSSFCellStyle cellStyle = book.createCellStyle();
			//第一行为标题行
			HSSFRow row = sheet.createRow(0);//创建第一行
			HSSFCell cell0 = row.createCell(0);
			HSSFCell cell1 = row.createCell(1);
			HSSFCell cell2 = row.createCell(2);
			HSSFCell cell3 = row.createCell(3);
			HSSFCell cell4 = row.createCell(4);
			//定义单元格为字符串类型
			cell0.setCellType(HSSFCell.CELL_TYPE_STRING);
			cell1.setCellType(HSSFCell.CELL_TYPE_STRING);
			cell2.setCellType(HSSFCell.CELL_TYPE_STRING);
			cell3.setCellType(HSSFCell.CELL_TYPE_STRING);
			cell4.setCellType(HSSFCell.CELL_TYPE_STRING);
			//在单元格中输入数据
			cell0.setCellValue("员工编号");
			cell1.setCellValue("员工姓名");
			cell2.setCellValue("员工性别");
			cell3.setCellValue("出生日期");
			cell4.setCellValue("身份证号");
			//循环导出数据到excel中
			for(int i = 0; i < employeeInfos.size(); i++) {
				EmployeeInfo employeeInfo = employeeInfos.get(i);
				//创建第i行
				HSSFRow rowi = sheet.createRow(i + 1);
				//在第i行的相应列中加入相应的数据
				rowi.createCell(0).setCellValue(employeeInfo.getEmployeeNumber());
				rowi.createCell(1).setCellValue(employeeInfo.getFullName());
				//处理性别(M:男 F:女)
				String sex = null;
				if("M".equals(employeeInfo.getSex())) {
					sex = "男";
				}else {
					sex = "女";
				}
				rowi.createCell(2).setCellValue(sex);
				//对日期的处理
				if(employeeInfo.getDateOfBirth() != null && !"".equals(employeeInfo.getDateOfBirth())){
					java.text.DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
					rowi.createCell(3).setCellValue(format1.format(employeeInfo.getDateOfBirth()));
				}
				rowi.createCell(4).setCellValue(employeeInfo.getNationalIdentifier());
			}
			//写入数据  把相应的Excel 工作簿存盘
			book.write(os);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

 action代码和导入的相似这里就不再进行赘述。

 

 

以上就是自己写的用POI导入导出Excel的全部代码。

分享到:
评论
2 楼 贝塔ZQ 2016-09-14  
实现对excel的操作,可以通过插件实现的,PageOffice插件就挺好使,可以试试哦
1 楼 likj_sh 2014-03-04  
学习了,感谢分享

相关推荐

    SSM框架利用poi导入导出Excel文件 demo

    综上所述,"SSM框架利用poi导入导出Excel文件 demo"项目展示了如何在Java Web应用中集成SSM框架,利用Apache POI库实现Excel文件与数据库之间的数据交换。通过理解这个示例,开发者可以学习到SSM框架的实战技巧以及...

    java-poi导出导入excel文件到数据库

    一、导入Excel到数据库 1. **初始化环境**:首先,确保项目中已经引入了Apache POI库,可以通过Maven或Gradle添加依赖。对于Maven,可以在pom.xml文件中添加如下依赖: ```xml &lt;groupId&gt;org.apache.poi ...

    SpringBootMybatis+poi+Thymeleaf实现excel文件数据导入到数据库以及从数据库将数据导出成excel.zip

    总的来说,这个项目展示了如何在Java环境中,结合Spring Boot的便利性,利用MyBatis进行数据库操作,借助Apache POI处理Excel文件,以及Thymeleaf生成动态页面,实现数据的导入导出功能。这是一个综合性的Java Web...

    SpringBoot +Mybatis +POI导入、导出Excel文件

    - 在需要导出Excel的接口中,根据业务需求查询数据库中的数据,并转换为List集合。 - 创建一个新的Workbook对象,然后创建Sheet,再在Sheet中创建Row和Cell,填充数据。 - 设置样式、合并单元格等高级特性,使...

    使用poi从数据库导出excel表的示例

    总结起来,"使用poi从数据库导出excel表的示例"是一个结合了Struts1 MVC框架和Apache POI库的Java编程任务,它涉及数据库连接、SQL查询、Excel文件生成以及Web应用响应。这个过程不仅有助于数据的高效管理和分享,也...

    excel表导入数据库 数据库导出excel(idea平台)

    1. 使用Apache POI读取Excel文件,遍历每一行每一列,将数据存储到Java对象中。 2. 创建JDBC连接,与数据库建立通信。这通常涉及到设置数据库URL、用户名、密码等信息。 3. 预编译SQL语句,根据Excel中的数据生成...

    POI实现Excel导入导出并附带加载进度条

    总之,这个项目是一个完整的Java解决方案,用于处理Excel文件的导入导出,同时具备用户友好的进度条显示。它利用了Apache POI的强大功能,结合maven的依赖管理,以及可能的GUI组件,提供了高效且直观的数据操作体验...

    Springboot+Poi实现Excel的导入导出

    1. **导出Excel**:首先,使用MyBatis执行SQL查询获取数据,然后通过POI创建一个Workbook对象,代表Excel工作簿。接着,创建Sheet对象表示工作表,并在其中添加Row和Cell来填充数据。最后,将Workbook写入到本地文件...

    spring boot+mybatis plus+easy poi实现数据库导出成excel和excel导入到数据库.zip

    "spring boot+mybatis plus+easy poi实现数据库导出成excel和excel导入到数据库",开发者利用了Spring Boot、MyBatis Plus和EasyPoi库来实现了一个功能强大的数据交互系统,允许用户将数据库中的数据导出为Excel格式...

    POI导入导出excel

    标题"POI导入导出excel"指的是使用Apache POI库来处理Microsoft Excel文件,包括读取(导入)和写入(导出)数据。Apache POI是一个开源项目,允许Java开发者创建、修改和显示Microsoft Office格式的文件,其中Excel...

    SSM框架导入导出Excel文件

    SSM框架配合Apache POI,能够高效地处理Excel数据的导入导出,使得Java Web应用能够与Excel文件进行便捷的数据交换。在实际应用中,需要注意性能优化、错误处理和用户体验,以提供稳定、易用的服务。

    SpringMvc 使用poi导入导出Excel

    本篇文章将详细介绍如何在Spring MVC项目中使用Apache POI库来实现Excel的导入和导出。 Apache POI是Apache软件基金会的一个开源项目,专门用于读写Microsoft Office格式的文件,包括Excel。在Java中,POI提供了API...

    ssh整合poi导入导出Excel

    在Excel导入导出过程中,Apache POI库起到了核心作用。POI提供了HSSF(Horrible Spreadsheet Format)和XSSF(XML Spreadsheet Format)API,分别用于读写旧版的Excel 97-2003格式(.xls)和较新的Excel 2007及以上...

    poi 导入导出excel表格

    在导入导出Excel时,我们需要以下几个关键步骤: 1. **创建Workbook对象**:这是Excel工作簿的基础,可以是HSSFWorkbook(.xls)或XSSFWorkbook(.xlsx)。 2. **创建Sheet对象**:代表Excel工作表,每个Workbook...

    JAVA实现数据库数据导入导出到Excel(POI)所需jar包

    在Java开发中,有时我们需要将数据库中的数据导出到Excel文件,或者从Excel文件导入数据到数据库。Apache POI是一个流行的API,专为处理Microsoft Office格式的文件,如Excel(.xlsx, .xls)。本教程将详细介绍如何...

    poi导入导出excel

    总结起来,Apache POI 提供了强大的工具来处理 Excel 文件,无论是从数据库导出数据到 Excel,还是从 Excel 导入数据到应用程序。通过理解这些核心概念和方法,开发者可以灵活地构建功能丰富的 Excel 导入导出功能,...

    利用java导入导出excel到oracle数据库的POI的jar文件包

    利用java导入导出excel到oracle数据库需要用到的jar包 用到的JAR包如下(可以直接到POI官网上下载也可以在文章的附件中下载): poi-3.9-20121203.jar poi-ooxml-3.9-20121203.jar poi-ooxml-schemas-3.9-20121203....

    使用Springboot实现excel的导入导出

    在Spring Boot中实现Excel的导入导出可以通过POI库来实现,POI是一个开源的Java库,用于处理Microsoft Office格式文件,包括Excel。一个简单的示例,演示如何在Spring Boot项目中使用POI来实现Excel的导入导出功能。...

Global site tag (gtag.js) - Google Analytics