首先是效果图
excel表格内容
页面
数据库
jsp代码
<form name="admissionForm" id="admissionForm" action="<%=request.getContextPath()%>/otheradmission/importAdmissionExcel.htm" enctype="multipart/form-data" method="post" >
<table width="100%" border="0" cellpadding="0" cellspacing="0" class="table">
<tr class="tr_st">
<td height="22" align="right" class="tdNormal">上传Excel:</td>
<td height="22" class="tdNormal">
<input type="file" name="zipFile" id="zipFile" size="50px"/>
</td>
</tr>
<%--<tr class="tr_st">
<td height="22" align="right" class="tdNormal">上传校验文件:</td>
<td height="22" class="tdNormal">
<input type="file" name="txtFile" id="txtFile" size="50px"/>
</td>
</tr>--%>
</table>
<table width="99%" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td align="center">
<br/>
<input type="submit" name="Submit" class="form-buttun" value="上 传">
</td>
</tr>
<tr>
<td align="center">
<br/>
1、上传Excel文件必须有 证件号码、考生姓名、报名地市(ZJHM, KSXM, BMDS),并且列名顺序前面排序<br/>
2、文件后缀必须为.xls
</td>
</tr>
</table>
</form>
控制层代码
@RequestMapping("/importAdmissionExcel")
public String importAdmissionExcel(ModelMap map, HttpServletRequest request, MultipartHttpServletRequest requestf) throws SQLException {
MultipartFile zipFile = requestf.getFile("zipFile");
String rets = "";
if(zipFile==null){
rets+=",请上传准考证库.xls文件";
}else{
if(!zipFile.getOriginalFilename().toLowerCase().endsWith(".xls")){
rets+=",上传准考证文件只能是.xls格式文件";
}
}
if(!rets.equals("")){
map.put("msg", rets.substring(1));
return "library/otheradmission/importExcel";
}
Connection conn = null;
PreparedStatement pstmt = null;
try {
String level = userDetails.getLevelid();
/*if (!"2".equals(level)) {
map.put("msg", "该功能只能由省级用户导入!");
return "library/otheradmission/import";
}*/
Long startTime = System.currentTimeMillis();
String examId = (String) request.getSession().getAttribute("currentExamId");
String depcode = userDetails.getDepcode().trim();
String zipFileName = "" + zipFile.getName() + ".xls";
String targetDirectory = StaticConstants.getAdmissionPicPath(examId, depcode);
if (!new File(targetDirectory).exists()) {
new File(targetDirectory).mkdirs();
}
File ziptarget = new File(targetDirectory, zipFileName);
FileUtils.copyInputStreamToFile(zipFile.getInputStream(), ziptarget);
String tableNameDataAdmission2 = "EXAM_" + examId + "_ADMISSION_DATA";
//System.out.println(tableNameDataAdmission2);
if (this.commonJdbcdao.isExistTable(tableNameDataAdmission2)) { //判断准考证数据是否已经导入
//Boolean issuper = userDetails.getSuperuser();
String uuname = userDetails.getUsername();
String depcodeg = userDetails.getDepcode();
}
//创建新的考生准考证表
String tableNameDataAdmission = "EXAM_" + examId + "_ADMISSION_DATA";
if (!this.admissionService.isExistTable(tableNameDataAdmission)) {
StringBuilder sb = new StringBuilder("CREATE TABLE " + tableNameDataAdmission + " (");
sb.append(" `ZJBH` varchar(64) NOT NULL DEFAULT '', ");
sb.append(" `KMDM` varchar(32) NOT NULL DEFAULT '',");
sb.append(" `ZKZH` varchar(96) DEFAULT NULL,");
sb.append(" `SS` varchar(32) DEFAULT NULL,");
sb.append(" `KQ` varchar(32) DEFAULT NULL, ");
sb.append(" `KDH` varchar(32) DEFAULT NULL,");
sb.append(" `KCH` varchar(16) DEFAULT NULL,");
sb.append(" `ZWH` varchar(16) DEFAULT NULL,");
sb.append(" `SIGNUPID` varchar(144) DEFAULT NULL,");
sb.append(" `ZKZDY` decimal(10,0) DEFAULT '0',");
sb.append(" `ZKZDY_DATE` varchar(20) DEFAULT NULL,");
sb.append(" PRIMARY KEY (`ZJBH`,`KMDM`),");
sb.append(" KEY `IN_EXAM_" + examId + "_ADMISSION_DATA` (`ZJBH`)");
sb.append(") ENGINE=InnoDB DEFAULT CHARSET=utf8");
//创建表
if (this.admissionService.isExistTable(tableNameDataAdmission.toUpperCase()) == false) {
this.commonJdbcdao.getJdbcTemplate().update(sb.toString());
}
}
//创建新的考生准考证表
String _dep_admis = "EXAM_" + examId + "_dep_admis";
if (!this.admissionService.isExistTable(_dep_admis)) {
StringBuilder sb = new StringBuilder("CREATE TABLE " + _dep_admis + " (");
sb.append(" `DEPCODE` varchar(20) NOT NULL COMMENT 'add field length for encrpty',");
sb.append(" `LEVELID` varchar(20) NOT NULL DEFAULT '',");
sb.append(" `TITLE` varchar(120) DEFAULT NULL,");
sb.append(" `PARENTCODE` varchar(20) DEFAULT NULL,");
sb.append(" `INCHARGE` varchar(36) DEFAULT NULL,");
sb.append(" `PHONE1` varchar(20) DEFAULT NULL,");
sb.append(" `PHONE2` varchar(20) DEFAULT NULL,");
sb.append(" `PHONE3` varchar(20) DEFAULT NULL,");
sb.append(" `ADDRESS` varchar(200) DEFAULT NULL,");
sb.append(" `ZIP` varchar(32) DEFAULT NULL,");
sb.append(" `EMAIL` varchar(64) DEFAULT NULL,");
sb.append(" `PXM` varchar(2) DEFAULT NULL,");
sb.append(" `KCBZ` varchar(5) DEFAULT NULL,");
sb.append(" `KSFZR` varchar(10) DEFAULT NULL,");
sb.append(" `LXFS` varchar(20) DEFAULT NULL,");
sb.append(" `XH` varchar(2) DEFAULT NULL,");
sb.append(" `SFKDCS` varchar(2) DEFAULT NULL,");
sb.append(" `CPKD` varchar(2) DEFAULT NULL,");
sb.append(" PRIMARY KEY (`DEPCODE`,`LEVELID`)");
sb.append(" ) ENGINE=InnoDB DEFAULT CHARSET=utf8");
//创建表
if (this.admissionService.isExistTable(_dep_admis.toUpperCase()) == false) {
this.commonJdbcdao.getJdbcTemplate().update(sb.toString());
}
}
String sql_count = "SELECT count(*) FROM exam_" + examId + "_department WHERE parentcode = '144' ";
Integer drcount = this.commonJdbcdao.getJdbcTemplate().queryForInt(sql_count);
if (drcount == 0){
String sql = "INSERT INTO exam_"+examId+"_department (DEPCODE,LEVELID,TITLE,PARENTCODE) " +
"SELECT DEPCODE,LEVELID,TITLE,PARENTCODE FROM public_department WHERE parentcode = '144' ";
this.commonJdbcdao.getJdbcTemplate().update(sql);
}
String zkz_count = "SELECT COUNT(*) FROM tp_global_exam_zkz WHERE examid = '" + examId + "' ";
Integer zkzcount = this.commonJdbcdao.getJdbcTemplate().queryForInt(zkz_count);
if (zkzcount == 0){
String sql = "INSERT INTO tp_global_exam_zkz (examid,CODE,begindate,fulltitle) " +
"VALUES ('"+examId+"','"+examId+"','"+DateUtil.getCurrentDate().replace("-","").substring(0,6)+"','"+examId+"') ";
this.commonJdbcdao.getJdbcTemplate().update(sql);
}
/*
* ------------------------------------------关联表相关操作-----------------------------------------------
*/
// this.commonJdbcdao.getJdbcTemplate().update("drop table Exam_" + examId + "_ADM_CHANGE");
if (!this.admissionService.isExistTable("Exam_" + examId + "_ADM_CHANGE")) {
threeCommonService.createLinkTable("Exam_" + examId + "_ADM_CHANGE", "Exam_" + examId + "_ADM_CHANGE_PHOTO", "Exam_" + examId + "_ADM_CHANGE_SUBS", examId);
}
this.commonJdbcdao.getJdbcTemplate().update("TRUNCATE table Exam_" + examId + "_ADM_CHANGE");
Map zkzStatuesMap = this.queryZkzStatus(examId, userDetails.getDepcode());
if(zkzStatuesMap != null && !zkzStatuesMap.isEmpty() ){
String zkzStatus = (String)zkzStatuesMap.get("ZKZSTATUS");
if(zkzStatus != null && zkzStatus.equals("1")){
map.put("msg", "准考证信息正在导入还未完成,请稍后查看结果!");
return "library/otheradmission/importExcel";
}
}
//System.out.println("开始上传:" + DateUtil.getCurrentDateTime());
String yszipFile = zipFile.getOriginalFilename();
String[] yzxx = yszipFile.split("_");
long templateId = this.admissionService.queryTemplateId(Long.valueOf(examId));
List templateList = this.commonService.findExamByExamId(templateId); //根据数据包文件名进行校验
// Statement stmt = null;
DESPlus des = new DESPlus(0);
des.setNotEncryptSwitch(false);
ReadDBF read = new ReadDBF();
ReadWriteFile readexcel = new ReadWriteFile();//excel读取方法
String changeColName = " ZJHM, KSXM, BMDS,ZJBH, ZJLB, SS, SIGNUPID";
String dbfColName = changeColName;
int readcount = read.getReadcount();
String insertChangeStr = "";
insertChangeStr = "INSERT INTO " + " Exam_" + examId + "_ADM_CHANGE " + " (ZJHM, KSXM, BMDS,ZJBH, ZJLB, SS, SIGNUPID) VALUES(";
for (int i = 0; i < changeColName.split(",").length; i++) {
insertChangeStr += "?,";
}
insertChangeStr = insertChangeStr.substring(0, insertChangeStr.length() - 1);
insertChangeStr += " )";
conn = this.commonJdbcdao.getJdbcTemplate().getDataSource().getConnection();
conn.setAutoCommit(false);
pstmt = conn.prepareStatement(insertChangeStr);
Workbook workbook =readexcel.getWorkbook(targetDirectory+"/"+zipFileName);//读取excel
int zhs = 0;
for (int numSheet = 0; numSheet < workbook.getNumberOfSheets(); numSheet++) {
Sheet sheet = workbook.getSheetAt(numSheet);
if (sheet == null) {
continue;
}
int firstRowIndex = sheet.getFirstRowNum();
int lastRowIndex = sheet.getLastRowNum();
// 读取首行 即,表头
String rw = "";
Row firstRow = sheet.getRow(firstRowIndex);
if (firstRow == null) {
continue;
}
Cell cell = firstRow.getCell(0);
rw = readexcel.getCellValue(cell, true);
Long batchCount = 1L;
int ksxmsz=99;
int zjhmsz=99;
int bmdssz=99;
for(int bt=0;bt<3;bt++){
if("KSXM".equals(readexcel.getCellValue(firstRow.getCell(bt), true))){
ksxmsz=bt;
}
if("ZJHM".equals(readexcel.getCellValue(firstRow.getCell(bt), true))){
zjhmsz=bt;
}
if("BMDS".equals(readexcel.getCellValue(firstRow.getCell(bt), true))){
bmdssz=bt;
}
}
System.out.println("KSXM="+ksxmsz+"ZJHM="+zjhmsz+"BMDS="+bmdssz);
if (ksxmsz==99||zjhmsz==99||bmdssz==99){
map.put("msg", "导入准考证信息异常!");
}
for (int rowIndex = firstRowIndex + 1; rowIndex <= lastRowIndex; rowIndex++) {
batchCount++;
Row currentRow = sheet.getRow(rowIndex);// 当前行
// String ksxm = readexcel.getCellValue(currentRow.getCell(3), true);
// String mzjhm = readexcel.getCellValue(currentRow.getCell(2), true);
// String zjhm = des.encrypt_r(mzjhm.toUpperCase());
zhs += 1;
System.out.println("Excel数据文件读取完成:" + DateUtil.getCurrentDateTime() + ",used:" + (System.currentTimeMillis() - startTime) / 1000 + "s");
// stmt = conn.createStatement();
Long signupid = 0L;
System.out.println("开始将关联表数据同步到数据库:" + DateUtil.getCurrentDateTime());
startTime = System.currentTimeMillis();
System.out.println("开始插入临时表:" + DateUtil.getCurrentDateTime());
if (batchCount % 3000 == 0) {
pstmt.executeBatch();
// stmt.executeBatch();
conn.commit();
pstmt.clearBatch();
System.out.println("关联表提交数据量:" + batchCount + " " + DateUtil.getCurrentDateTime());
}
Map<String, String> map1 = new HashMap<>();
map1.put("广州", "14401");
map1.put("深圳", "14402");
map1.put("珠海", "14403");
map1.put("汕头", "14404");
map1.put("韶关", "14405");
map1.put("河源", "14406");
map1.put("梅州", "14407");
map1.put("惠州", "14408");
map1.put("汕尾", "14409");
map1.put("东莞", "14410");
map1.put("中山", "14411");
map1.put("江门", "14412");
map1.put("佛山", "14413");
map1.put("阳江", "14414");
map1.put("湛江", "14415");
map1.put("茂名", "14416");
map1.put("肇庆", "14417");
map1.put("清远", "14418");
map1.put("潮州", "14419");
map1.put("揭阳", "14420");
map1.put("云浮", "14421");
map1.put("省直", "14499");
pstmt.setString(1, currentRow.getCell(zjhmsz) != null ? des.encrypt(readexcel.getCellValue(currentRow.getCell(zjhmsz), true).trim()) : "");
pstmt.setString(2, currentRow.getCell(ksxmsz) != null ? des.encrypt(readexcel.getCellValue(currentRow.getCell(ksxmsz), true).trim()) : "");
String bmds1=readexcel.getCellValue(currentRow.getCell(bmdssz), true);
if (readexcel.getCellValue(currentRow.getCell(bmdssz), true).contains("广州")){
pstmt.setString(3, map1.get("广州"));
}else if(readexcel.getCellValue(currentRow.getCell(bmdssz), true).contains("深圳")){
pstmt.setString(3, map1.get("深圳"));
}else if(readexcel.getCellValue(currentRow.getCell(bmdssz), true).contains("珠海")){
pstmt.setString(3, map1.get("珠海"));
}else if(readexcel.getCellValue(currentRow.getCell(bmdssz), true).contains("珠海")){
pstmt.setString(3, map1.get("珠海"));
}else if(readexcel.getCellValue(currentRow.getCell(bmdssz), true).contains("汕头")){
pstmt.setString(3, map1.get("汕头"));
}else if(readexcel.getCellValue(currentRow.getCell(bmdssz), true).contains("韶关")){
pstmt.setString(3, map1.get("韶关"));
}else if(readexcel.getCellValue(currentRow.getCell(bmdssz), true).contains("河源")){
pstmt.setString(3, map1.get("河源"));
}else if(readexcel.getCellValue(currentRow.getCell(bmdssz), true).contains("梅州")){
pstmt.setString(3, map1.get("梅州"));
}else if(readexcel.getCellValue(currentRow.getCell(bmdssz), true).contains("惠州")){
pstmt.setString(3, map1.get("惠州"));
}else if(readexcel.getCellValue(currentRow.getCell(bmdssz), true).contains("汕尾")){
pstmt.setString(3, map1.get("汕尾"));
}else if(readexcel.getCellValue(currentRow.getCell(bmdssz), true).contains("东莞")){
pstmt.setString(3, map1.get("东莞"));
}else if(readexcel.getCellValue(currentRow.getCell(bmdssz), true).contains("中山")){
pstmt.setString(3, map1.get("中山"));
}else if(readexcel.getCellValue(currentRow.getCell(bmdssz), true).contains("江门")){
pstmt.setString(3, map1.get("江门"));
}else if(readexcel.getCellValue(currentRow.getCell(bmdssz), true).contains("佛山")){
pstmt.setString(3, map1.get("佛山"));
}else if(readexcel.getCellValue(currentRow.getCell(bmdssz), true).contains("阳江")){
pstmt.setString(3, map1.get("阳江"));
}else if(readexcel.getCellValue(currentRow.getCell(bmdssz), true).contains("湛江")){
pstmt.setString(3, map1.get("湛江"));
}else if(readexcel.getCellValue(currentRow.getCell(bmdssz), true).contains("茂名")){
pstmt.setString(3, map1.get("茂名"));
}else if(readexcel.getCellValue(currentRow.getCell(bmdssz), true).contains("肇庆")){
pstmt.setString(3, map1.get("肇庆"));
}else if(readexcel.getCellValue(currentRow.getCell(bmdssz), true).contains("清远")){
pstmt.setString(3, map1.get("清远"));
}else if(readexcel.getCellValue(currentRow.getCell(bmdssz), true).contains("潮州")){
pstmt.setString(3, map1.get("潮州"));
}else if(readexcel.getCellValue(currentRow.getCell(bmdssz), true).contains("揭阳")){
pstmt.setString(3, map1.get("揭阳"));
}else if(readexcel.getCellValue(currentRow.getCell(bmdssz), true).contains("云浮")){
pstmt.setString(3, map1.get("云浮"));
}else if(readexcel.getCellValue(currentRow.getCell(bmdssz), true).contains("省直")){
pstmt.setString(3, map1.get("省直"));
}
pstmt.setString(4, String.valueOf(rowIndex));
pstmt.setString(5,"1");
pstmt.setString(6,"144");
pstmt.setString(7, String.valueOf(rowIndex));
// int m = 1;
// for (int o = 0; o < 7; o++) {
// if (o == 0 || o == 1) {
// pstmt.setString(m++, currentRow.getCell(o) != null ? des.encrypt(readexcel.getCellValue(currentRow.getCell(o), true).trim()) : "");
// System.out.println(readexcel.getCellValue(currentRow.getCell(o), true));
// }else if(o == 5 ){
// pstmt.setString(m++,"144");
// }else if(o == 4 ){
// pstmt.setString(m++,"1");
// }else if(o == 3 || o == 6){
// pstmt.setString(m++, String.valueOf(rowIndex));
// } else if(o == 2){
// String bmds1=readexcel.getCellValue(currentRow.getCell(o), true);
// System.out.println("bmds="+bmds1);
// pstmt.setString(m++,map1.get(bmds1));
// }
// }
pstmt.addBatch();
}
pstmt.executeBatch();
conn.commit();
pstmt.clearBatch();
conn.close();
}
String resultStr = " 考场excel数据文件共" + zhs + "条记录,"
+ "插入" + zhs + "条";
map.put("msg", resultStr);
System.out.println("end----"+resultStr);
} catch (Exception e) {
pstmt.clearBatch();
pstmt.close();
conn.rollback();
conn.close();
map.put("msg", "导入准考证信息异常!");
// this.updateZkzStatus(examid, userDetails.getDepcode(), "3");//异常状态
e.printStackTrace();
logService.addLog(((Security) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getUsername(), 1, "导入准考证失败", IpAddr.getIpAddr(ServletActionContext.getRequest()), examid);
return "library/otheradmission/importExcel";
}
return "library/otheradmission/importExcel";
}
以上代码是读取excel内容,创建数据库表,并将内容按照要求进行转换,并插入
下面是读取excel文件操作
public class ReadWriteFile {
//指定文件路径和名称
private String filePath;
private static final String EXTENSION_XLS = "xls";
private static final String EXTENSION_XLSX = "xlsx";
public String getFilePath() {
return filePath;
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
public void creatTxtFile() throws IOException {
File filename = new File(this.getFilePath());
if (!filename.exists()) {
filename.createNewFile();
}
}
public String readTxtFile() {
String readStr = "";
try {
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(this.getFilePath()), "UTF-8"));
String s = "";
while ((s = in.readLine()) != null) {
readStr += s + "\n";
}
in.close();
} catch (Exception ex) {
Logger.getLogger(ReadWriteFile.class.getName()).log(Level.SEVERE, null, ex);
}
return readStr;
}
public void writeTxtFile(String newStr) throws IOException {
this.creatTxtFile();
try {
BufferedWriter osw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(this.getFilePath(), false), "UTF-8"));
osw.write(newStr);
osw.flush();
osw.close();
} catch (Exception ex) {
//ex.printStackTrace();
}
}
/***
* <pre>
* 取得Workbook对象(xls和xlsx对象不同,不过都是Workbook的实现类)
* xls:HSSFWorkbook
* xlsx:XSSFWorkbook
* @param filePath
* @return
* @throws IOException
* </pre>
*/
public Workbook getWorkbook(String filePath) throws IOException {
Workbook workbook = null;
InputStream is = new FileInputStream(filePath);
if (filePath.endsWith(EXTENSION_XLS)) {
workbook = new HSSFWorkbook(is);
} else if (filePath.endsWith(EXTENSION_XLSX)) {
workbook = new XSSFWorkbook(is);
}
return workbook;
}
/**
* 文件检查
* @param filePath
* @throws FileNotFoundException
* @throws FileFormatException
*/
public void preReadCheck(String filePath) throws FileNotFoundException, FileFormatException {
// 常规检查
File file = new File(filePath);
if (!file.exists()) {
throw new FileNotFoundException("传入的文件不存在:" + filePath);
}
if (!(filePath.endsWith(EXTENSION_XLS) || filePath.endsWith(EXTENSION_XLSX))) {
throw new FileFormatException("传入的文件不是excel");
}
}
/**
* 读取excel文件内容
* @param filePath
* @throws FileNotFoundException
* @throws FileFormatException
*/
public void readExcel(String filePath) throws FileNotFoundException, FileFormatException {
// 检查
this.preReadCheck(filePath);
// 获取workbook对象
Workbook workbook = null;
try {
workbook = this.getWorkbook(filePath);
// 读文件 一个sheet一个sheet地读取
for (int numSheet = 0; numSheet < workbook.getNumberOfSheets(); numSheet++) {
Sheet sheet = workbook.getSheetAt(numSheet);
if (sheet == null) {
continue;
}
System.out.println("=======================" + sheet.getSheetName() + "=========================");
int firstRowIndex = sheet.getFirstRowNum();
int lastRowIndex = sheet.getLastRowNum();
// 读取首行 即,表头
Row firstRow = sheet.getRow(firstRowIndex);
for (int i = firstRow.getFirstCellNum(); i <= firstRow.getLastCellNum(); i++) {
Cell cell = firstRow.getCell(i);
String cellValue = this.getCellValue(cell, true);
System.out.print(" " + cellValue + "\t");
}
System.out.println("");
// 读取数据行
for (int rowIndex = firstRowIndex + 1; rowIndex <= lastRowIndex; rowIndex++) {
Row currentRow = sheet.getRow(rowIndex);// 当前行
int firstColumnIndex = currentRow.getFirstCellNum(); // 首列
int lastColumnIndex = currentRow.getLastCellNum();// 最后一列
for (int columnIndex = firstColumnIndex; columnIndex <= lastColumnIndex; columnIndex++) {
Cell currentCell = currentRow.getCell(columnIndex);// 当前单元格
String currentCellValue = this.getCellValue(currentCell, true);// 当前单元格的值
System.out.print(currentCellValue + "\t");
}
System.out.println("");
}
System.out.println("======================================================");
}
} catch (Exception e) {
//e.printStackTrace();
} finally {
if (workbook != null) {
try {
workbook.close();
} catch (IOException e) {
//e.printStackTrace();
}
}
}
}
/**
* 取单元格的值
* @param cell 单元格对象
* @param treatAsStr 为true时,当做文本来取值 (取到的是文本,不会把“1”取成“1.0”)
* @return
*/
public String getCellValue(Cell cell, boolean treatAsStr) {
if (cell == null) {
return "";
}
if (treatAsStr) {
// 虽然excel中设置的都是文本,但是数字文本还被读错,如“1”取成“1.0”
// 加上下面这句,临时把它当做文本来读取
cell.setCellType(Cell.CELL_TYPE_STRING);
}
if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN) {
return String.valueOf(cell.getBooleanCellValue());
} else if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
return String.valueOf(cell.getNumericCellValue());
} else {
return String.valueOf(cell.getStringCellValue());
}
}