读取excel表格并且解析数据进行批量插入

直接上代码

package ffcs.cn.peam.function.controller;

import java.io.File;
import java.io.IOException;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.TimeZone;

import jxl.DateCell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import ffcs.cn.peam.function.domain.ExcelRecord;



@Controller
@RequestMapping(value = "peam/function")
public class FunctionController {

	@RequestMapping("function")
	public String index() {
		System.out.println("这是我的首页");
		return "function/function";
	}

	//*****************对excel文件进行处理********************
	@RequestMapping("solveExcel")
	public List<ExcelRecord> solveExcel(){
		String url="D:\\File_Save_Space\\upload\\20200821\\blshbcsj\\20200821\\1597979717375.xls";
		Workbook workbook = getWorkbook(url);//获取excel
		Sheet sheet = getSheet(workbook);//获取excel的第一个sheet
		
		List<ExcelRecord> records = new ArrayList<ExcelRecord>();
		resovleCells(sheet,records);
		workbook.close();
		return records;
	}
	
	//************根据路径获取excel文件****************
	private Workbook getWorkbook(String uri) {
		Workbook wb = null;
		try {
			wb = Workbook.getWorkbook(new File(uri));
		} catch (BiffException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return wb;
	}
	
	//************获取excel的第一页sheet****************
	private Sheet getSheet(Workbook workbook) {
		Sheet sheet = workbook.getSheet(0);
		return sheet;
	}
	
	
	//************解析时间格式****************
	private Date convertDate4JXL(Date date) throws ParseException{
		if(date==null)
	        return null;
       TimeZone gmt = TimeZone.getTimeZone("GMT");
       DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",Locale.getDefault());
       dateFormat.setTimeZone(gmt);
       String str = dateFormat.format(date);
      
       TimeZone local = TimeZone.getDefault();
       dateFormat.setTimeZone(local);
       return dateFormat.parse(str);
	}
	
	
	
	//*********************解析excel*********************
	private void resovleCells(Sheet sheet,List<ExcelRecord> records) {
		
		int rowSize = sheet.getRows();//行
		int columnSize = sheet.getColumns();//列
		//这里如果excel前面四行是标题,读取数据则会从第五行开始读取
		for(int rowNum=4; rowNum<rowSize; rowNum++){
			//检查是否整行都是空的
			boolean flag=false;
			for(int i=0;i<columnSize;i++){
				String con=sheet.getCell(i,rowNum).getContents();
				if(null!=con&&!"".equals(con.trim())){
					flag=true;
					break;
				}
			}
			
			//如果都为空,直接读取下一行
			if(!flag){
				continue;
			}
			
			//记录当前所在行数
			ExcelRecord record = new ExcelRecord();
			record.setRowNum(rowNum);

			
			//读取日期格式的数据,格式正确则插入,格式错误则停止并且记录错误
			String measureTime="";
			try {
				measureTime = convertDate4JXL(((DateCell) sheet.getCell(0,rowNum)).getDate()).toLocaleString();
			} catch (Exception e) {
				SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				measureTime = sheet.getCell(0,rowNum).getContents();
				try {
					formatter.parse(measureTime);
				} catch (ParseException e1) {
					record.setReason("时间格式不正确!");
					record.setTime(sheet.getCell(0,rowNum).getContents());
					/*continue;*/
				}
			}
			record.setTime(measureTime);
			
			//读取数据并且插入
			String value=sheet.getCell(1,rowNum).getContents();
			record.setValue(Integer.parseInt(value));
			
			//将每一行插入到集合中
			records.add(record);
			
			//批量操作插入数据(这里没有对格式错误的数据进行剔除,需要的自行剔除)
			save(records);
		}
	}
	
	
	//**********************批量插入数据*******************************
	@Autowired
	private JdbcTemplate jdbcTemplate;
	
	public void save(List<ExcelRecord> records) {
		final List<ExcelRecord> values = records; 
		String sql=" insert into records (T1.TIME,T1.VALUE) values(?,?)";
			
		jdbcTemplate.batchUpdate(sql,new BatchPreparedStatementSetter(){   
				//执行次数 
	            public int getBatchSize() {   
	                 return values.size();    
	            }   
	            
	            //执行参数
	            public void setValues(PreparedStatement ps, int i)   
	                    throws SQLException {
	            	String sTime=values.get(i).getTime();
	            	SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	            	Date time=new Date();
					try {
						time = formatter.parse(sTime);
					} catch (ParseException e) {
						e.printStackTrace();
					}
	            	
	            	ps.setTimestamp(1, new Timestamp(time.getTime())); 
	            	ps.setInt(2,values.get(i).getValue());
	            	
	            }    
	      });  
	}
	
	
	
	
	
	
	
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用VFP读取EXCEL中的数据示例 *!* *****数据导入程序,由“学生基本基本情况表模板.xls”导入数据 *!* ***使用VFP控制EXCEL表,计取中指定列的内容*********** *!* "学生基本基本情况表模板.xls"的数据布局 *!* cells(1,1):“标题” *!* cells(2,1):校区 *!* cells(2,3):学历 *!* cells(2,5):专业 *!* cells(2,6):班级 *!* *!* set safe off set talk on LOCAL inf(4) as String *dele file C:\MyDocu~1\Resume.xlw objExcel = CreateObject("Excel.Application") &&创建一个EXCEL应用程序实例 wjm=getfile("xls") objExcel.Workbooks.Open(wjm) &&调用workbooks(Microsoft Excel 应用程序; 中当前打开的所有 Workbook 对象的集合。); 对象的open方法程序来打开指定的文件,并为; 打开的文件创建一个新的工作簿 *objexcel.visible=.f. ***下面的代码判断出生日期字段的格式是否满足要求*** *IF !varTYPE(objexcel.cells(10,6))="d" * MESSAGEBOX("出生日期字段不满足格式要求,不能导入,请将出生日期字段修改为:"+CHR(13); +"mm.dd.yy的格式,如:05.19.83 表示1983年5月19 然后再运行此导入程序") * RETURN *ENDIF inf(1)=substr(objexcel.cells(2,1).value,7)&&校区 Inf(2)=objexcel.cells(2,4).value&&学历 inf(3)=objexcel.cells(2,6).value&&专业 inf(4)=objexcel.cells(2,7).value&&班 LOCAL nrow as Number ,i as Number i=0 *MESSAGEBOX("计算行数") *MESSAGEBOX(objexcel.cells(5,1).value) *MESSAGEBOX(VARTYPE(objexcel.cells(22,1).value)) DO WHILE .t. i=i+1 ?objexcel.cells(i,1).value IF !VARTYPE(objexcel.cells(i,1).value)="C" nrow=i-1 EXIT ENDIF ENDDO *nrow=20 LOCAL arecord(16) *MESSAGEBOX("循环添加记录") USE zlb disinf("zlb.dbf中现有记录"+ALLTRIM(STR(RECCOUNT()))+"条") disinf("正在添加记录") FOR i=4 TO nrow arecord(1)=objexcel.cells(i,1).value&&学号  arecord(2)=objexcel.cells(i,2).value&&姓名 arecord(3)=objexcel.cells(i,3).value&&性别 arecord(4)=objexcel.cells(i,4).value&&籍贯 arecord(5)=objexcel.cells(i,5).value&&民族 *MESSAGEBOX(VARTYPE(objexcel.cells(i,6).value)) IF VARTYPE(objexcel.cells(i,6).value)="C" arecord(6)=RIGHT(objexcel.cells(i,6).value,2)+"/"+"01"+'/'; +LEFT(objexcel.cells(i,6).value,2) ELSE arecord(6)= RIGHT(STR(objexcel.cells(i,6).value,5,2),2); +"/"+"01"+"/"; +LEFT(STR(objexcel.cells(i,6).value,5,2),2) ENDIF &&arecord(6)=IIF(VARTYPE(objexcel.cells(i,6).value)="c",RIGHT(objexcel.cells(i,6).value,2)+"/"+"01"+'/'+LEFT(objexcel.cells(i,6).value,2),; RIGHT(STR(objexcel.cells(i,6).value,5,2),2)+"/"+"01"+'/'+LEFT(STR(objexcel.cells(i,6).value,5,2),2))&&出生年月 arecord(7)=LEFT(ALLTRIM(STR(objexcel.cells(i,8).value,6,0)),6)&&邮政编码 arecord(8)=objexcel.cells(i,7).value&&通讯地址 arecord(9)=objexcel.cells(i,9).value &&收信人 arecord(10)=iif(!ALLTRIM(objexcel.cells(i,10).value)=="",objexcel.cells(i,10).value; ,"无")&&家庭电话 arecord(11)=inf(3)&&专业 arecord(12)=inf(4)&&班级 arecord(13)=objexcel.cells(i,11).value&&寝室号码 arecord(14)=STR(objexcel.cells(i,12).value,7,0)&&寝室电话 arecord(15)=inf(1)&&校区 arecord(16)=inf(2)&&学历 SELECT zlb APPEND FROM ARRAY arecord ENDFOR disinf("zlb.dbf中现有记录"+ALLTRIM(STR(RECCOUNT()))+"条") disinf("记录添加完毕,共添加了"+ALLTRIM(STR(nrow-3))+"条记录,请查检") INKEY(3) WAIT CLEAR ****定义日期转换函数,此函数能将各种格式的日期转换成mm/dd/yy的格式**** ****如果要转换的日期只有年和月,则自动添加日为'01'*** *!* FUNCTION datetran *!* PARAMETERS soudate *!* IF VARTYPE(soudate)="N" *!* DO case *!* CASE LEN(souDATE) ***关闭工作簿,退出EXCEL objexcel.quit RELEASE objexcel *!* objexcel.save *!* *objExcel.ActiveWorkbook.saved=.f. *!* objexcel.Quit &&退出 *!* RELEASE objexcel *!* retu

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值