Java读取Execl表格数据
在前面提到用java代码新建一个Execl 表格并添加数据到表格中,
这次写了一个读取Execl表格数据并添加导数据库中的案列
给定对方一个Execl模板表格,如果导入的Execl表格和预订的表格不相符,给予对应的提示
如果全部都符合要求则把读取到的每一行数据对象添加到数据库中去(需考虑导入数量大小问题)
所需 jxl.jar 下载地址 http://pan.baidu.com/s/1pJsXKEJ
HTML代码
<div id="saveCustom">
<form action="<%=path%>/custom/testAction!addCustomByExcel.action" method="post" name="excelForm" id="excelForm" enctype="multipart/form-data">
<s:token name="token" id="token"/>
<table width="100%" border="0" align="center" style="border-left: 1px #ccc solid; border-bottom: 1px #ccc solid; border-right: 1px #ccc solid; background-color: white;" >
<tr>
<td height="60" class="title" colspan="2">Excel文档导入</td>
</tr>
<tr align="center">
<td style="height: 60px;" >
<span style="color: red; font-size: 14px;"><strong>请选择Excel文档1:</strong></span>
<input type="file" name="customExcel" id="customExcel"/>
<a href="<%=path + "/jsp/template.xls"%>" target="_blank"><span style="color: red"><strong>[模板下载]</strong></span</a>
</br>
</td>
</tr>
<tr align="center">
<td style="border-top: 1px #eee dashed; height: 40px;">
<input type="submit" name="sub" value=" 提 交 " sytle="cursor: pointer;" class="sub"/>
<input type="button" name="return" value="取 消" sytle="cursor: pointer;" onclick="$.unblockUI()" class="sub"/>
</td>
</tr>
</table>
</form>
</div>
//Action 控制层
private CustomService customService;//spring IOC注入service对象
private File customExcel;
public File getCustomExcel() {
return customExcel;
}
public void setCustomExcel(File customExcel) {
this.customExcel = customExcel;
}
public void setCustomService(CustomService customService)
{
this.customService = customService;
}
public String addCustomByExcel() {
String token = getP("token"); //拿到页面上传来的token值 防止重复提价导入
String sessionToken=(String)getSession().getAttribute("struts.tokens.token");
if(null!=sessionToken&&sessionToken.equals(token)){
if (customExcel != null) {
Long size = customExcel.length();//拿到上传文件的长度
if (size > 1024 * 1024 * 5) {
getRequest().setAttribute("error", "请选择小于5M的文件!");
return "errorInfo";
} else {
String result = customService.customByExcel(customExcel);
String[] results = result.split(":");//返回哪行哪列格式有误
if("5000Y1".equals(result)){
getRequest().setAttribute("error", "请下载新模板!");
return "errorInfo";
}
if (results.length == 1) {//导入文件操作提示
getRequest().setAttribute("info", "success");
getRequest().setAttribute("num",results[0]);
} else {
getRequest().setAttribute("error","第" + results[0] + "行,列名为\""+results[1]+"\"数据格式有问题,检查是否存在空格!");
}
}
} else {
getRequest().setAttribute("error", "请选择一个要导入的excel文件!");
return "errorInfo";
}
}else{
getRequest().setAttribute("error", "请勿重复提交!");
return "errorInfo";
}
return "errorInfo";
}
//Service层
private HibernateTransactionManager transactionManager;//事物对象spring IOC注入
public HibernateTransactionManager getTransactionManager() {
return transactionManager;
}
public void setTransactionManager(HibernateTransactionManager transactionManager) {
this.transactionManager = transactionManager;
}
public String customByExcel(File customExcel) {
Workbook wb = null;
List<Custom> customs=new ArrayList<Custom>();
int rowNum = 0;//总行数
String sgin="succeed";//表示导入表格当中的每一行都符合模板要求
String errorRow="",errorCol="",result="";//标记错误数据在第几行 和那个字段 最终返回结果
//事物回滚处理
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus status = transactionManager.getTransaction(def);
try {
wb=Workbook.getWorkbook(customExcel);
if(wb!=null){
Sheet[] sheet=wb.getSheets();
if(sheet != null && sheet.length > 0){
rowNum = sheet[0].getRows()-1;//拿到总行数
Cell[] cells2 = sheet[0].getRow(0);
//查看必填列 列名字是否和模板一致
if(cells2.length != 9 || !"中文名".equals(cells2[0].getContents().replace(" ", "")) ||
!"性别".equals(cells2[2].getContents().replace(" ", "")) ||
!"证件类型".equals(cells2[3].getContents().replace(" ", "")) ||
!"证件号码".equals(cells2[4].getContents().replace(" ", "")) ||
!"所在国家".equals(cells2[5].getContents().replace(" ", ""))
){
return "5000Y1";//模板格式不正确
}
for(int i=1;i<rowNum;i++){
Cell[] cells = sheet[0].getRow(i);//拿到第一个表空间的第i列的数据
if(cells!=null && cells.length>0){
if ("pass".equals(colIsNotEmpty(cells))) {//必填字段都不等于空
Custom custom=new Custom();
//把读取到的数据填充到对象中、、、、、、、、、
System.out.println(cells[0].getContents().replace(" ", "").toString()+"::"
+cells[1].getContents().replace(" ", "").toString()+"::"
+cells[2].getContents().replace(" ", "").toString()+"::"
+cells[3].getContents().replace(" ", "").toString()+"::"
+cells[4].getContents().replace(" ", "").toString()+"::"
+cells[5].getContents().replace(" ", "").toString()+"::"
+cells[6].getContents().replace(" ", "").toString()+"::"
+cells[7].getContents().replace(" ", "").toString()+"::"
+cells[8].getContents().replace(" ", "").toString()
);
customs.add(custom);
}else{
errorCol=colIsNotEmpty(cells);
errorRow=(i+1)+"";
sgin="failure";
break;
}
}
}
if(sgin.equals("succeed")){//如果模板正确并且数据格式也符合要求就添加本次导入的数据
for(Custom c:customs){
customDao.saveCustom(c);
}
result=customs.size()+"";//返回成功添加条数
transactionManager.commit(status);
}else {
result=errorRow+":"+errorCol;//返回错误行和列信息
}
}
}
} catch (Exception e) {
transactionManager.rollback(status);//添加数据或者是其他发生异常回滚
e.printStackTrace();
}
return result;
}
//验证必填字段是否都符合要求,如果不符合要求则返回字段名称
public String colIsNotEmpty(Cell[] cells){
if(!StringUtils.isNotEmpty(cells[0].getContents().replace(" ", ""))){
return "中文名";
}
if(!StringUtils.isNotEmpty(cells[2].getContents().replace(" ", ""))){
return "性别";
}
if(!StringUtils.isNotEmpty(cells[3].getContents().replace(" ", ""))){
return "证件类型";
}
if(!StringUtils.isNotEmpty(cells[4].getContents().replace(" ", ""))){
return "证件号码";
}
if(!StringUtils.isNotEmpty(cells[5].getContents().replace(" ", ""))){
return "所在国家";
}
return "pass";
}
Java读取Execl表格数据的更多相关文章
- java利用poi来读取execl表格返回对象
利用poi来读取execl表格,返回一个对象(可能有点不完善,但是应该能满足平常的所用),用到了反射等等; 使用的jar包有: commons-collections4-4.1.jar poi-3.1 ...
- Java读取excel表格
Java读取excel表格 一般都是用poi技术去读取excel表格的,但是这个技术又是什么呢 什么是Apache POI? Apache POI是一种流行的API,它允许程序员使用Java程序创建, ...
- xlrd模块-读取Execl表格
#xlrd模块 读取execl表格 import xlrd Execl = xlrd.open_workbook(r'Z:\Python学习\python26期视频\day76(allure参数.读e ...
- Python读取execl表格
读取execl表格 import xlrd Execl = xlrd.open_workbook(r'Z:\Python学习\python26期视频\day76(allure参数.读excel.发邮件 ...
- 通过java读取HDFS的数据 (转)
原文链接:通过java读取HDFS的数据 通过JAVA直接读取HDFS中的时候,一定会用到FSDataInputStream类,通过FSDataInputStream以流的形式从HDFS读数据代码如下 ...
- java读取PHP接口数据的实现方法(四)
PHP文件: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 3 ...
- 利用 pandas库读取excel表格数据
利用 pandas库读取excel表格数据 初入IT行业,愿与大家一起学习,共同进步,有问题请指出!! 还在为数据读取而头疼呢,请看下方简洁介绍: 数据来源为国家统计局网站下载: 具体方法 代码: i ...
- go读取excel表格数据
go读取excel表格数据 使用工具 github.com/Luxurioust/excelize 百度到的都是使用这个 实际上已经改名了 github.com/360EntSecGroup-Skyl ...
- JAVA处理Excel表格数据并写入数据库
package com.hncj.test; import java.io.FileInputStream; import java.sql.Connection; import java.sql.D ...
随机推荐
- Activity生命周期 onCreate onResume onStop onPause (转)
Android应用开发提高系列(6)——Activity生命周期 onCreate 和 onResume 在程序启动时候都会启动, 所有有些需要在onCreate onResume中都要实现的功能,之 ...
- 在Asp.Net MVC中PartialView与EditorFor和DisplayFor的区别
相同之处: PartialView, EditorFor 和 DisplayFor 都可以用作来实现页面的公共部分,其他页面可以根据需求来引用. 不同之处: PartialView 是从Page的角度 ...
- Linux学习笔记(1)Linux虚拟机安装过程中的知识点及常用管理工具
1. VMware的相关知识 (1)建议的VMware的配置: CPU 主频1GHz以上 内存 1GB以上 硬盘 分区空闲空间8GB以上 (2)VMware创建快照 快照的作用是保存虚拟机的现有状态, ...
- CF735C 数论\平衡树叶子节点的最大深度\贪心\斐波那契\条件归一化
http://codeforces.com/problemset/problem/735/C 题意..采用淘汰赛制..只要打输就退出比赛..而且只有两个选手打过的场数 相差不超过1才能比赛..最后问你 ...
- $(function(){})与window.onload的区别
不太一样window.onload是在页面所有的元素都加载完成后才触发$(function(){})是在页面的dom结构加载完毕后就触发 dom里的内容不一定都已经加载完成比如说一个页面有好多图片 而 ...
- felx项目属性(二)
order flex-grow flex-shrink flex-basis flex align-self 1.1 order css order属性规定了弹性容器中的可伸缩项目在布局时的顺序.元素 ...
- CentOS配置本地yum源(使用镜像iso文件)
本人在使用yum安装软件的时候,感觉最不爽的是网络不佳时,安装的速度特别慢.所以,个人就上网search了一下如何使用Linux的安装文件作为其yum源.经过几次尝试,已经可以成功的配置了.下面是详细 ...
- SpringHttpInvoker解析1-使用示例
HTTP invoker是一个新的远程调用模型,作为Spring框架的一部分,来执行基于HTTP的远程调用(让防火墙可以接受),并使用Java的序列化机制. 服务端 定义服务接口UserService ...
- hdu1503 最长公共子序列变形
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1503 题意:给出两个字符串 要求输出包含两个字符串的所有字母的最短序列.注意输出的顺序不能 ...
- XSS 跨站脚本攻击之构造剖析(一)
1.XSS-Filter:跨站脚本过滤器,用于分析用户提交的输入,并消除潜在的跨站脚本攻击 (1)XSS Filter实际上是一段精心编写的过滤函数作用是过滤XSS跨站脚本代码: (2)绕过XSS F ...