文档章节

Excel导入及验证

 挨踢精英
发布于 2014/12/17 11:55
字数 1243
阅读 50
收藏 0
<%@ 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();
 }

© 著作权归作者所有

粉丝 2
博文 32
码字总数 8431
作品 0
株洲
私信 提问
Object-Excel映射的通用解决方案--FastEJ

FastEJ说明 简介 在互联网信息发展的时代,对报表数据的处理需要一个通用化的解决方案。而导入Excel文件到内存、导出内存数据到Excel文件 是一个普遍化的需求。本项目旨在设计一个Object-Ex...

悟达
2016/09/14
731
0
Excel 导入工具--EXCEL-UTIL4J

EXCEL-UTIL4J是一款基于Java POJO思想的excel导入数据库的工具。 工具实现的主要思想是:通过编写POJO将excel表字段和数据库表字段进行关联,以及配置转换和验证注解,工具就会自动将excel数...

Strangeen
2017/09/02
2.3K
0
将excel导入数据库

你好,我看到你在2011-06-20 poi做的Excel导入数据库表工具 程志平 的留言, “ 这种问题 我们在开发过程中也会遇到,也会写一些小工具,譬如excel导入数据库我们采取的是 Excel宏,优点是开...

逐兔郎
2011/10/13
782
5
Spread 表格组件发布 V1.1 版本,支持最新 SSJSON 及 Xamarin.iOS

Spread 表格组件正式发布V1.1版本,新版本中再添新功能。本次新版本中包含两个主要功能和多个增强:对 SpreadJS 最新 JSON 的支持,和对 Xamarin.iOS 应用程序的支持。 新版本的主要更新点有...

葡萄城技术团队
2017/12/20
335
1
Annotation的大材小用

最近在开发一些通用的excel数据导入的功能,由于涉及到导入的模块很多,所以开发了一个比较通用的excel导入模板类文件。并且使用annotation作为验证数据的配置。 package com.hp.dylan.jv; i...

保罗的寓言
2011/06/02
193
0

没有更多内容

加载失败,请刷新页面

加载更多

全球第一时间响应:Rancher发布2.3.1,支持K8S CVE修复版本

北京时间2019年10月17日,Kubernetes发布了新的补丁版本,修复了新近发现的两个安全漏洞:CVE-2019-11253和CVE-2019-16276。Rancher第一时间响应,就在当天紧随其后发布了Rancher v2.3.1和R...

RancherLabs
8分钟前
1
0
EMQ X 规则引擎系列 (八)桥接消息到 MQTT Broker

桥接概念 桥接是一种连接多个 EMQ X 或者其他 MQTT 消息中间件的方式。不同于集群,工作在桥接模式下的节点之间不会复制主题树和路由表。桥接模式所做的是: 按照规则把消息转发至桥接节点;...

EMQX
11分钟前
3
0
《2019年上半年云上企业安全指南》详解安全建设最易忽视的问题!

《2019年上半年云上企业安全指南》是阿里云基于对云安全中心监测到的威胁情报进行分析,形成的一份云上企业安全建设指南。通过对云上企业安全建设现状及多维度威胁情报的分析,得出企业安全建...

开源中国小二
12分钟前
2
0
一天之际在于晨之KMP算法

(我觉得不需要明白原理,应该是在面试或者工作的时候,该想到用什么算法以及之后直接赋值我这里的代码就好了) 下面的情况我们第一时间考虑想到的是用KMP算法。 情况一:// ts字符串是否包...

木九天
15分钟前
1
0
如何通过反射机制创建对象?

// 获取类路径的完全限定名 String classname = "test.Interval"; // 通过类的完全限定名获取类对象 Class pClass = Class.forName(classname); // 通过类对象获取类的构造器对象 Constructo......

happywe
15分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部