为了导入大量的测试数据进入数据库,但是必须保证导入的数据有效,包含公司名字和邮箱,导入后可以批量的发送邮件(不是垃圾邮件),是邀请邮件。同事给我的文件是excel的,正好,学学如何操作excel以及如何有效的导入数据库并让效率让人满意。
首先操作excel:
用到类:
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
这3个足够用了。
InputStream input = new FileInputStream(url);
Workbook book = Workbook.getWorkbook(input);
Sheet[] st = book.getSheets();//得到excel第一页的内容,我们知道excel可以分成很多个工作单元哈
int index = st[0].getRows();//得到记录行
List list = new ArrayList();
for(int i=0;i<index; i++){
Cell company = st[0].getCell(0, i);//获取第一列的对象
Cell emails = st[0].getCell(1,i);//获取第二列的对象
String cps = company.getContents(); //得到第一列的某行的文本值
if(cps.length() >= 30){
cps = "";
}
if(cps!=""){
String els = emails.getContents(); //同样的得到第
String[] temp = getEmails(els);
int j = temp.length;
String[] temps = new String[1];
while(j >= 1){
temps = new String[]{cps, temp[j-1]};
//map.put(cps, temp[j-1]);
list.add(temps);
j--;
}
}
}
啊 上面的就这样了,由于他里面的数据不规范,可能有空的或者多个换行符之类的,导致插入数据报长度不够的错误,所以要截取一下有效数据,用java的正则表达式。
/**
* 根据mail返回递归后的邮件列表
* @param str
* @return
*/
public String[] getEmails(String str){
Pattern p = Pattern.compile("\n|\r|\t"); //可修改
String[] a = p.split(str);
return a;
}
大概就是这个样子啊,返回的是某一个单元格的数据行的数组。比如说某一个单元格写了10条数据,那么就返回一个长度为10的数组。
下面是去除重复:
int ccc = 0;
for(int m = 0; m < list.size()-1; m++){
String entname = ((String[])list.get(m))[0]; //得到公司名字
String entemail = ((String[])list.get(m))[1];//得到公司邮箱
//String name = list1.get(m).toString();
//System.out.println("公司邮箱:"+s+"-------公司名字:"+name);
for (int w = list.size()-1; w > m ; w--) {
String tempname = ((String[])list.get(w))[0];
String tempemail = ((String[])list.get(w))[1];
if(tempemail.equals(entemail)){
//System.out.println("重复"+tempemail+" 公司:"+tempname);
list.remove(w);
}
System.out.println("执行了"+(ccc++)+"次");
}
}
看不懂没关系,嵌套循环而已,效率不算高,时间仓促。将来改进。。。呵呵
这里得到了第二列的所有的有效的邮件,保证不重复。(为了达到邮件的验证,可以在上面的哦正则表达式中加邮箱验证,这里我就没弄了,因为数据不是很重要,验证邮箱的正则网上一大把)。
好了,上面的读取excel基本操作已经搞完了,下面是插入数据
代码如下:
Connection conn = dao.getQueryDao().getCurrentHibernateSession().connection();
String sql = "?,?";//假设insert后面的value就2个值哈
try {
java.sql.PreparedStatement pars = conn.prepareStatement(sql);
for (Object object : list) {
String[] str = (String[])object;
String a = str[0];//公司
String b = str[1];//邮箱
pars.setString(1, a);
pars.setString(2, b);
pars.addBatch();
}
pars.executeBatch();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
上面这个应该不难理解,可能获取connection的方式有点诡异,呵呵对了,dao是spring注入的,表示一个通用dao(commonDAO)所以里面能拿到这个connection的了,这里就不多做解释。要是有疑问欢迎站内。
这里要说明的是batch这个玩意儿,如果采用一般的JDBC对数据库操作的话效率没有这个快,为什么呢,看一下addbatch然后跳出循环后executebatch就知道了,嗯,肯定是一次性操作啦,至于有什么坏处,有待我以后慢慢研究。
弄完这个,执行插入成功,那些个约束啊长度限制啊神码的需要自己在写的过程中调整。写完后我就决定要写一个通用的文件操作类了,下次操作文件的时候能直接拖过用,下一篇文章可能是会讲解图表技术的一些相关内容。
分享到:
相关推荐
excel数据批量导入数据库的小工具,节省你的时间
用EXCEL批量导入数据库 , 经过测试的, 没有 问题!!
内容概要:本资源介绍了如何从利用Npoi库操作Excel,如相关读取单元格、行,介绍了如何对单元格数据格式进行操作,并分享了如何将Datatable数据导入Mysql数据库,方便项目管理。 阅读建议:此资源以如何读取Excel...
实现从Excel批量导入数据到MySQL 数据库中,可以同时导入多张Excel表,使用时在excel.table 中配置需要导入的表及可!
将excal批量数据插入到postgresql数据库(目前实现字符串拼接的方式)。。
这段代码主要实现的是将excel里面的大量数据一次性批量导入Oracle数据库内。
最近跟客户做数据对接比较多,发现平常的添加到数据库数据太慢,所以也没少逛论坛。结合论坛上的资料封装...插入数据库数据请使用SqlBackCopy。下载过的朋友我这个帖子行或者不行麻烦给在下评论下,希望能帮更多的人。
可以将任意的EXCEL格式数据,导入到数据库中。能进行批量的导入。
EasyExcel 并发读取文件字段并进行校验,数据写入到新文件,批量插入数据到数据库 demo
考虑到当Excel数据量较大时,循环Insert语句效率太低,故采用批量插入的方法。在插入操作运行时,会造成系统短暂的“卡死”现象。为了让用户知道插入的状态,需要制作一个进度条来显示插入的进度。 批量插入 项目中...
3.通过连接Excel表,将Excel表作为数据库,创建选择集,然后将选择集批量插入Excel指定位置,速度比较快 4.将数组直接插入到Excel指定位置,速度比较快,因为数组数据在内存中,对于比较复杂的判断,可以先在数组中...
具体是:用 C# 操作 Excel 表 和 Access数据库,含批量导出、批量导入、批量合并excel、批量打印等功能,范例代码,绝对基础。 共 6 个基础的范例(绝对基础的代码): ① 一键合并多个Excel表; ② 把excel表快速...
批量导入Excel数据到数据库,.NET 2008开发,带数据校验、数据库事务回滚、Excel预览、日志功能的完整开发代码
excel 连接oracle插件 可以从表格直接插数据库 方便快捷
主要介绍了Django 批量插入数据的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
这个工具是之前写了做数据稽核用的工具,甲方发过来了几十个Excel表格,每个表格都有一百多万数据,必须导入数据库才能作分析,所以写了这个脚本用来导数据,做报表的可参考,改一下脚本中的数据库字段就能用了
golangExcel用go语言实现本地excel数据导入数据库
每读取到一行数据会先做数据校验,如果校验通过后就会放到缓存集合中,List数量积累到1000时就会通过Mybatis的批量操作进行数据插入。doAfterAllAnalysed方法会在读取Excel完成后进行调用。 通过以上步骤,可以利用...
NULL 博文链接:https://dzy-123.iteye.com/blog/1879533
在WEB项目开发过程中有时会碰到批量插入数据到数或者是将EXCEL文件据入到数据库中.为了方便实现可以先将EXCEL导入到GRIDVIEW中然后一次批量插入.实现代码如下: 前台代码 学号> <ItemTemplate>