poi解析excel导入MySQL数据库

ssh框架下利用poi解析excel文件后导入数据库到相应的字段,列出遇到的问题,贴出解决办法,网上的代码虽然是遍地开发,但最开始的时候确实给了我不少的启示,良莠不齐,要花大量的的时间来甄选,比较苦恼,另外得根据自己的实际情况作出符合的调整,才能实现,才能为我所用,有一些代码虽然可以实现最后的目的,但是过程繁琐,本可以很简单的解决。

最开始的时候,一心只想着只有能够把excel成功导入数据就OK了,做到了之后,就开始想着,对不同版本的excel(2003.2007)都能够满足,excel中数据格式的问题,可以在弄出一个通用的版本出来,以后再碰到同样的事件就要简单许多。

直接贴代码

jsp

<form id="file" name="form1" action="upload.action" method="post" enctype="multipart/form-data">
 <s:file name="uploadExcel" label="文件" id="fileName" accept=".xls,.xlsx"></s:file>
 <input type="submit" value="导入数据" οnclick="checkFile();" id="go" > 
 </form>

action

private File uploadExcel;
public File getUploadExcel() {
  return uploadExcel;
}
public void setUploadExcel(File uploadExcel) {
  this.uploadExcel = uploadExcel;
}
SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
String filePath = uploadExcel.getPath();
Workbook workBook = WorkbookFactory.create(new FileInputStream(filePath));
for (int numSheet = 0; numSheet < workBook.getNumberOfSheets(); numSheet++) {
    	Sheet sheet = workBook.getSheetAt(numSheet);
	   if (sheet == null) {
		continue;
	    }
            User user = new User();           
            for (int rowNum = 1; rowNum <= sheet.getLastRowNum(); rowNum++) {
              Row xRow = sheet.getRow(rowNum);        	  
        	  int cellNum = xRow.getPhysicalNumberOfCells();        	  
        	  for(int c=1 ; c<cellNum ; c++){
        		Cell xCell = xRow.getCell(c);        		
        		int cellType = xCell.getCellType();
        		String cellValue = null;
        		int cv = 0;       		
        		switch (cellType) {
				case Cell.CELL_TYPE_STRING:  //文本
					cellValue = xCell.getStringCellValue();
					break;
				case Cell.CELL_TYPE_NUMERIC:  //日期或数字
					 if(DateUtil.isCellDateFormatted(xCell)) {
						 cellValue = fmt.format(xCell.getDateCellValue());   // 日期
					}else{
						 cv = (int)xCell.getNumericCellValue();
						 cellValue = String.valueOf(cv);  // 数字
					}
					break;
				case Cell.CELL_TYPE_BOOLEAN:   // 布尔型
					cellValue = String.valueOf(xCell.getBooleanCellValue());
					break;
				case Cell.CELL_TYPE_BLANK:   // 空白
					cellValue = xCell.getStringCellValue();
				    break;
				case Cell.CELL_TYPE_ERROR:  // 错误
					cellValue = "错误";
					break;
				case Cell.CELL_TYPE_FORMULA:  // 公式
					cellValue = "错误";
					break;
				default:
					cellValue = "错误";
				}
        		
        		switch (c) {
				case 1:
					user.setUserName(cellValue);
					break;
				case 2:
					user.setName(cellValue);
					break;
				case 3:
					user.setPassword(cellValue);
					break;
				case 4:
					user.setPhone(cellValue);
					break;
				case 5:
					user.setGender(cellValue);
					break;
				case 6:
					user.setDeleteFlg(cellValue);
					break;
				case 7:
					
         			user.setGroupId(Integer.parseInt(cellValue));
         			break;
				case 8:
					user.setCreateUserId(Integer.parseInt(cellValue));
					break;
				case 9:
					user.setCreateUserName(cellValue);
					break;
				case 10:
					user.setCreateTime(Date.valueOf(cellValue));
					break;
				case 11:
					user.setUpdateUserId(Integer.parseInt(cellValue));
					break;
				case 12:
					user.setUpdateUserName(cellValue);
					break;
				case 13:
					user.setUpdateTime(Date.valueOf(cellValue));
					break;
				default:
					break;
				}
              }
        	  this.userService.save(user);
        }
       }     

