导入excle数据将excle数据插入到数据库
实现功能是,用户可以直接导入对应数据,或者用户下载模板,填写数据,导入模板数据。easyui实现
前台页面
{
text : '日清导入',
iconCls : 'icon-print',
handler : function(){
$('#import').dialog('open');
} }
<div id = "import" title="员工信息导入" modal=true draggable=true align="center" class="easyui-dialog" closed=true style="width: 400px">
<form id="importForm" method="post" enctype="multipart/form-data">
<table id="importTable" align="center">
<tr>
<td align="center" colspan="2">
上传:<input id = "myFile" name="myFile" type="file"></input>
</td> </tr> <tr>
<td align ="center" colspan="2"><a id="download" href="<%=basePath %>import_template/template-dayrecruit.xls" class="easyui-linkbutton" >模板下载</a>
<a id="upload" class="easyui-linkbutton">上传</a>
<a id="importCancel" class="easyui-linkbutton">取消</a> </td>
</tr>
</table>
</form>
</div>
以上代码加颜色的是特别注意的点。上传文件一定加这些声明,否则不可实现。点击模板下载可以直接在我们根路径下找到模板,并下载。
具体的后台代码是:
@RequestMapping(value = "/imp", method = RequestMethod.POST, produces = "text/html;charset=UTF-8")
public @ResponseBody String imp(@RequestParam MultipartFile myFile,//这里会直接以流文件形式接收上传数据
HttpServletRequest request, HttpSession session) throws Exception { Account account = this.getStaticAccount();
if (myFile == null || myFile.getSize() == 0) {
return "未选择任何文件,请选择文件后上传!";
}
String fileType = myFile.getOriginalFilename().substring(
myFile.getOriginalFilename().lastIndexOf("."));
if (!fileType.equals(".xls") && !fileType.equals(".xlsx")) {
return "文件格式错误,请上传.xls或.xlsx格式文件!";
}
//String path = CommonsMethod.getProjectPath() ;
String path=request.getSession()
.getServletContext().getRealPath("/")
+ "/importReserveExcel/";
String fileattr = CommonsMethod.getNowCorrect2Millisecond()
+ myFile.getOriginalFilename().substring(
myFile.getOriginalFilename().lastIndexOf("."));
final File targetFile = new File(path, fileattr);
if (!targetFile.exists()) {
targetFile.mkdirs();
}
try {
myFile.transferTo(targetFile);
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} ArrayList<Object> dataList = new ArrayList<Object>();
try {
dataList = dayRecruitService.readExcel(
targetFile.getAbsolutePath(), 4);
} catch (Exception e) {
return e.getMessage();
}
try {
String failImport = dayRecruitService.importDayrecruit(
dataList, account);
} catch (RuntimeException e) {
return e.getMessage();
} catch (Exception e) {
return "请仔细核对上传格式(参考备注)";
}
return "上传成功";
} private static final String[] headers = new String[] {"日清日期","备注","面试人数","入职人数","招聘企业"};
readExcel代码:把数据先读到一个dayrecruit模板中 原因是当前读的数据不是直接向数据库中存的数据。
public ArrayList<Object> readExcel(String absolutePath, int i)throws Exception {
// TODO Auto-generated method stub ExcelOperations oper = new ExcelOperations();
ArrayList<Object> list = oper.readExcel(absolutePath,
Template_DayRecruit.class, columnHeaders,i ); return list;
} public static final String[] columnHeaders = { "date",
"remarks", "viewerNu",
"entryNu", "customerName"};
正式读取excle数据代码为
public ArrayList<Object> readExcel(String filePath, Class entity,
String[] columnHeads, int noReadSize) throws Exception {
ArrayList<Method> list = new ArrayList<Method>();
ArrayList<Object> objs = new ArrayList<Object>(); try {
for (int i = 0; i < columnHeads.length; i++) {
char f = columnHeads[i].charAt(0);
if (!Character.isUpperCase(f)) {
columnHeads[i] = String.valueOf(Character.toUpperCase(f))
+ columnHeads[i].substring(1);
}
Method methodGet = entity.getMethod("get" + columnHeads[i]);
Method methodSet = entity.getMethod("set" + columnHeads[i], methodGet.getReturnType());
list.add(methodSet);
}
InputStream inputstream = new FileInputStream(filePath);
Workbook wb = WorkbookFactory.create(inputstream);
Sheet sheet1 = wb.getSheetAt(0);
for (int i = 1; i <= sheet1.getLastRowNum() - noReadSize; i++) {
try { Object obj = entity.newInstance();
Cell cell = null;
for (int k = 0; k < list.size(); k ++) {
cell = sheet1.getRow(i).getCell(k);
if(cell.getCellType() == 0){
//判断是否为日期
if(HSSFDateUtil.isCellDateFormatted(cell)){
SimpleDateFormat sdf = null;
if (cell.getCellStyle().getDataFormat() == HSSFDataFormat
.getBuiltinFormat("h:mm")) {
sdf = new SimpleDateFormat("HH:mm");
} else {// 日期
sdf = new SimpleDateFormat("yyyy-MM-dd");
}
Date date = cell.getDateCellValue();
cell.setCellValue(sdf.format(date)); }else{
double value = cell.getNumericCellValue();
CellStyle style = cell.getCellStyle();
DecimalFormat format = new DecimalFormat();
String temp = style.getDataFormatString();
// 单元格设置成常规
if (temp.equals("General")) {
format.applyPattern("#");
}
cell.setCellValue(format.format(value)); }
}
list.get(k).invoke(obj, cell.toString());
}
objs.add(obj);
} catch (Exception e) {
e.printStackTrace();
throw new Exception("Excel 文件第" + i + "行格式错误");
}
}
} catch (Exception e) {
e.printStackTrace();
throw e;
}
return objs;
}
然后调用import方法,里面会验证需要验证的数据。如果有一条没有通过验证那么所有的数据将会回滚操作。这主要牵扯到了事务管理。
public String importDayrecruit(List<Object> dataList, Account user)
throws Exception { String failImport = "";
if (dataList != null && dataList.size() > 0) { //根据公司user找到对应公司 根据公司找到对应的 招聘企业 根据招聘企业
Organization org = dayRecruitDAO.findOrganizationById(user.getOrganization().getId()); List<EnterpriseCustomer> customers = dayRecruitDAO.findAllEnterpriseCustomerByOrg(user.getOrganization().getId()); for (int i = 0; i < dataList.size(); i++) {
DayRecruit dayRec = new DayRecruit();
Template_DayRecruit t_dayRecruit = new Template_DayRecruit();
t_dayRecruit = (Template_DayRecruit) dataList.get(i);
dayRec.setWriter(user.getLoginName());
dayRec.setDatatime(new Date());
dayRec.setRemarks(t_dayRecruit.getRemarks().trim());
//dayRec.
//验证招聘日期
if(isValidDate(t_dayRecruit.getDate().trim()) && StringUtils.isNotBlank(t_dayRecruit.getDate().trim())){
dayRec.setDate(t_dayRecruit.getDate().toString()); }else throw new RuntimeException("第" + (i + 2)
+ "行填写招聘日清日期有误,请重新确定");
//验证填写人
/* if(StringUtils.isNotBlank(dayRec.getWriter()) && dayRec.getWriter().equals(user.getUserName())){
dayRec.setWriter(dayRec.getWriter().trim());
}
else{
throw new RuntimeException("第" + (i + 2)
+ "行填写输入人有误,请填写您的登录账号,请重新确定");
}*/
//验证面试人数
if(isNumeric(t_dayRecruit.getViewerNu().trim()) && StringUtils.isNotBlank(t_dayRecruit.getViewerNu().trim())){
dayRec.setViewerNu(t_dayRecruit.getViewerNu().trim());
}
else throw new RuntimeException("第" + (i + 2)
+ "行填写面试人数有误,请重新确定");
//验证入职人数
if(isNumeric(t_dayRecruit.getEntryNu().trim()) && StringUtils.isNotBlank(t_dayRecruit.getEntryNu().trim())){ int re = Double.valueOf(t_dayRecruit.getEntryNu().trim()).compareTo(Double.valueOf(t_dayRecruit.getViewerNu().trim()));
if(re <1){
dayRec.setEntryNu(t_dayRecruit.getEntryNu().trim()); }
else {
throw new RuntimeException("第" + (i + 2)
+ "行入职人数大于面试人数,请重新确定");
}
}
else throw new RuntimeException("第" + (i + 2)
+ "行填写入职人数有误,请重新确定"); //验证招聘企业 从模板中获取招聘企业的名字 查询出 此公司所有的招聘企业 对应的话 取 招聘企业这个对象赋值给dayR // 验证所属公司
if(StringUtils.isNoneBlank(t_dayRecruit.getCustomerName().trim())){
boolean isOK = false;
if(customers != null && customers.size()>0){
for(int j =0;j<customers.size();j++){
if(customers.get(j).getEnterpriseName().equals(t_dayRecruit.getCustomerName().trim())){ dayRec.setCustomer(customers.get(j));
isOK = true;
break;//跳出当前循环
} } }
if (!isOK) {
throw new RuntimeException("第" + (i + 2)
+ "行招聘企业输入有误,请重新确定");
}
} dayRecruitDAO.add(dayRec);
}
} else {
throw new RuntimeException("导入数据为空");
}
return failImport;
}
这样数据就插入到对应数据库。完成导入操作。
导入excle数据将excle数据插入到数据库的更多相关文章
- 将excle表中得数据生成insert语句插入到数据库中
第一步:输入公式 第二步:拽住右下角得+往下拖拽
- Python datatime 格式转换,插入MySQL数据库
Python datatime 格式转换,插入MySQL数据库 zoerywzhou@163.com http://www.cnblogs.com/swje/ 作者:Zhouwan 2017-11-2 ...
- Python3 Pandas的DataFrame格式数据写入excle文件、json、html、剪贴板、数据库
Python3 Pandas的DataFrame格式数据写入excle文件.json.html.剪贴板.数据库 一.DataFrame格式数据 Pandas是Python下一个开源数据分析的库,它提供 ...
- 【Excle】动态更新数据下拉菜单
现在我们制作了一个简单的下拉菜单,如下: 但是随着公司的逐渐扩大,部门也变得多了,目前我是把数据范围写死的 ,所有每次添加一个部门,就得修改数据范围,那么现在我们不想修改这个范围了,想让他每次添加部门 ...
- 【Excle数据透视】二维数据如何创建数据透视表
二维数据在创建数据透视表的时候,可能会给你带来一些麻烦,没法创建,会丢失维度,那怎么办呢? 解决办法:使用数据透视表和数据透视图向导即可创建 具体操作如下: 按下[Alt+D+P],出现如下界面 选择 ...
- [转] JAVA读取excel数据(插入oracle数据库)
原文地址:http://blog.csdn.net/zczzsq/article/details/16803349 本实例做的是读取execl(只能读取.xls的execl,即只能读取03版的),如果 ...
- 使用Sqoop,最终导入到hive中的数据和原数据库中数据不一致解决办法
Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql.postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL , ...
- 14.插入数据、复制数据--SQL
一.插入完整的行 要求指定表名和插入到新行中的值 INSERT INTO Customers ', 'Toy Land', '123 Any Street', 'New York', 'NY', ', ...
- C# 数据批量插入到数据库SqlBulkCopy(源数据类型:List<T> Or DataTable)
/*_____________________ List<T>类型数据 To Sql_______________________________*/ /// <summary& ...
- 从零自学Hadoop(17):Hive数据导入导出,集群数据迁移下
阅读目录 序 将查询的结果写入文件系统 集群数据迁移一 集群数据迁移二 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephis ...
随机推荐
- 开始我的PostgreSQL的学习之旅
经过这么长时间的学习,终于确定了我的研究方向是PostgreSQL的空间数据库的设计流程,具体怎样实现这个过程,其难度是挺大的,我必须克服掉,尽量得往前看.大家有相同的研究方向的,可以一同来学习,相互 ...
- CentOS下Redis安装配置小结
Redis是REmote DIctionary Server的缩写. 是一个使用 C 语言写成的,开源的 key-value 非关系型数据库.跟memcached类似,不过数据可以持久化. Redis ...
- C#中Invoke的用法()
invoke和begininvoke 区别 一直对invoke和begininvoke的使用和概念比较混乱,这两天看了些资料,对这两个的用法和原理有了些新的认识和理解. 首先说下,invoke和beg ...
- hdu5119 dp
题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5119 题意: 输入T组数据,每组数据包括两个数n和m,接下来n个数,这n个数可以随意取( ...
- canvas 3D运动球效果
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- 项目新的需求,网页的自适应交付/响应式交付 Responsive/Adaptive Delivery
网页为什么要做自适应交付,皆因现在移动设备大行其道,现在是移动互联网时代,以IOS及Android为首的各种移动终端已经遍地开花. 当人家用380px的iphone打开你的网页时,你总不能显示个102 ...
- [数据库]关于MAX()函数的一个坑
之前写了这么一条sql语句,目的是取出表中itemid最大的那一条数据. SELECT date, MAX(itemid) AS itemid, group FROM mytable GROUP BY ...
- display:none 与 opacity:0
display:none隐藏消失: opacity:0 只是透明:
- BZOJ1082: [SCOI2005]栅栏 题解
题目大意: 有一些木材,可以没有浪费地将一根木材分成几块木板(比如长度为10的木板可以切成长度为8和2的两块木板).现在你希望得到一些长度的木板,问通过分割木材最多能得到几块想要的木板. 思路: 首先 ...
- TC SRM 593 DIV2 1000
很棒的DP,不过没想出,看题解了..思维很重要. #include <iostream> #include <cstdio> #include <cstring> ...