Excel导入可能是代码开发中比較常见的功能,一个项目假设有多个地方须要excel导入数据库。那么开发的工作量也将比較大,项目产品化过程中,将这么一个类似的功能进行封装合并也是必要的。封装好的代码仅仅须要
用法:
第一步进行数据库关于excel的配置
第二步在jsp页面引入excel导入界面就可以
拿到excel模板,不须要自己写后台代码,直接在数据库配置excel列与数据库字段的关系,然后在须要excel导入的地方,引入一个连接,就可以生成excel导入功能。数据库配置一定要正确
//客户信息批量导入 function excelToData() { var contextPath = "<%=request.getContextPath()%>"; var groupType = $("#cstGrpType").val(); $.showModalDialog(contextPath+"/util/openExcelToDataServlet?loginCode=<%=ContextUtil.getUserView().getLoginCode()%>&loginDept=<%=ContextUtil.getUserView().getOrgnizationId()%>&excelCode=CUSTOMER_GROUP¶m="+groupType,"客户群组成员导入",valueCallback,null,"350","150",2); }
一、可以解决的excel导入:
1、 已明白的单个表的excel导入
2、 已明白的多个没关系的表excel导入
3、 已明白的多个有关系的表excel导入
excel表格中内容必须从第一行第一列開始。当然能够通过页面设置,功能不复杂,这次的代码就不写了。类似下图中数据放在随机行随机列不支持
二、数据库配置
说明:excel数据库模板化导入,关键是在数据库配置,配置不能出错。
ID |
NUMBER(10) |
主键,无意义 |
EXCEL_CODE |
VARCHAR2(50) |
导出功能的标识,注意不同的excel导入功能excel_code不能反复,jsp页面传输參数之中的一个。 |
EXCEL_INTO_TABLE |
VARCHAR2(64) |
excel导入的表。须要导入到哪个表中 |
FILED_CODE |
VARCHAR2(64) |
字段代码。导入到对应表中的哪个字段 |
FILED_NAME |
VARCHAR2(32) |
字段名称,与表字段相相应的excel列名,不是通过excel导入的字段。这个能够不写 |
FILED_TYPE |
VARCHAR2(10) |
字段类型, S字符串, T表示时间, I表示数字,假设是主键,须要在TABLE_PK字段中,写上实体类的项目路径 A表示登录人帐号, D表示加入人部门, N表示当前时间, P表示页面传入的參数, F表示外键,通过插入还有一个表生成外键(数字类型F&I,时间类型F&T,字符串类型F&S),须要在FILED_EXCELCODE_CONSTANT字段中写上外键表的excel_code C表示常量(数字类型C&I,时间类型C&T,字符串类型C&S)。眼下仅支持这些标记。 |
FILED_EXTEND |
VARCHAR2(200) |
外部属性 |
TABLE_PK |
VARCHAR2(128) |
记录表获得的序列号的标志,为空表示导入字段 |
FILED_ORDER |
NUMBER |
记录插入顺序 |
FILED_VALIDATE |
VARCHAR2(200) |
字段值为Y或者N。标记该字段是否须要验证,假设须要,将包括的值保存在FILED_EXCELCODE_CONSTANT字段中 |
FILED_EXCELCODE_CONSTANT |
VARCHAR2(100) |
当FILED_TYPE为F或C时起作用。 当为F时向还有一个表中插入数据,值为已存在的EXCEL_CODE 。当为C时表示的是常量的值 |
FILED_EXCELCODE_ISRETURN |
CHAR(1) |
当FILED_TYPE为F时起作用。作为外键值输出,Y表示是返回值的字段。N表示非返回值的字段 |
三、核心代码
package com.haiyisoft.cc.util.web.struts; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Method; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFDateUtil; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import com.haiyisoft.cc.util.util.ExcelCheckMethod; import com.haiyisoft.entity.cc.util.CcExcel; import com.haiyisoft.entity.framework.EntitySequenceNo; import com.haiyisoft.ep.cache.util.LogUtil; import com.haiyisoft.ep.common.jpa.util.JPAUtil; import com.haiyisoft.ep.common.model.QueryParamList; import com.haiyisoft.ep.common.model.SortParam; import com.haiyisoft.ep.common.model.SortParamList; import com.haiyisoft.ep.framework.util.DropBeanUtil; import com.haiyisoft.ep.framework.view.UserView; /** * excel导入 * @author 牟云飞 * @tel 15562579597 * @QQ 1147417467 * @company 海颐软件股份有限公司 * * <p> Modification History:</p> * <p> Date Author Description </p> * <p>------------------------------------------------------------------</p> * <p> 2014-5-14 muyunfei 新建 </p> */ public class ExcelToDataAction extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub this.doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub try { importExcel(req,resp); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } //excel导入 public void importExcel(HttpServletRequest request, HttpServletResponse response) throws Exception{ //导入成功个数 int count=0; //导入信息 String message=""; //获取excelcode String excelCode=request.getParameter("excelCode"); if(null==excelCode||"".equals(excelCode)){ message="导入失败<br/>excelCode不存在"; request.setAttribute("message",message); } request.setAttribute("excelCode", excelCode); String param=request.getParameter("param"); request.setAttribute("param", param); //获得数据库中的excel配置 QueryParamList params = new QueryParamList(); params.addParam("excelCode", excelCode); SortParamList sortParams = new SortParamList(); sortParams.addParam("excelIntoTable", SortParam.SORT_TYPE_ASCENDING); sortParams.addParam("filedOrder", SortParam.SORT_TYPE_ASCENDING); List<CcExcel> list = JPAUtil.load(CcExcel.class,params, null, null, sortParams, null); //读取excel try { request.setCharacterEncoding("gbk"); response.setContentType("text/html;charset=gbk"); // 1. 创建工厂类 DiskFileItemFactory factory = new DiskFileItemFactory(); // 2. 创建FileUpload对象 ServletFileUpload upload = new ServletFileUpload(factory); // 3. 推断是否是上传表单 // boolean b = upload.isMultipartContent(request); // 设置上传文件最大值 upload.setSizeMax(25 * 1024 * 1024); // 是文件上传表单 // 4. 解析request,获得FileItem项 List<FileItem> fileitems = upload.parseRequest(request); // 5. 遍历集合 for (FileItem item : fileitems) { // 推断是不是普通字段 if (!item.isFormField()) { // 获得流,读取数据写入文件 InputStream in = item.getInputStream(); Workbook book = createWorkBook(in,item.getName()); // 获得第一个工作表对象 Sheet sheet = book.getSheetAt(0); if(0==sheet.getLastRowNum()){ //假设没有数据 request.setAttribute("message", "excel的sheet0中不存在数据"); request.getRequestDispatcher("/cc/util/excelToData.jsp").forward(request, response); } // 第一行为标题,从第二行開始录入 for (int i = 1; i <= sheet.getLastRowNum(); i++) { //标题行,用来对例如便得到数据 Row titleRow = sheet.getRow(0); //数据行 Row row = sheet.getRow(i); String sql_name=""; String sql_value=""; String sql_table=""; QueryParamList paramsList=null; int fieldCount=1; for (int j = 0; j < list.size(); j++) { CcExcel excelItem = list.get(j); if(j==0){ //获取数据库表明 sql_table=excelItem.getExcelIntoTable(); paramsList=new QueryParamList(); } //解决多表插入问题 if(!sql_table.equals(excelItem.getExcelIntoTable())){ //假设表不一样,先插入一个 String sql="insert into "+sql_table+"("+sql_name+")"+" values("+sql_value+")" ; JPAUtil.executeNativeUpdate(sql,paramsList); //重置条件 sql_table=excelItem.getExcelIntoTable(); sql_name=""; sql_value=""; fieldCount=1; paramsList=new QueryParamList(); } //插入的类型 String fieldType =excelItem.getFiledType(); //外部属性 String fieldExtend=excelItem.getFiledExtend(); //序列号 String table_pk=(excelItem.getTablePk()+"").trim(); //是否须要验证,N不验证 方法名 String insert_validate=(excelItem.getFiledValidate()+"").trim(); //字段名 if(null!=excelItem.getFiledCode()&&!"".equals(excelItem.getFiledCode())){ if(1!=fieldCount){ sql_name+=","; //列值占位 sql_value+=","; } fieldCount++; sql_name+=excelItem.getFiledCode(); //获得用户session UserView urser= (UserView) request.getSession().getAttribute("userView"); String loginCode=""; String loginDept=""; //解决再次提交session消失的问题 if(null==urser||"".equals(urser)){ loginCode=request.getParameter("loginCode"); loginDept=request.getParameter("loginDept"); }else{ loginCode=urser.getLoginCode(); loginDept=urser.getOrgnizationId()+""; } request.setAttribute("loginCode", loginCode); request.setAttribute("loginDept", loginDept); String value_temp=""; //设置字段值 if ("T".equals(fieldType)){ //字段类型T表示是时间类型 sql_value = sql_value+ "TO_DATE(:dt"+j+",'YYYY-MM-DD HH24:MI:SS') "; int position= getCellPosition(titleRow,excelItem.getFiledName()); if(-1!=position){ //用来验证时候校验 value_temp= this.getValue((Cell) row.getCell(position)); //校验 String[] item_value = checkValue(value_temp,insert_validate,row,param,titleRow); if(null!=item_value&&0!=item_value.length&&"1".equals(item_value[0])){ //校验能够保存 value_temp=item_value[1]; }else if(null!=item_value&&0!=item_value.length&&"0".equals(item_value[0])){ message="导入失败<br/>"+item_value[1]; request.setAttribute("message",message); request.getRequestDispatcher("/cc/util/excelToData.jsp").forward(request, response); return ; } paramsList.addParam("dt"+j, value_temp); }else{ message="导入失败<br/>"+message; request.setAttribute("message",message); request.getRequestDispatcher("/cc/util/excelToData.jsp").forward(request, response); return ; } }else if ("I".equals(fieldType)){ //字段类型I表示是数字类型 sql_value = sql_value + "TO_NUMBER(:pk"+j+") "; //查看序列号 if(null!=table_pk&&!"".equals(table_pk)&&!"null".equals(table_pk)){ //查询Ep_Sys_Entity_Sequence_No表获得数据 QueryParamList para=new QueryParamList(); para.addParam("entityType", table_pk); String queryPKhql="select to_char(a.maxNo) from EntitySequenceNo a where a.entityType='"+table_pk+"'"; List<Object> listPK = JPAUtil.find(queryPKhql); //最大值加1 String updateSql="update EntitySequenceNo a set a.maxNo=a.maxNo+1 where a.entityType='"+table_pk+"'"; JPAUtil.executeUpdate(updateSql); //用来验证时候校验 value_temp= listPK.get(0)+""; //校验 String[] item_value = checkValue(value_temp,insert_validate,row,param,titleRow); if(null!=item_value&&0!=item_value.length&&"1".equals(item_value[0])){ //校验能够保存 value_temp=item_value[1]; }else if(null!=item_value&&0!=item_value.length&&"0".equals(item_value[0])){ message="导入失败<br/>"+item_value[1]; request.setAttribute("message",message); request.getRequestDispatcher("/cc/util/excelToData.jsp").forward(request, response); return ; } paramsList.addParam("pk"+j, value_temp); }else if(null!=fieldExtend&&!"".equals(fieldExtend)){ DropBeanUtil util = new DropBeanUtil() ; int position= getCellPosition(titleRow,excelItem.getFiledName()); if(-1!=position){ //用来验证时候校验 value_temp= this.getValue((Cell) row.getCell(position)); String dropName = util.getDropLabel(fieldExtend, value_temp); //校验 String[] item_value = checkValue(dropName,insert_validate,row,param,titleRow); if(null!=item_value&&0!=item_value.length&&"1".equals(item_value[0])){ //校验能够保存 dropName=item_value[1]; }else if(null!=item_value&&0!=item_value.length&&"0".equals(item_value[0])){ message="导入失败<br/>"+item_value[1]; request.setAttribute("message",message); request.getRequestDispatcher("/cc/util/excelToData.jsp").forward(request, response); return ; } paramsList.addParam("pk"+j, Integer.valueOf(dropName)); }else{ message="导入失败<br/>"+message; request.setAttribute("message",message); request.getRequestDispatcher("/cc/util/excelToData.jsp").forward(request, response); return ; } }else{ int position= getCellPosition(titleRow,excelItem.getFiledName()); if(-1!=position){ //用来验证时候校验 value_temp= this.getValue((Cell) row.getCell(position)); //校验 String[] item_value = checkValue(value_temp,insert_validate,row,param,titleRow); if(null!=item_value&&0!=item_value.length&&"1".equals(item_value[0])){ //校验能够保存 value_temp=item_value[1]; }else if(null!=item_value&&0!=item_value.length&&"0".equals(item_value[0])){ message="导入失败<br/>"+item_value[1]; request.setAttribute("message",message); request.getRequestDispatcher("/cc/util/excelToData.jsp").forward(request, response); return ; } paramsList.addParam("pk"+j, value_temp); }else{ message="导入失败<br/>"+message; request.setAttribute("message",message); request.getRequestDispatcher("/cc/util/excelToData.jsp").forward(request, response); return ; } } } else if ("A".equals(fieldType)){ //字段类型A表示是登录人员帐号 //用来验证时候校验 value_temp= loginCode; //校验 String[] item_value = checkValue(value_temp,insert_validate,row,param,titleRow); if(null!=item_value&&0!=item_value.length&&"1".equals(item_value[0])){ //校验能够保存 value_temp=item_value[1]; }else if(null!=item_value&&0!=item_value.length&&"0".equals(item_value[0])){ message="导入失败<br/>"+item_value[1]; request.setAttribute("message",message); request.getRequestDispatcher("/cc/util/excelToData.jsp").forward(request, response); return ; } sql_value = sql_value + "'"+value_temp+"'"; }else if ("D".equals(fieldType)){ //字段类型D表示是登录人的部门 //用来验证时候校验 value_temp= loginDept; //校验 String[] item_value = checkValue(value_temp,insert_validate,row,param,titleRow); if(null!=item_value&&0!=item_value.length&&"1".equals(item_value[0])){ //校验能够保存 value_temp=item_value[1]; }else if(null!=item_value&&0!=item_value.length&&"0".equals(item_value[0])){ message="导入失败<br/>"+item_value[1]; request.setAttribute("message",message); request.getRequestDispatcher("/cc/util/excelToData.jsp").forward(request, response); return ; } sql_value = sql_value + "'"+value_temp+"'"; }else if ("N".equals(fieldType)){ //字段类型N表示是当前时间 sql_value = sql_value + " SYSDATE "; }else if ("P".equals(fieldType)){ //字段类型P表示是传入參数 String excelPara=request.getParameter("param")+""; //用来验证时候校验 value_temp= excelPara; //校验 String[] item_value = checkValue(value_temp,insert_validate,row,param,titleRow); if(null!=item_value&&0!=item_value.length&&"1".equals(item_value[0])){ //校验能够保存 value_temp=item_value[1]; }else if(null!=item_value&&0!=item_value.length&&"0".equals(item_value[0])){ message="导入失败<br/>"+item_value[1]; request.setAttribute("message",message); request.getRequestDispatcher("/cc/util/excelToData.jsp").forward(request, response); return ; } sql_value = sql_value + "'"+value_temp+"'"; }else if ("F".equals(fieldType.substring(0,1))){ //外键类型F表示通过插入还有一个表形成外键 String fieldExcelCode=excelItem.getFiledExcelcodeConstant(); //获得返回值 String[] insertFKValue=executeFieldExcelCode(fieldExcelCode,row,param,titleRow,loginCode,loginDept); if(null==insertFKValue){ message="导入失败<br/>fieldExcelCode不存在输出值"; request.setAttribute("message",message); request.getRequestDispatcher("/cc/util/excelToData.jsp").forward(request, response); return ; } //假设存在错误返回。结束操作返回 错误信息 if(!"1".equals(insertFKValue[0])){ message="导入失败<br/>"+insertFKValue[1]; request.setAttribute("message",message); request.getRequestDispatcher("/cc/util/excelToData.jsp").forward(request, response); return ; } //用来验证时候校验 value_temp= insertFKValue[1];//获取正确值 //校验 String[] item_value = checkValue(value_temp,insert_validate,row,param,titleRow); if(null!=item_value&&0!=item_value.length&&"1".equals(item_value[0])){ //校验能够保存 value_temp=item_value[1]; }else if(null!=item_value&&0!=item_value.length&&"0".equals(item_value[0])){ message="导入失败<br/>"+item_value[1]; request.setAttribute("message",message); request.getRequestDispatcher("/cc/util/excelToData.jsp").forward(request, response); return ; } String type=fieldType.substring(2,fieldType.length()); if("I".equals(type)){ sql_value = sql_value + ""+value_temp+""; }else if("T".equals(type)){ sql_value = sql_value + "TO_DATE('"+value_temp+"','YYYY-MM-DD HH24:MI:SS') "; }else{ sql_value = sql_value + "'"+value_temp+"'"; } }else if ("C".equals(fieldType.substring(0,1))){ //常量类型 //从数据库中获得常量的值 value_temp=excelItem.getFiledExcelcodeConstant(); //校验 String[] item_value = checkValue(value_temp,insert_validate,row,param,titleRow); if(null!=item_value&&0!=item_value.length&&"1".equals(item_value[0])){ //校验能够保存 value_temp=item_value[1]; }else if(null!=item_value&&0!=item_value.length&&"0".equals(item_value[0])){ message="导入失败<br/>"+item_value[1]; request.setAttribute("message",message); request.getRequestDispatcher("/cc/util/excelToData.jsp").forward(request, response); return ; } //获得类型,依据类型推断插入的值类型 String type=fieldType.substring(2,fieldType.length()); if("I".equals(type)){ sql_value = sql_value + ""+value_temp+""; }else if("T".equals(type)){ sql_value = sql_value + "TO_DATE('"+value_temp+"','YYYY-MM-DD HH24:MI:SS') "; }else{ sql_value = sql_value + "'"+value_temp+"'"; } }else { sql_value = sql_value + " :st"+j; //查看序列号 if(null!=table_pk&&!"".equals(table_pk)&&!"null".equals(table_pk)){ //查询Ep_Sys_Entity_Sequence_No表获得数据 QueryParamList para=new QueryParamList(); para.addParam("entityType", table_pk); List<EntitySequenceNo> listPk=null; listPk = JPAUtil.load(EntitySequenceNo.class, para, null, null, null, null) ; long pk =listPk.get(0).getMaxNo(); //最大值加1 String updateSql="update EntitySequenceNo a set a.maxNo=a.maxNo+1 where a.entityType='"+table_pk+"'"; JPAUtil.executeUpdate(updateSql); //用来验证时候校验 value_temp= (pk+1)+""; //校验 String[] item_value = checkValue(value_temp,insert_validate,row,param,titleRow); if(null!=item_value&&0!=item_value.length&&"1".equals(item_value[0])){ //校验能够保存 value_temp=item_value[1]; }else if(null!=item_value&&0!=item_value.length&&"0".equals(item_value[0])){ message="导入失败<br/>"+item_value[1]; request.setAttribute("message",message); request.getRequestDispatcher("/cc/util/excelToData.jsp").forward(request, response); return ; } paramsList.addParam("st"+j, value_temp); }else if(null!=fieldExtend&&!"".equals(fieldExtend)){ DropBeanUtil util = new DropBeanUtil() ; int position= getCellPosition(titleRow,excelItem.getFiledName()); if(-1!=position){ //用来验证时候校验 value_temp= this.getValue((Cell) row.getCell(position)); String dropName = util.getDropLabel(fieldExtend, value_temp); //校验 String[] item_value = checkValue(dropName,insert_validate,row,param,titleRow); if(null!=item_value&&0!=item_value.length&&"1".equals(item_value[0])){ //校验能够保存 dropName=item_value[1]; }else if(null!=item_value&&0!=item_value.length&&"0".equals(item_value[0])){ message="导入失败<br/>"+item_value[1]; request.setAttribute("message",message); request.getRequestDispatcher("/cc/util/excelToData.jsp").forward(request, response); return ; } paramsList.addParam("st"+j, dropName); }else{ message="导入失败<br/>"+message; request.setAttribute("message",message); request.getRequestDispatcher("/cc/util/excelToData.jsp").forward(request, response); return ; } }else{ int position= getCellPosition(titleRow,excelItem.getFiledName()); if(-1!=position){ //用来验证时候校验 value_temp= this.getValue((Cell) row.getCell(position)); if(null==value_temp){ value_temp=""; } //校验 String[] item_value = checkValue(value_temp,insert_validate,row,param,titleRow); if(null!=item_value&&0!=item_value.length&&"1".equals(item_value[0])){ //校验能够保存 value_temp=item_value[1]; }else if(null!=item_value&&0!=item_value.length&&"0".equals(item_value[0])){ message="导入失败<br/>"+item_value[1]; request.setAttribute("message",message); request.getRequestDispatcher("/cc/util/excelToData.jsp").forward(request, response); return ; } paramsList.addParam("st"+j, value_temp); }else{ //假设都没有,推断验证列。假设验证列有方法运行方法 if(null!=insert_validate&&!"N".equals(insert_validate)&&!"null".equals(insert_validate.toLowerCase())){ //校验 String[] item_value = checkValue("",insert_validate,row,param,titleRow); if(null!=item_value&&0!=item_value.length&&"1".equals(item_value[0])){ //校验能够保存 value_temp=item_value[1]; }else if(null!=item_value&&0!=item_value.length&&"0".equals(item_value[0])){ message="导入失败<br/>"+item_value[1]; request.setAttribute("message",message); request.getRequestDispatcher("/cc/util/excelToData.jsp").forward(request, response); return ; } paramsList.addParam("st"+j, value_temp); }else{ message="导入失败<br/>"+"excel未找到有该列("+excelItem.getFiledName()+")"; request.setAttribute("message",message); request.getRequestDispatcher("/cc/util/excelToData.jsp").forward(request, response); return ; } } } } } } //插入数据库 String sql="insert into "+sql_table+"("+sql_name+")"+" values("+sql_value+")" ; JPAUtil.executeNativeUpdate(sql,paramsList); //成功导入一掉excel数据 count++; } } } message="成功导入"+count+"条记录<br/>"+message; request.setAttribute("message","1"); request.setAttribute("messagecontext",message); request.getRequestDispatcher("/cc/util/excelToData.jsp").forward(request, response); } catch (Exception e) { e.printStackTrace(); message="导入失败<br/>"+message; request.setAttribute("message",message); request.getRequestDispatcher("/cc/util/excelToData.jsp").forward(request, response); } } //解决验证问题、解决值须要又一次计算问题 @SuppressWarnings({ "unchecked", "rawtypes" }) private String[] checkValue(String excelValue,String insert_validate,Row row,String param ,Row titleRow){ try{ String[] value=new String[2]; if(null!=insert_validate&&!"".equals(insert_validate)&&!"N".equals(insert_validate)){ String classPath="com.haiyisoft.cc.util.util.ExcelCheckMethod"; Class cl = Class.forName(classPath); Method method = cl.getMethod(insert_validate, String.class,String.class,Row.class,Row.class); //採用实例化一个对象,相应的方法中spring将不起作用必须用new //假设返回数据为数组 第一位 1通过。 0验证失败 // 第二位 返回正确值 失败的原因 ExcelCheckMethod excelMethod=new ExcelCheckMethod(); value=(String[])method.invoke(excelMethod,excelValue,param,row,titleRow); return value; } return null; }catch(Exception e){ LogUtil.getLogger().error("验证出现异常"); return null; } } //得到filed_name在excel是第几列 private int getCellPosition(Row titleRow,String name){ int num=-1; if(null==name||"null".equals(name)||"".equals(name)||"NULL".equals(name)){ return num; } for (int i = 0; i < titleRow.getLastCellNum(); i++) { String title=titleRow.getCell(i).getStringCellValue(); if(name.trim().equals(title.trim())){ return i; } } LogUtil.getLogger().error("无法找到列:"+name); return num; } /* 推断是xls文件还是xlsx文件 */ public Workbook createWorkBook(InputStream is,String name) throws IOException{ if(name.toLowerCase().endsWith("xls")){ return new HSSFWorkbook(is); } if(name.toLowerCase().endsWith("xlsx")){ return new XSSFWorkbook(is); } return null; } //解决excel类型问题,获得数值 public String getValue(HSSFCell cell) { String value = ""; if(null==cell){ return value; } switch (cell.getCellType()) { //数值型 case HSSFCell.CELL_TYPE_NUMERIC: if (HSSFDateUtil.isCellDateFormatted(cell)) { //假设是date类型则 ,获取该cell的date值 Date date = HSSFDateUtil.getJavaDate(cell.getNumericCellValue()); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); value = format.format(date);; }else {// 纯数字 BigDecimal big=new BigDecimal(cell.getNumericCellValue()); value = big.toString(); //解决1234.0 去掉后面的.0 if(null!=value&&!"".equals(value.trim())){ String[] item = value.split("[.]"); if(1<item.length&&"0".equals(item[1])){ value=item[0]; } } } break; //字符串类型 case HSSFCell.CELL_TYPE_STRING: value = cell.getStringCellValue().toString(); break; // 公式类型 case HSSFCell.CELL_TYPE_FORMULA: //读公式计算值 value = String.valueOf(cell.getNumericCellValue()); if (value.equals("NaN")) {// 假设获取的数据值为非法值,则转换为获取字符串 value = cell.getStringCellValue().toString(); } break; // 布尔类型 case HSSFCell.CELL_TYPE_BOOLEAN: value = " "+ cell.getBooleanCellValue(); break; // 空值 case HSSFCell.CELL_TYPE_BLANK: value = ""; LogUtil.getLogger().error("excel出现空值"); break; // 故障 case HSSFCell.CELL_TYPE_ERROR: value = ""; LogUtil.getLogger().error("excel出现问题"); break; default: value = cell.getStringCellValue().toString(); } if("null".endsWith(value.trim())){ value=""; } return value; } //解决excel类型问题。获得数值 public String getValue(Cell cell) { String value = ""; if(null==cell){ return value; } switch (cell.getCellType()) { //数值型 case Cell.CELL_TYPE_NUMERIC: if (HSSFDateUtil.isCellDateFormatted(cell)) { //假设是date类型则 ,获取该cell的date值 Date date = HSSFDateUtil.getJavaDate(cell.getNumericCellValue()); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); value = format.format(date);; }else {// 纯数字 BigDecimal big=new BigDecimal(cell.getNumericCellValue()); value = big.toString(); //解决1234.0 去掉后面的.0 if(null!=value&&!"".equals(value.trim())){ String[] item = value.split("[.]"); if(1<item.length&&"0".equals(item[1])){ value=item[0]; } } } break; //字符串类型 case Cell.CELL_TYPE_STRING: value = cell.getStringCellValue().toString(); break; // 公式类型 case Cell.CELL_TYPE_FORMULA: //读公式计算值 value = String.valueOf(cell.getNumericCellValue()); if (value.equals("NaN")) {// 假设获取的数据值为非法值,则转换为获取字符串 value = cell.getStringCellValue().toString(); } break; // 布尔类型 case Cell.CELL_TYPE_BOOLEAN: value = " "+ cell.getBooleanCellValue(); break; // 空值 case Cell.CELL_TYPE_BLANK: value = ""; LogUtil.getLogger().error("excel出现空值"); break; // 故障 case Cell.CELL_TYPE_ERROR: value = ""; LogUtil.getLogger().error("excel出现问题"); break; default: value = cell.getStringCellValue().toString(); } if("null".endsWith(value.trim())){ value=""; } return value; } //通过关联excelcode插入表数据,并返回输出的值 public String[] executeFieldExcelCode(String fieldExcelCode,Row row,String param,Row titleRow,String loginCode,String loginDept){ //返回的值 String[] value= new String[2]; //获得数据库中的excel配置 QueryParamList params = new QueryParamList(); params.addParam("excelCode", fieldExcelCode); SortParamList sortParams = new SortParamList(); sortParams.addParam("excelIntoTable", SortParam.SORT_TYPE_ASCENDING); sortParams.addParam("filedOrder", SortParam.SORT_TYPE_ASCENDING); List<CcExcel> list = JPAUtil.load(CcExcel.class,params, null, null, sortParams, null); String sql_name=""; String sql_value=""; String sql_table=""; String message=""; QueryParamList paramsList=null; int fieldCount=1; for (int j = 0; j < list.size(); j++) { CcExcel excelItem = list.get(j); if(j==0){ //获取数据库表明 sql_table=excelItem.getExcelIntoTable(); paramsList=new QueryParamList(); } //解决多表插入问题 if(!sql_table.equals(excelItem.getExcelIntoTable())){ //假设表不一样,先插入一个 String sql="insert into "+sql_table+"("+sql_name+")"+" values("+sql_value+")" ; JPAUtil.executeNativeUpdate(sql,paramsList); //重置条件 sql_table=excelItem.getExcelIntoTable(); sql_name=""; sql_value=""; fieldCount=1; paramsList=new QueryParamList(); } //插入的类型 String fieldType =excelItem.getFiledType(); //外部属性 String fieldExtend=excelItem.getFiledExtend(); //序列号 String table_pk=(excelItem.getTablePk()+"").trim(); //是否须要验证,N不验证 方法名 String insert_validate=(excelItem.getFiledValidate()+"").trim(); //字段名 if(null!=excelItem.getFiledCode()&&!"".equals(excelItem.getFiledCode())){ if(1!=fieldCount){ sql_name+=","; //列值占位 sql_value+=","; } fieldCount++; sql_name+=excelItem.getFiledCode(); String value_temp=""; //设置字段值 if ("T".equals(fieldType)){ //字段类型T表示是时间类型 sql_value = sql_value+ "TO_DATE(:dt"+j+",'YYYY-MM-DD HH24:MI:SS') "; int position= getCellPosition(titleRow,excelItem.getFiledName()); if(-1!=position){ //用来验证时候校验 value_temp= this.getValue((Cell) row.getCell(position)); //校验 String[] item_value = checkValue(value_temp,insert_validate,row,param,titleRow); if(null!=item_value&&0!=item_value.length&&"1".equals(item_value[0])){ //校验能够保存 value_temp=item_value[1]; }else if(null!=item_value&&0!=item_value.length&&"0".equals(item_value[0])){ com.haiyisoft.ep.log.LogUtil.getAppLoger().error("导入失败,"+item_value[1]); value[0]="0"; value[1]=item_value[1]; return value; } //假设是返回值 if("Y".equals(excelItem.getFiledExcelcodeIsreturn())){ value[0]="1"; value[1]=value_temp; } paramsList.addParam("dt"+j, value_temp); }else{ com.haiyisoft.ep.log.LogUtil.getAppLoger().error("导入失败,excel未找到有该列("+excelItem.getFiledName()+")"); value[0]="0"; value[1]="excel未找到有该列("+excelItem.getFiledName()+")"; return value; } }else if ("I".equals(fieldType)){ //字段类型I表示是数字类型 sql_value = sql_value + "TO_NUMBER(:pk"+j+") "; //查看序列号 if(null!=table_pk&&!"".equals(table_pk)&&!"null".equals(table_pk)){ //查询Ep_Sys_Entity_Sequence_No表获得数据 QueryParamList para=new QueryParamList(); para.addParam("entityType", table_pk); List<EntitySequenceNo> listPk = JPAUtil.load(EntitySequenceNo.class, para, null, null, null, null) ; long pk =listPk.get(0).getMaxNo(); //最大值加1 String updateSql="update EntitySequenceNo a set a.maxNo=a.maxNo+1 where a.entityType='"+table_pk+"'"; JPAUtil.executeUpdate(updateSql); //用来验证时候校验 value_temp= (pk+1)+""; //校验 String[] item_value = checkValue(value_temp,insert_validate,row,param,titleRow); if(null!=item_value&&0!=item_value.length&&"1".equals(item_value[0])){ //校验能够保存 value_temp=item_value[1]; }else if(null!=item_value&&0!=item_value.length&&"0".equals(item_value[0])){ message="导入失败<br/>"+item_value[1]; com.haiyisoft.ep.log.LogUtil.getAppLoger().error(message); value[0]="0"; value[1]=item_value[1]; return value; } //假设是返回值 if("Y".equals(excelItem.getFiledExcelcodeIsreturn())){ value[0]="1"; value[1]=value_temp; } paramsList.addParam("pk"+j, value_temp); }else if(null!=fieldExtend&&!"".equals(fieldExtend)){ DropBeanUtil util = new DropBeanUtil() ; int position= getCellPosition(titleRow,excelItem.getFiledName()); if(-1!=position){ //用来验证时候校验 value_temp= this.getValue((Cell) row.getCell(position)); String dropName = util.getDropLabel(fieldExtend, value_temp); //校验 String[] item_value = checkValue(dropName,insert_validate,row,param,titleRow); if(null!=item_value&&0!=item_value.length&&"1".equals(item_value[0])){ //校验能够保存 dropName=item_value[1]; }else if(null!=item_value&&0!=item_value.length&&"0".equals(item_value[0])){ message="导入失败<br/>"+item_value[1]; com.haiyisoft.ep.log.LogUtil.getAppLoger().error(message); value[0]="0"; value[1]=item_value[1]; return value; } //假设是返回值 if("Y".equals(excelItem.getFiledExcelcodeIsreturn())){ value[0]="1"; value[1]=dropName; } paramsList.addParam("pk"+j, Integer.valueOf(dropName)); }else{ message="导入失败<br/>"+message; com.haiyisoft.ep.log.LogUtil.getAppLoger().error("excel未找到有该列("+excelItem.getFiledName()+")"); value[0]="0"; value[1]="excel未找到有该列("+excelItem.getFiledName()+")"; return value; } }else{ int position= getCellPosition(titleRow,excelItem.getFiledName()); if(-1!=position){ //用来验证时候校验 value_temp= this.getValue((Cell) row.getCell(position)); //校验 String[] item_value = checkValue(value_temp,insert_validate,row,param,titleRow); if(null!=item_value&&0!=item_value.length&&"1".equals(item_value[0])){ //校验能够保存 value_temp=item_value[1]; }else if(null!=item_value&&0!=item_value.length&&"0".equals(item_value[0])){ message="导入失败<br/>"+item_value[1]; com.haiyisoft.ep.log.LogUtil.getAppLoger().error(message); value[0]="0"; value[1]=item_value[1]; return value; } //假设是返回值 if("Y".equals(excelItem.getFiledExcelcodeIsreturn())){ value[0]="1"; value[1]=value_temp; } paramsList.addParam("pk"+j, value_temp); }else{ message="导入失败<br/>"+message; com.haiyisoft.ep.log.LogUtil.getAppLoger().error("excel未找到有该列("+excelItem.getFiledName()+")"); value[0]="0"; value[1]="excel未找到有该列("+excelItem.getFiledName()+")"; return value; } } } else if ("A".equals(fieldType)){ //字段类型A表示是登录人员帐号 //用来验证时候校验 value_temp= loginCode; //校验 String[] item_value = checkValue(value_temp,insert_validate,row,param,titleRow); if(null!=item_value&&0!=item_value.length&&"1".equals(item_value[0])){ //校验能够保存 value_temp=item_value[1]; }else if(null!=item_value&&0!=item_value.length&&"0".equals(item_value[0])){ message="导入失败<br/>"+item_value[1]; com.haiyisoft.ep.log.LogUtil.getAppLoger().error(message); value[0]="0"; value[1]=item_value[1]; return value; } //假设是返回值 if("Y".equals(excelItem.getFiledExcelcodeIsreturn())){ value[0]="1"; value[1]=value_temp; } sql_value = sql_value + "'"+value_temp+"'"; }else if ("D".equals(fieldType)){ //字段类型D表示是登录人的部门 //用来验证时候校验 value_temp= loginDept; //校验 String[] item_value = checkValue(value_temp,insert_validate,row,param,titleRow); if(null!=item_value&&0!=item_value.length&&"1".equals(item_value[0])){ //校验能够保存 value_temp=item_value[1]; }else if(null!=item_value&&0!=item_value.length&&"0".equals(item_value[0])){ message="导入失败<br/>"+item_value[1]; com.haiyisoft.ep.log.LogUtil.getAppLoger().error(message); value[0]="0"; value[1]=item_value[1]; return value; } //假设是返回值 if("Y".equals(excelItem.getFiledExcelcodeIsreturn())){ value[0]="1"; value[1]=value_temp; } sql_value = sql_value + "'"+value_temp+"'"; }else if ("N".equals(fieldType)){ //字段类型N表示是当前时间 sql_value = sql_value + " SYSDATE "; }else if ("P".equals(fieldType)){ //字段类型P表示是传入參数 String excelPara=param; //用来验证时候校验 value_temp= excelPara; //校验 String[] item_value = checkValue(value_temp,insert_validate,row,param,titleRow); if(null!=item_value&&0!=item_value.length&&"1".equals(item_value[0])){ //校验能够保存 value_temp=item_value[1]; }else if(null!=item_value&&0!=item_value.length&&"0".equals(item_value[0])){ message="导入失败<br/>"+item_value[1]; com.haiyisoft.ep.log.LogUtil.getAppLoger().error(message); value[0]="0"; value[1]=item_value[1]; return value; } //假设是返回值 if("Y".equals(excelItem.getFiledExcelcodeIsreturn())){ value[0]="1"; value[1]=value_temp; } sql_value = sql_value + "'"+value_temp+"'"; }else if ("F".equals(fieldType.substring(0,1))){ //外键类型F表示通过插入还有一个表形成外键 String fieldExcelCode2=excelItem.getFiledExcelcodeConstant(); //获得返回值 String[] insertFKValue=executeFieldExcelCode(fieldExcelCode2,row,param,titleRow,loginCode,loginDept); if(null==insertFKValue){ message="导入失败<br/>fieldExcelCode配置导入一次"; com.haiyisoft.ep.log.LogUtil.getAppLoger().error(message); value[0]="0"; value[1]=message; return value; } //假设存在错误返回。结束操作返回 错误信息 if(!"1".equals(insertFKValue[0])){ message="导入失败<br/>"+insertFKValue[1]; com.haiyisoft.ep.log.LogUtil.getAppLoger().error(message); value[0]="0"; value[1]=message; return value; } //用来验证时候校验 value_temp= insertFKValue[1];//获取正确值 //校验 String[] item_value = checkValue(value_temp,insert_validate,row,param,titleRow); if(null!=item_value&&0!=item_value.length&&"1".equals(item_value[0])){ //校验能够保存 value_temp=item_value[1]; }else if(null!=item_value&&0!=item_value.length&&"0".equals(item_value[0])){ message="导入失败<br/>"+item_value[1]; com.haiyisoft.ep.log.LogUtil.getAppLoger().error(message); value[0]="0"; value[1]=item_value[1]; return value; } //假设是返回值 if("Y".equals(excelItem.getFiledExcelcodeIsreturn())){ value[0]="1"; value[1]=value_temp; } String type=fieldType.substring(2,fieldType.length()); if("I".equals(type)){ sql_value = sql_value + ""+value_temp+""; }else if("T".equals(type)){ sql_value = sql_value + "TO_DATE('"+value_temp+"','YYYY-MM-DD HH24:MI:SS') "; }else{ sql_value = sql_value + "'"+value_temp+"'"; } }else if ("C".equals(fieldType.substring(0,1))){ //常量类型 //从数据库中获得常量的值 value_temp=excelItem.getFiledExcelcodeConstant(); //校验 String[] item_value = checkValue(value_temp,insert_validate,row,param,titleRow); if(null!=item_value&&0!=item_value.length&&"1".equals(item_value[0])){ //校验能够保存 value_temp=item_value[1]; }else if(null!=item_value&&0!=item_value.length&&"0".equals(item_value[0])){ message="导入失败<br/>"+item_value[1]; com.haiyisoft.ep.log.LogUtil.getAppLoger().error(message); value[0]="0"; value[1]=item_value[1]; return value; } //获得类型,依据类型推断插入的值类型 String type=fieldType.substring(2,fieldType.length()); if("I".equals(type)){ sql_value = sql_value + ""+value_temp+""; }else if("T".equals(type)){ sql_value = sql_value + "TO_DATE('"+value_temp+"','YYYY-MM-DD HH24:MI:SS') "; }else{ sql_value = sql_value + "'"+value_temp+"'"; } //假设是返回值 if("Y".equals(excelItem.getFiledExcelcodeIsreturn())){ value[0]="1"; value[1]=value_temp; } }else { sql_value = sql_value + " :st"+j; //查看序列号 if(null!=table_pk&&!"".equals(table_pk)&&!"null".equals(table_pk)){ //查询Ep_Sys_Entity_Sequence_No表获得数据 QueryParamList para=new QueryParamList(); para.addParam("entityType", table_pk); List<EntitySequenceNo> listPk = JPAUtil.load(EntitySequenceNo.class, para, null, null, null, null) ; long pk =listPk.get(0).getMaxNo(); //最大值加1 String updateSql="update EntitySequenceNo a set a.maxNo=a.maxNo+1 where a.entityType='"+table_pk+"'"; JPAUtil.executeUpdate(updateSql); //用来验证时候校验 value_temp= (pk+1)+""; //校验 String[] item_value = checkValue(value_temp,insert_validate,row,param,titleRow); if(null!=item_value&&0!=item_value.length&&"1".equals(item_value[0])){ //校验能够保存 value_temp=item_value[1]; }else if(null!=item_value&&0!=item_value.length&&"0".equals(item_value[0])){ message="导入失败<br/>"+item_value[1]; com.haiyisoft.ep.log.LogUtil.getAppLoger().error(message); value[0]="0"; value[1]=item_value[1]; return value; } //假设是返回值 if("Y".equals(excelItem.getFiledExcelcodeIsreturn())){ value[0]="1"; value[1]=value_temp; } paramsList.addParam("st"+j, value_temp); }else if(null!=fieldExtend&&!"".equals(fieldExtend)){ DropBeanUtil util = new DropBeanUtil() ; int position= getCellPosition(titleRow,excelItem.getFiledName()); if(-1!=position){ //用来验证时候校验 value_temp= this.getValue((Cell) row.getCell(position)); String dropName = util.getDropLabel(fieldExtend, value_temp); //校验 String[] item_value = checkValue(dropName,insert_validate,row,param,titleRow); if(null!=item_value&&0!=item_value.length&&"1".equals(item_value[0])){ //校验能够保存 dropName=item_value[1]; }else if(null!=item_value&&0!=item_value.length&&"0".equals(item_value[0])){ message="导入失败<br/>"+item_value[1]; com.haiyisoft.ep.log.LogUtil.getAppLoger().error(message); value[0]="0"; value[1]=item_value[1]; return value; } //假设是返回值 if("Y".equals(excelItem.getFiledExcelcodeIsreturn())){ value[0]="1"; value[1]=dropName; } paramsList.addParam("st"+j, dropName); }else{ message="导入失败<br/>"+message; com.haiyisoft.ep.log.LogUtil.getAppLoger().error("excel未找到有该列("+excelItem.getFiledName()+")"); value[0]="0"; value[1]="excel未找到有该列("+excelItem.getFiledName()+")"; return value; } }else{ int position= getCellPosition(titleRow,excelItem.getFiledName()); if(-1!=position){ //用来验证时候校验 value_temp= this.getValue((Cell) row.getCell(position)); if(null==value_temp){ value_temp=""; } //校验 String[] item_value = checkValue(value_temp,insert_validate,row,param,titleRow); if(null!=item_value&&0!=item_value.length&&"1".equals(item_value[0])){ //校验能够保存 value_temp=item_value[1]; }else if(null!=item_value&&0!=item_value.length&&"0".equals(item_value[0])){ message="导入失败<br/>"+item_value[1]; com.haiyisoft.ep.log.LogUtil.getAppLoger().error(message); value[0]="0"; value[1]=item_value[1]; return value; } //假设是返回值 if("Y".equals(excelItem.getFiledExcelcodeIsreturn())){ value[0]="1"; value[1]=value_temp; } paramsList.addParam("st"+j, value_temp); }else{ //假设都没有,推断验证列,假设验证列有方法运行方法 if(null!=insert_validate&&!"N".equals(insert_validate)){ //校验 String[] item_value = checkValue("",insert_validate,row,param,titleRow); if(null!=item_value&&0!=item_value.length&&"1".equals(item_value[0])){ //校验能够保存 value_temp=item_value[1]; }else if(null!=item_value&&0!=item_value.length&&"0".equals(item_value[0])){ message="导入失败<br/>"+item_value[1]; com.haiyisoft.ep.log.LogUtil.getAppLoger().error(message); value[0]="0"; value[1]=item_value[1]; return value; } //假设是返回值 if("Y".equals(excelItem.getFiledExcelcodeIsreturn())){ value[0]="1"; value[1]=value_temp; } paramsList.addParam("st"+j, value_temp); }else{ message="导入失败<br/>"+message; com.haiyisoft.ep.log.LogUtil.getAppLoger().error(message); value[0]="0"; value[1]="excel未找到有该列("+excelItem.getFiledName()+")"; return value; } } } } } } //插入数据库 String sql="insert into "+sql_table+"("+sql_name+")"+" values("+sql_value+")" ; JPAUtil.executeNativeUpdate(sql,paramsList); return value; } }