<%@ 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;">
<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" />
<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> 器具导入收集表中第[ @line ]行:</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();
}