Excel导入及验证

<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page import="java.util.List,com.atsc.common.GlobalConstant,com.atsc.struts.system.UserProfile"%>
<%@ taglib uri="/WEB-INF/struts-html" prefix="html"%>
<%@ taglib uri="/WEB-INF/struts-bean" prefix="bean"%>
<%@ taglib uri="/WEB-INF/jstl/core" prefix="c"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%
 String path = request.getContextPath();
 String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
 request.setAttribute("basePath", basePath);
%>
<!DOCTYPE html>
<html>
<head>
<base href="<%=basePath%>" target="_self">
<title>导入数据</title>
<link rel="stylesheet" type="text/css" href="${basePath }css/style_yellow.css">
<link rel="stylesheet" type="text/css" href="${basePath }css/jquery-ui.css">
<script type="text/javascript" src="${basePath }js/jquery-1.11.1.min.js"></script>
<script type="text/javascript" src="${basePath }js/htcommon.js"></script>
<script type="text/javascript">
 jQuery(document).ready(
   function() {
    jQuery("#imp_btn").bind(
      "click",
      function() {
       var filename = document.getElementById("uploadFile").value;
       if (filename == "") {
        alert("请选择Excel文件");
        return false;
       }
       var fileExp = filename.substring(filename.lastIndexOf(".") + 1).toLocaleLowerCase();
       if (fileExp != "xlsx" && fileExp != "xls") {
        alert("请选择(.xlsx或.xls)类型的文件");
        return;
       }
       if (!confirm("确认导入?")) {
        return;
       }
       jQuery("#action").val("impExcel");
       jQuery("#mess_div").show();
       jQuery("form").submit();
      });
   });
</script>
</head>
<body style="margin: 0px">
 <div id="mess_div" class="ui-widget-overlay ui-front" style="text-align: center;padding-top:100px;display: none;width:100%">
  <img src="images/loading/loding.gif" style="vertical-align: middle;">&nbsp;&nbsp;
  <strong style="color: black;">正在导入,请稍等...</strong>
 </div>
 <html:form action="mdAcceptSaveOrMerger" enctype="multipart/form-data">
  <html:hidden property="action" styleId="action" />
  <html:hidden property="mainId" styleId="mainId" />
  <br />
  <table class="cond" cellpadding="5px">
   <tbody>
    <tr>
     <td>
      <span><strong>器具主数据收集表</strong></span> 
      <html:file property="uploadFile" styleId="uploadFile"            style="height:22px;width:300px"></html:file>
      <span style="color: red">(文件格式:.xlsx或.xls)</span>
     </td>
    </tr>
   </tbody>
  </table>
  <div style="text-align: center;">
   <input type="button" class="button" value="Excel导入" id="imp_btn" />
   &nbsp;&nbsp;
   <input type="button" class="button" value="关闭" onclick="window.close();" />
  </div>
  <br />
  <html:messages id="alertMess" property="alertMess" message="true">
   <table style="width:100%">
    <tr>
     <td style="vertical-align: top;text-align:right;width:30px;"><img src="images/prompt/f.gif" style="vertical-align: middle;"></td>
     <td>
      <div style="color: red;">${alertMess}</div>
     </td>
    </tr>
   </table>
  </html:messages>
 </html:form>
</body>
</html>

以上是jsp页面

 

 以下是action 中的准备代码

InputStream inputStream = mdAcceptEditForm.getUploadFile().getInputStream();//获取 jsp页面的文件流
   Workbook wb = null;//定义一个工作空间
   //判断是什么版本的Excel
   boolean isExcel2003 = mdAcceptEditForm.getUploadFile().getFileName().matches("^.+\\.(?i)(xls)$");
   if (isExcel2003) {
    POIFSFileSystem fs = new POIFSFileSystem(inputStream);
    wb = new HSSFWorkbook(fs);
   } else {
    wb = new org.apache.poi.xssf.usermodel.XSSFWorkbook(inputStream);
   }
   Sheet sheet = wb.getSheetAt(0);//获取第一sheet页
   StringBuffer c = new StringBuffer();
   String mess = MD_ACCEPT_SERVICE.importData(sheet, currentUser, c,mianId);//导入到数据库及验证的具体方法  以下会有详细解释   同时返回验证的提示信息
   if (StringUtils.isNotBlank(mess)) {
    messages.add("alertMess", new ActionMessage(mess, false));
    this.addMessages(request, messages);
   } else {
    //设置返回到页面的js提示信息
    response.setCharacterEncoding("utf-8");
    response.getWriter().write("<script>alert('导入器具数据收集表成功');window.close();</script>");
    response.flushBuffer();
    return null;
   }

 importData的具体