遇到的问题

1、总是在构建excel文件对象的那句出错,在控制台只有warn,原因是缺一个xmlbeans.jar这个包(之前已经导入了其他poi的包,很多网上的都没有这个包),导入即可

     poi包下载链接: http://download.csdn.net/detail/forrest_ou/9611291

2、User user = new User(); 这行代码忘记写和写错,那样传过来的值就是null

3、关于精简的问题,下面的两种方案都可以达到目的,代码量天壤之别

String path = ServletActionContext.getServletContext().getRealPath( "/upload");        	 
File f = new File(path , uploadExcelFileName);
FileUtil.copyFile(uploadExcel,f);
String filePath = f.getPath();
String filePath = uploadExcel.getPath();

4、excel格式的问题,上面的代码对excel单元格的格式进行了判断,并都转为string格式,在导入数据库相应格式的时候在转,这样就不用管excel中的格式问题了,下面是最开始用的简单的代码,如果项目简单,也可以试试,毕竟很好弄

user.setUserName(xRow.getCell(0).getStringCellValue());
     	user.setName(xRow.getCell(1).getStringCellValue());
     	user.setPassword(xRow.getCell(2).getStringCellValue());
     	user.setGender(xRow.getCell(3).getStringCellValue()); 
     	user.setDeleteFlg(xRow.getCell(4).getStringCellValue()); 
      	this.userService.save(user);


以上基本上是碰见的所有内容了,如果有朋友有其他的见解,欢迎留言,希望能共同进步


--------------------------更新分割线------------------------------------------------------------------------------------------------------------


对上传的文件进行JS验证

1、选择文件是否为空

2、选择文件是否是excel文件

解决问题一 。  因为我的jsp页面中并没有像完整项目中的common.jsp 。所以需要自己引入jQuery和对应的js文件,这里就涉及到文件相对路径的问题,引入的jQuery和js的src是相对于jsp的文件地址(../返回上一级)

JSP代码

<!-- 引入jQuery -->
<script src="js/jquery/jquery-1.12.3.js"></script>
<!-- 引入JS -->
<script src="js/uploadFile.js"></script>

<button type="button" id="btnUpload" οnclick="checkFile">导入数据 </button>


JS代码

function checkFile() {
	if($('#fileName').val()){
		$('#uploadFile').submit();
	}else{
		alert('请选择文件!'); 
	}	
}

以上解决选择文件为空的问题

解决问题二。在解决这个问题的时候走了一个捷径,并没有使用JS来做判断,而是使用了struts的file标签的accept属性,直接说明只能选择后缀名为.xls 和.xlsx的文件

