Java Import File (导入Excel文件)

<h2>导入Excel文件</h2>
<h4>使用的是org.apache.poi.ss.usermodel中的工作薄对象进行解析</h4>
<h4>步骤:1.获取页面传来的文件存入项目中;2.设置标题并检验导入文件的标题;3.检验导入文件中的数据;4.导入数据库</h4>
<textarea style="width:1100px;height:400px;" disabled="disabled">
@RequestMapping(value = "importFile", method = RequestMethod.POST)
@SuppressWarnings("all")
public String importFile(@RequestParam(value = "fileUpload", required = false) MultipartFile file,
HttpServletRequest request, HttpServletResponse response,
MultipartHttpServletRequest mRequest){
String message="";
//获取项目根目录下的uploadExcel文件夹的路径
String savePath = request.getSession().getServletContext()
.getRealPath("uploadExcel");
//获取系统当前日期,此处DateUtils是自己写的工具类,使用时也可以直接new Date()然后格式化日期
String tempTime = DateUtils.now();
//创建日期型随机文件名
String fileName = tempTime.substring(0, 4) + tempTime.substring(5, 7)
+ tempTime.substring(8, 10) + tempTime.substring(11, 13)
+ tempTime.substring(14, 16) + tempTime.substring(17, 19)
+ file.getOriginalFilename();
File newFile = new File(savePath+"\\"+fileName);
System.out.println("savePath:"+savePath);
System.out.println("fileName:"+fileName);
System.out.println("path:"+newFile.getAbsolutePath());
try {
Files.createParentDirs(newFile);
Files.write(file.getBytes(), newFile);
org.springframework.web.util.WebUtils.setSessionAttribute(request, "path", newFile.getAbsolutePath());
String[] titles = {"编号","姓名","年龄","地址","联系方式"};
ExternalImport importMsg = getList(titles,newFile.getAbsolutePath());//获取导入的表单中数据(此时还只是初步操作,数据未经过严密检验)
if(ObjectUtils.isNotEmpty(importMsg.getImportMsg())){//错误信息不为空,说明刚获取的数据集中有些数据不合格
System.out.println(importMsg.getImportMsg());
message=importMsg.getImportMsg();
}
ExternalImport checkMsg = checkData(importMsg.getList());//经过检查已经可以保存的数据
List<Object[]> succList = checkMsg.getList();//将要保存到数据库中的数据
System.out.println("成功导入"+succList.size()+"条数据");
if(ObjectUtils.isNotEmpty(checkMsg.getImportMsg())){
System.out.println("数据错误信息:"+checkMsg.getImportMsg());
}
message = "成功导入"+succList.size()+"条数据,数据错误信息:\n"+checkMsg.getImportMsg();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
request.setAttribute("message", message);
return "/modules/externals/waijie_add.jsp";
}
<textarea>
<h4>Method:检查标题</h4>
<textarea style="width:1100px;height:400px;" disabled="disabled">
public String checkTitle(Row row,String[] titles){
StringBuffer msg = new StringBuffer();
msg.append("无法导入文件,原因如下:\n");
boolean result = true;
for (int i = 0; i < titles.length; i++) {//循环每一行的单元格(真正的业务处理时,应该是根据表头最后一列所在的单元格索引来循环)
Cell cell = row.getCell(i);//获取每一个单元格对象
//获取单元格的值
String value = getCellValue(cell);
if(!value.equals(titles[i])){
msg.append("标题\""+titles[i]+"\"已被改动\n");
result=false;
}
}
if(result){
return null;
}
return msg.toString();
}
</textarea>
<h4>Method:获取数据(此数据是还没经过严密检查的数据)</h4>
<textarea style="width:1100px;height:400px;" disabled="disabled">
@SuppressWarnings("all")
public ExternalImport getList(String[] titles,String filePath)throws Exception{
ExternalImport importMsg = new ExternalImport();//用来存储导入时的错误信息与数据
List<Object[]> list = new ArrayList<Object[]>();
org.apache.poi.ss.usermodel.Workbook wb = WorkbookFactory.create(new File(filePath));//根据获取文件解析对象
org.apache.poi.ss.usermodel.Sheet sheet = wb.getSheetAt(0);//创建表格实例
int allRowNum = sheet.getLastRowNum()+1;//获取表格行数,起始索引为0
String titleMsg = checkTitle(sheet.getRow(sheet.getFirstRowNum()), titles);//检查表头
if(ObjectUtils.isNotEmpty(titleMsg)){
importMsg.setImportMsg(titleMsg);
return importMsg;
}
if(allRowNum<2){//只有标题一行,没有数据
importMsg.setImportMsg("导入失败,没有可以导入的数据");
return importMsg;
}
if(allRowNum>21){//要导入的数据加上标题超过21条
for (int i = 21; i <= allRowNum; i++) {
Row row = sheet.getRow(i);
if(row==null){
continue;
}else{
int count=0;
for(int cellNum=0;cellNum<row.getLastCellNum();++cellNum){
Cell cell = row.getCell((short)cellNum);
Object obj = getCellValue(cell).trim();
if(ObjectUtils.isEmpty(obj)){
count++;
continue;
}
}
if(count>0){
importMsg.setImportMsg("导入失败,导入的数据不能超过20条");
return importMsg;
}else{
allRowNum=21;
}
}
}
}
for (int rowNum=1; rowNum<allRowNum;rowNum++) {
Row row = sheet.getRow(rowNum);
list.add(getRowValue(row, titles.length));
}
importMsg.setList(list);
return importMsg;
}
</textarea>
<h4>Method:获取Excel文件单元格的值</h4>
<textarea style="width:1100px;height:400px;" disabled="disabled">
public String getCellValue(Cell cell){
String cellValue="";
DataFormatter formatter = new DataFormatter();
if(cell != null){
switch (cell.getCellType()) {
case Cell.CELL_TYPE_NUMERIC://如果单元格的值是纯数字
if(DateUtil.isCellDateFormatted(cell)){//如果单元格格式是日期格式
cellValue = formatter.formatCellValue(cell);
}else{
double value = cell.getNumericCellValue();//从单元格中取出的数值都是double型的
int intValue = (int)value;
//判断数值到底是整型还是小数型
cellValue = value-intValue==0?String.valueOf(intValue):String.valueOf(value);
}
break;
case Cell.CELL_TYPE_STRING://如果单元格的值是字符型
cellValue = cell.getStringCellValue();
break;
case Cell.CELL_TYPE_BOOLEAN://如果单元格的值是真假型
cellValue = String.valueOf(cell.getBooleanCellValue());
break;
case Cell.CELL_TYPE_FORMULA:{//如果单元格的值是公式型
try {
cellValue = String.valueOf(cell.getNumericCellValue());  
} catch (IllegalStateException  e) {
cellValue = String.valueOf(cell.getRichStringCellValue());  
}
}
break;
case Cell.CELL_TYPE_BLANK://如果单元格的值为空
cellValue = "";
break;
case Cell.CELL_TYPE_ERROR://如果单元格的值错误
cellValue = "";
break;
default:
cellValue = cell.toString().trim(); 
break;
}
}
return cellValue.trim();
}
</textarea>
<h4>Method:获取每一行中所有单元格的值,创建为数组</h4>
<textarea style="width:1100px;height:200px;" disabled="disabled">
public Object[] getRowValue(Row row,int length){
Object[] objects = new Object[length];
for (int i = 0; i < length; i++) {
if(row!=null){
Cell cell = row.getCell(i);
//获取单元格的值
String str = getCellValue(cell);
objects[i]=str;
}else{
objects[i]="";
}
}
return objects;
}
</textarea>
<h4>Method:根据项目需求严密检查要导入的数据</h4>
<textarea style="width:1100px;height:400px;" disabled="disabled">
public ExternalImport checkData(List<Object[]> objlist){
ExternalImport importMsg = new ExternalImport();
List<String> errorList = new ArrayList<String>();
List<Object[]> succList = new ArrayList<Object[]>();
//int checkCount=0;//检查过的数据数量
int row=2;//第二行
String reg ="((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}";//用来判断手机号的表达式
List<String> list = new ArrayList<String>();//模版编号数据数组,用来判断编号有没有重复的
for (Object[] objects : objlist) {//循环行数
boolean checkResult=true;//每行中的列值检查出来的结果
for (int index = 0; index < objects.length; index++) {//循环每行列数
String value = objects[index].toString().trim();
if(index==0){
boolean flag = true;
for(String str:list){
if(value.equals(str)){//初始时为空,不会有相同值
errorList.add("第"+row+"行第"+(index+1)+"列编号在模版中出现重复");
flag=false;
checkResult=false;
break;
}
}
if(flag){//为true,说明集合中没有相同值,其实就是说这条数据是第一次出现,将其添加到集合中
list.add(value);
}
}
if(index==1){
/**
* 根据个人项目需求判断,此处测试此字段不需判断
*/
}
if(index==2){
/**
* 根据个人项目需求判断,此处测试此字段不需判断
*/
}
if(index==3){
if(!value.matches(reg)){//false
errorList.add("第"+row+"行第"+(index+1)+"列手机号码格式不正确\n");
checkResult=false;
}
}
}
if(checkResult){//true,说明此行中的每列数据都为正常,将其保存到正常数据集合中
succList.add(objects);
}
row++;//进入下一行数据循环
}
if(ObjectUtils.isNotEmpty(errorList) && errorList.size()>0){
StringBuffer errorMsg = new StringBuffer();
for (String msg : errorList) {
errorMsg.append(msg+"\n");
}
importMsg.setImportMsg(errorMsg.toString());
}
importMsg.setList(succList);
return importMsg;
}
</textarea>
<h4>页面调用</h4>
<textarea style="width:1100px;height:400px;" disabled="disabled">
<script>
function loadSize(){
var message = '${message}';
alert(message);
}

function importFile(){
var filename = $("#fileUploadId").val();
if(filename == null || filename == "" || typeof(filename) == "undefined")
{
showDiv("请先选择需要上传文件");
return ;
}else{
var filenameIndex = filename.substring(filename.lastIndexOf("."));
if(filenameIndex !=null )
{
if(filenameIndex != ".xls" && filenameIndex != ".xlsx"){
showDiv("请先选择正确文件格式的文件");
return;
}
}else{
showDiv("文件格式错误");
return;
}
}
var url = "${pageContext.request.contextPath}/external/importFile";


$("#tipmsg").css('display','block');
$("#uploadBtn").css("disabled",true);
$("#UploadId").attr("action",url);
$("#UploadId").submit();
}
</script>
<body οnlοad="loadSize();">
<form id="UploadId" name="UploadName" action=""  method="post" enctype="multipart/form-data" >
<table width="100%">
<tr>
<td  width="400px">上传文件:<input type="file" id="fileUploadId" name="fileUpload" style="width:350px"></td>
</tr>
<tr>
<td colspan="2" align="center" >
<input id="uploadBtn" type="button" οnclick="importFile()" value="  上 传  " />
</td>
</tr>
</table>
<ul>
<li><b>说明:</b></li>
<li>1、文件后缀名为.xls或.xlsx</li>
<li>2、Excel文件导入最多不能超过5万条</li>
<li>3、务必严格按照模板规格进行信息 录入</li>
<li>4、CVE编码不能重复</li>
</ul>
</form>
<div id="tipmsg">
<span><img alt="" src="<%=request.getContextPath() %>/static/image/loading.gif"> </span>
<span class="ps"> 数据正在上传,请稍候....</span>
</div>
</body>
</textarea>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

crazy_monky

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值