public String importData(Sheet sheet, UserProfile currentUser, StringBuffer c,String mainId) throws Exception {
  String mess = "";//定义消息
  Connection conn = null;
  try {
   conn = getConnection();
   conn.setAutoCommit(false);
   int rows = sheet.getLastRowNum();//获取行数
   List propList = new ArrayList();//定义list数组 封装excel数据对象
   /**
    * 检测表头
    */
   Row titleRow = sheet.getRow(0);
   if (titleRow == null) {
    conn.rollback();
    return "没有标题行!,第1行应为列标题行";
   }
   //定义一个实体类分别为两个字段  PropName保存excel表头信息  FieldName保存数据库字段信息
   EquipPropDTO qjbh = new EquipPropDTO();
   qjbh.setPropName("器具名称");
   qjbh.setFieldName("MD_NAME");
   propList.add(qjbh); 
   ;;;;;;;;
   Map propNameMap = new HashMap(); //定义map来封装 以上信息 EquipPropDTO 的信息
   for (int i = 0; i < propList.size(); i++) {
    EquipPropDTO dto = (EquipPropDTO) propList.get(i);
    propNameMap.put(dto.getPropName(), dto);
   }
   //定义消息主信息
   String messTip = "<strong>&nbsp;器具导入收集表中第[&nbsp;@line&nbsp;]行:</strong><br/>";
   
   /**
    * 封装数据
    */
   int line = 0;
   List<Map<String, Object>> importList = new ArrayList<Map<String, Object>>();
   //循环获取每一行的数据
   for (int r = 1; r <= rows; r++) {
    line = r + 1;
    //得到第一行的数据
    Row row = sheet.getRow(r);
    //创建读取数据的方式   excelReadRow这个方法以下会有详细说明
    Map mdMap = this.excelReadRow(row, titleRow, propNameMap);
    //对字段名称进行验证  这里的验证可以有多样 在此只列出其中一种
    if (StringUtils.isBlank(ObjectUtils.toString(mdMap.get("MD_NAME")))) {
     mess += "【器具名称】不能为空。";
     break;
    }
    //把获取到的数据封装到list<map>对象中
    importList.add(mdMap);
   }
   //如果以上验证消息不为空 则证明有错误信息  结束方法 返回提示信息
   if (StringUtils.isNotBlank(mess)) {
    conn.rollback();
    return messTip.replaceFirst("@line", String.valueOf(line)) + mess;
   }
   //此处是本人保存excel中信息的方法 importList中有多少个对象  就说明excel中有多少条数据
   for(int i=0;i<importList.size();i++){
    MD_ACCEPT_DAO.saveItem(conn,importList.get(i),mainId,main);
   }
   conn.commit();
   conn.setAutoCommit(true);
  } catch (SQLException e) {
   conn.rollback();
   mess = "导入报表格式错误,请检查。";
   throw e;
  } finally {
   close(conn);
  }
  return mess;
 }

 

以下是对excelReadRow方法的详细介绍

 
 /** 
  * 读取excel数据
  * @param row
  * @param rowTitle
  * @param propNameMap
  * @return
  */
 public Map<String, Object> excelReadRow(Row row, Row rowTitle, Map<String, EquipPropDTO> propNameMap) {
  Map<String, Object> mdMap = new HashMap<String, Object>();
  int dataCols = rowTitle.getLastCellNum();//获取每一行有多少个格子
  for (int i = 0; i < dataCols; i++) {
//把获取到的数据  rowTitle.getCell(i)是得到表头名称  getCellStringValue是获取对应表头设置的数据格式封装到EquipPropDTO 对象中
   EquipPropDTO prop = (EquipPropDTO) propNameMap.get(ExcelUtil.getCellStringValue(rowTitle.getCell(i)));
   if (prop != null) {
      //获取格子中的数据
    Object v = ExcelUtil.getCellStringValue(row.getCell(i));
    /*if (prop.getFieldName().contains("DATE")) {
     v = v.toString().replace("-", "");
    }*/
//报数据存到map 
    mdMap.put(prop.getFieldName(), v);
   }
  }
  return mdMap;
 }


//以下是对getCellStringValue的详细解释

/**
  * 获取Excel表格内容
  * 
  * @param cell
  * @return
  */
 public static String getCellStringValue(Cell cell) {
  if (cell == null)
   return "";
  String value = "";
  double numericValue = 0;
  switch (cell.getCellType()) {
  case HSSFCell.CELL_TYPE_NUMERIC:
   if (HSSFDateUtil.isCellDateFormatted(cell)) {
    // 如果是Date类型则 ,获取该Cell的Date值
    value = HSSFDateUtil.getJavaDate(cell.getNumericCellValue()).toString();
   }
   numericValue = cell.getNumericCellValue();
   if (numericValue - (int) numericValue == 0)
    value = String.valueOf((int) numericValue);
   else {
    // value = String.valueOf(numericValue);
    BigDecimal bd = new BigDecimal(String.valueOf(cell.getNumericCellValue()));
    bd.setScale(2, BigDecimal.ROUND_HALF_UP);
    value = bd.toString();
   }
   break;
  case HSSFCell.CELL_TYPE_FORMULA:
   try {
    value = cell.getStringCellValue();
   } catch (Exception e1) {
    try {
     value = String.valueOf(cell.getNumericCellValue());
    } catch (Exception e2) {
     value = "error";
    }
   }
   break;
  case HSSFCell.CELL_TYPE_STRING:
   value = cell.getStringCellValue().trim();
   break;
  case HSSFCell.CELL_TYPE_BLANK:
   value = "";
   break;
  }
  return value.trim();
 }

转载于:https://my.oschina.net/u/2291124/blog/357002

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值