代码

 <s:file name="uploadExcel" label="文件" id="fileName" accept=".xls,.xlsx"></s:file>












  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 要使用Java实现将Excel数据导入MySQL数据库,可以按照以下步骤进行: 1. 首先需要导入相关的Java库,包括Apache POI用于读取Excel文件中的内容,以及JDBC用于连接和操作MySQL数据库。 2. 使用Apache POI库读取Excel文件。可以使用HSSFWorkbook类来表示整个Excel文件,然后通过HSSFSheet和HSSFRow来遍历每个工作表和每一行。 3. 在读取Excel文件时,可以通过HSSFCell获取每个单元格的值。根据Excel文件的结构和数据需求,可以自定义解析单元格的逻辑。 4. 将读取到的数据存储在Java对象中,可以使用ArrayList或其他数据结构。 5. 建立与MySQL数据库的连接,使用JDBC的相关API。需要提供数据库的URL、用户名和密码等信息。 6. 创建数据库表,在MySQL中执行CREATE TABLE语句。可以使用PreparedStatement预编译SQL语句,确保数据的安全性和可扩展性。 7. 将读取到的数据插入到MySQL数据库中,可以使用INSERT语句。通过PreparedStatement设置参数,将Java对象中的数据传递给SQL语句。 8. 执行INSERT语句,将数据写入MySQL数据库。 9. 关闭资源,包括关闭Excel文件和数据库连接等。 以上就是使用Java实现Excel数据导入MySQL数据库的基本步骤。实际操作中需要考虑异常处理、数据校验和转换等问题,以保证数据的完整性和准确性。同时也可以根据需求进行扩展,例如支持多个工作表、数据更新和删除等操作。 ### 回答2: 要使用Java实现将Excel数据导入MySQL数据库,可以按照以下步骤进行: 1. 使用Java中的Apache POI库读取Excel文件。Apache POI是一个开源库,可以用于读取和写入Microsoft Office文档格式,包括Excel文件。通过POI库,可以获取Excel文件中的每个单元格的数据。 2. 创建一个Java对象来表示MySQL数据库连接。可以使用JDBC驱动程序来连接MySQL数据库。可以通过使用`java.sql`包中的`Connection`、`Statement`和`ResultSet`等类,来建立与数据库的连接和执行SQL语句。 3. 在Java中解析Excel文件的数据,并将其存储在适当的数据结构中。根据Excel文件的结构,可以将数据存储在Java数组、列表或实体类对象中。 4. 根据数据结构中的数据,编写SQL插入语句。可以使用Java中的字符串操作方法,或者使用SQL模板引擎来创建插入语句。 5. 在Java中执行SQL插入语句,将Excel数据插入到MySQL数据库中。可以使用`Statement`对象的`executeUpdate()`方法来执行插入语句。 6. 最后,关闭数据库连接和Excel文件,释放资源。 注意事项: - 在导入数据之前,需要确保MySQL数据库已经正确地设置和配置,并且在Java项目中添加了MySQL驱动。 - 需要处理Excel文件的格式和结构,确保文件中的表格和数据符合预期。 - 可以使用异常处理机制来处理可能发生的错误,并提供适当的错误处理和日志记录。 通过以上步骤,可以实现将Excel数据导入MySQL数据库的功能。使用Java编写代码,可以灵活地处理不同类型的Excel文件和数据库表格,提高数据导入的效率和准确性。 ### 回答3: 要通过Java实现Excel数据导入MySQL数据库,可以按照以下步骤进行: 1. 首先,需要导入相关的Java库,如Apache POI用于解析Excel文件,以及MySQL驱动程序用于连接和操作MySQL数据库。 2. 在Java代码中,使用POI库来读取Excel文件的内容。可以使用Workbook类来加载Excel文件,并通过Sheet和Row类来遍历和读取工作表和行。 3. 在读取Excel数据时,可以根据需要进行数据处理和验证。例如,可以检查数据的有效性、格式是否正确,并将数据存储在Java对象中。 4. 英九读取Excel数据后,可以使用MySQL驱动程序来连接到MySQL数据库。将数据库连接信息提供给Java代码,以建立与数据库的连接。 5. 创建适当的数据库和表以存储Excel数据。可以使用MySQL Workbench或命令行工具来创建和管理数据库和表结构。 6. 使用Java代码将Excel数据插入到MySQL数据库中。可以使用PreparedStatement来执行插入操作,并将从Excel中读取的数据绑定到查询参数中。 7. 在数据插入过程中,可以通过事务管理来确保数据的完整性和一致性。通过使用事务,可以在一次操作中插入所有数据,并在失败时回滚所有操作。 8. 最后,检查和验证数据插入是否成功。可以使用SQL查询来检查插入的数据,并与Excel文件中的数据进行对比。 通过以上步骤,可以实现将Excel数据导入MySQL数据库的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值