起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 19569|回复: 23

[分享] 在WeX5中上传excel至数据库库表

  [复制链接]

377

主题

2594

帖子

5117

积分

论坛元老

Rank: 8Rank: 8

积分
5117
QQ
发表于 2016-3-3 16:00:48 | 显示全部楼层 |阅读模式
最近在做一个考试app,需要用户上传题库到库表
题库的结构如下:

捕获.PNG


上传文件的界面如下图所示:
捕获.PNG

长春鱼熊企业管理咨询有限公司



X5开发出入库培训视频
(出处: 起步论坛)

377

主题

2594

帖子

5117

积分

论坛元老

Rank: 8Rank: 8

积分
5117
QQ
 楼主| 发表于 2016-4-30 21:15:56 | 显示全部楼层
kenminkajp 发表于 2016-4-30 17:31
及时雨,我来好好消化要是把文件结构抓个图,就更好了

代码这个东西,最重要的还是自己消化
有个人给指个线索已经很不错了
长春鱼熊企业管理咨询有限公司



X5开发出入库培训视频
(出处: 起步论坛)
回复 支持 1 反对 1

使用道具 举报

377

主题

2594

帖子

5117

积分

论坛元老

Rank: 8Rank: 8

积分
5117
QQ
 楼主| 发表于 2016-3-3 17:14:07 | 显示全部楼层
我利用这个方法向数据库中插入了16000条数据,用时不到十秒。记录再多会有内存溢出
baas和baasServer需要引入相应的jar包,poi-bin-3.13-20150929 可以在网上搜到
另外还需要 xbean.jar
长春鱼熊企业管理咨询有限公司



X5开发出入库培训视频
(出处: 起步论坛)
回复 支持 1 反对 0

使用道具 举报

377

主题

2594

帖子

5117

积分

论坛元老

Rank: 8Rank: 8

积分
5117
QQ
 楼主| 发表于 2016-3-3 16:05:37 | 显示全部楼层
前端 :

参考起步案例,$model/UI2/demo/actions/process/invokeAction/mainActivity.w中的 form表单提交的案例

这里也是采用form表单提交
传到后台去 2个参数(storeFileName和examBankID)和一个二进制文件

界面上放一个form(html),两个input 、一个input type=file和一个button按钮
相关的html源码如下:
  1.     <form action="/baas/fishbear/fishbearWeixin/uploadPic" xid="postForm"  accept="application/json" enctype="multipart/form-data" target="postResultIframe" class="form-horizontal container-fluid" method="post"><div class="form-group" xid="formGroup9">
  2.   
  3.    <div class="col-sm-2" xid="col37">
  4.     <label class="control-label" xid="controlLabel15">file</label></div>
  5.    <div class="col-sm-10" xid="col38">
  6.     <input class="form-control" xid="uploadFile" name="file" type="file"></input></div> </div>
  7.   <div class="form-group" xid="formGroup8">
  8.    <div class="col-sm-2" xid="col24">
  9.     <label class="control-label" xid="controlLabel14"><![CDATA[storeFileName]]></label></div>
  10.    <div class="col-sm-10" xid="col25">
  11.     <input class="form-control" xid="uploadFileName" name="storeFileName"></input></div> </div><div class="form-group" xid="formGroup1">
  12.    <div class="col-sm-2" xid="col2">
  13.     <label class="control-label" xid="controlLabel1"><![CDATA[examBankID]]></label></div>
  14.    <div class="col-sm-10" xid="col1">
  15.     <input class="form-control" xid="input1" name="examBankID"></input></div> </div><div class="form-group" xid="formGroup19">
  16.    <div class="col-sm-3" xid="col46">
  17.     <a component="$UI/system/components/justep/button/button" class="btn btn-success form-control" label="上传文件(Post)" xid="postBtn" onClick="postBtnClick">
  18.      <i xid="i14"></i>
  19.      <span xid="span16">上传文件(Post)</span></a> </div> </div>
  20.   <div class="form-group" xid="formGroup10" style="display:none;">
  21.    <div class="col-sm-2" xid="col45">
  22.     <label class="control-label" xid="controlLabel17">接收返回内容</label></div>
  23.    <div class="col-sm-10" xid="col42">
  24.     <iframe src="" xid="postResultIframe" name="postResultIframe" width="100%" height="100px"></iframe></div> </div>
  25.   </form>
复制代码



长春鱼熊企业管理咨询有限公司



X5开发出入库培训视频
(出处: 起步论坛)
回复 支持 反对

使用道具 举报

377

主题

2594

帖子

5117

积分

论坛元老

Rank: 8Rank: 8

积分
5117
QQ
 楼主| 发表于 2016-3-3 16:18:27 | 显示全部楼层
可以利用input type=file的accept属性对用户看到的文件做一些过滤,

比如:要求用户选择excel文件可以: accept="application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
要求用户选择图片文件可以: accept="image/*"
当然,完全避免用户选择错误文件需要在用户选择后增加判断,可以在 input type=file的onChange事件中(检查用户是否选择了图片)
  1.         Model.prototype.file1Change = function(event){
  2.        //从选取文件对话框返回后,检查用户是否选择了文件,是否选择了图片文件
  3.         if(!event.target.files){    //如果客户没有选择相关文件,直接返回
  4.              return;
  5.         }
  6.          var $inputImage = $( this.getElementByXid('inputImage'));   //用jQuery拿到input标签
  7.          var file = event.target.files[0];       //拿到用户选择的文件

  8.          if (/^image\/\w+$/.test(file.type)) {     //如果是图片文件
  9.             
  10.                     
  11.                      
  12.           } else {    //如果用户选的的不是图片文件
  13.                     justep.Util.hint('请选择图片文件!');
  14.                     $inputImage.val('');
  15.            }
  16.          
  17.         };
复制代码
长春鱼熊企业管理咨询有限公司



X5开发出入库培训视频
(出处: 起步论坛)
回复 支持 反对

使用道具 举报

377

主题

2594

帖子

5117

积分

论坛元老

Rank: 8Rank: 8

积分
5117
QQ
 楼主| 发表于 2016-3-3 16:58:49 | 显示全部楼层
用户填写完examBankID和storeFileName
点击上传文件按钮的js代码
  1.                 var form = this.getElementByXid("postForm");                                                //拿到form表单的js对象

  2.                 var postResultIframe = this.getElementByXid("postResultIframe");     //拿到用于显示返回结果的iFrame组件的js对象
  3.         form.attributes["action"].value = require.toUrl("/baas/fishbear/fishbearWeixin/myUploadPic?");
  4.         // 在form目标iframe的onload事件中以回调方式获取返回值
  5.                 //var parentWindow = window;
  6.                 $(postResultIframe).load(function(){
  7.                         var iframeWindow = this.contentWindow;
  8.                         iframeWindow.setTimeout(function() {
  9.                                 var doc = iframeWindow.document.XMLDocument ? iframeWindow.document.XMLDocument : iframeWindow.document;
  10.                                 var returnJson=JSON.parse($(doc).text());
  11.                                 // 判断动作调用是否成功
  12.                                
  13.                                 if (returnJson.result == "成功") {
  14.                                         justep.Util.hint("附件上传成功");

  15.                                 } else {
  16.                                         justep.Util.hint("上传失败");

  17.                                 }
  18.                         }, 1);
  19.                 });
  20.        
  21.                 // 提交表单
  22.                 $(form).submit();
复制代码



长春鱼熊企业管理咨询有限公司



X5开发出入库培训视频
(出处: 起步论坛)
回复 支持 反对

使用道具 举报

377

主题

2594

帖子

5117

积分

论坛元老

Rank: 8Rank: 8

积分
5117
QQ
 楼主| 发表于 2016-3-3 17:10:15 | 显示全部楼层
在baas中的对应的java建立自定义的action
怎么建立和定义action请参考起步官方视频WeX5后台调用
  1.         //接收前台传过来的excel,存到数据库
  2.         public static JSONObject myUploadExcel(JSONObject params, ActionContext context) throws SQLException, NamingException {
  3.                 HttpServletRequest request = (HttpServletRequest)context.get(ActionContext.REQUEST);
  4.                 HashMap<String,String> fields = new HashMap<String,String>();        //用于存放前台传过来的input参数
  5.         InputStream is = null;                                                                                        //用于存放前台传过来的二进制文件输入流
  6.         JSONObject ret=new JSONObject();
  7.                 FileItemFactory factory = new DiskFileItemFactory();
  8.                 ServletFileUpload upload = new ServletFileUpload(factory);
  9.                 String values="";
  10.              
  11.                 try {
  12.                    
  13.                                 @SuppressWarnings("unchecked")
  14.                                 List<FileItem>  items = upload.parseRequest(request);        //把用form提交过来的request转换为list

  15.                     Iterator<FileItem> iter = items.iterator();
  16.                     while (iter.hasNext()) {
  17.                         FileItem item = (FileItem) iter.next();
  18.                         if (!item.isFormField()) {                                                //如果是二进制文件输入流
  19.                             is = item.getInputStream();               
  20.                         }else{                                                                                        //如果是input参数,把input参数放到fields的map对象里面
  21.                                         String name = item.getFieldName();
  22.                                 String value = URLDecoder.decode(item.getString(), "UTF-8").replaceAll("\\\", "/");
  23.                                
  24.                                     fields.put(name, value);        //把表单域的名字和值放到params中
  25.                             System.out.println(fields.get("fileName"));
  26.                           }
  27.                       }
  28.                     if(is==null || fields.get("fileName")==null||fields.get("fileName").length()<=0){        //如果文件为空或者文件名或者examBankID为空,则返回上传文件失败
  29.                                     ret.put("result", "失败");
  30.                     }else{
  31.                            
  32.                                     // 把excel内容传到数据库中
  33.                             Workbook workbook = org.apache.poi.ss.usermodel.WorkbookFactory.create(is);           //将二进制文件输入流转换为excelWorkbook(兼容2003和2007格式)

  34.                             Sheet sheet=workbook.getSheetAt(0);        //拿到excel工作簿中的第一个sheet

  35.                             int rows=sheet.getPhysicalNumberOfRows();        //计算sheet中有多少行
  36.                             for(int i=1;i<rows;i++){                   //遍历sheet中的行,从第二行开始
  37.                                     org.apache.poi.ss.usermodel.Row  row=sheet.getRow(i);        //拿到第i行
  38.                                     if(row!=null){                                                                //拼要插到sql语句中的值,因为是mySql所以简单些
  39.                                             values+="(UUID(),0,'fExamBankID',"+i+",'"+row.getCell(0)+"','"+row.getCell(1)+"','','"+row.getCell(6)+"','"+row.getCell(2)+"','"+row.getCell(3)+"','"+row.getCell(4)+"','"+row.getCell(5)+"'),";
  40.                
  41.                                     }
  42.                                    
  43.                             }
  44.                             values=values.substring(0, values.length()-1);                        //去掉最后的逗号
  45.                             values="insert into examquestion (fID,version,fExamBankID,fNO,fType,fQuestion,fQuestionPic,fCorrectAnswer,fOptionA,fOptionB,fOptionC,fOptionD)"+
  46.                                             "values"+ values;
  47.                             Connection conn= context.getConnection("fishbearWeixin");                //拿到数据库连接
  48.                             PreparedStatement pstmt = conn.prepareStatement(values);                //执行插入
  49.                             pstmt.executeUpdate();
  50.                              pstmt.close();

  51.                     }
  52.                             is.close();
  53.                                     ret.put("result", "成功");
  54.                 } catch (FileUploadException e) {
  55.                     e.printStackTrace();
  56.                 } catch (SQLException e) {
  57.                     e.printStackTrace();
  58.                 } catch (Exception e) {
  59.                     e.printStackTrace();
  60.                 }
  61.                 return ret;
  62.         }
复制代码
长春鱼熊企业管理咨询有限公司



X5开发出入库培训视频
(出处: 起步论坛)
回复 支持 反对

使用道具 举报

377

主题

2594

帖子

5117

积分

论坛元老

Rank: 8Rank: 8

积分
5117
QQ
 楼主| 发表于 2016-3-3 17:15:07 | 显示全部楼层
另外再附一个上传图片或其他附件到服务器的java action
  1.         //接收前台传过来的图片,存到指定位置
  2.         public static JSONObject myUploadPic(JSONObject params, ActionContext context) throws SQLException, NamingException, IOException {
  3.                 HttpServletRequest request = (HttpServletRequest)context.get(ActionContext.REQUEST);
  4.                 HashMap<String,String> fields = new HashMap<String,String>();
  5.         InputStream is = null;
  6.         JSONObject ret=new JSONObject();
  7.                 FileItemFactory factory = new DiskFileItemFactory();
  8.                 ServletFileUpload upload = new ServletFileUpload(factory);
  9.                 FileOutputStream fos=null;
  10.                 try {
  11.                    
  12.                                 @SuppressWarnings("unchecked")
  13.                                 List<FileItem>  items = upload.parseRequest(request);

  14.                     Iterator<FileItem> iter = items.iterator();
  15.                     while (iter.hasNext()) {
  16.                         FileItem item = (FileItem) iter.next();
  17.                         if (!item.isFormField()) {
  18.                             is = item.getInputStream();
  19.                         }else{
  20.                                         String name = item.getFieldName();
  21.                                 String value = URLDecoder.decode(item.getString(), "UTF-8").replaceAll("\\\", "/");
  22.                                
  23.                                     fields.put(name, value);        //把表单域的名字和值放到params中
  24.                           // System.out.println(fields.get("fileName"));
  25.                           }
  26.                       }
  27.                     if(is==null || fields.get("storeFileName")==null||fields.get("storeFileName").length()<=0){
  28.                                     ret.put("result", "失败");
  29.                     }else{
  30.                             // 保存文件
  31.                    
  32.                                     String X5Base = System.getProperty("user.dir").substring(0, System.getProperty("user.dir").lastIndexOf("\"));
  33.                                     X5Base=X5Base+"\\model\\UI2\\fishbearWeixin\\imgWH";
  34.                                                 String storePath = X5Base + File.separator + fields.get("examBankID");
  35.                                         File storeDir = new File(storePath);
  36.                                         if(!(storeDir.exists() && storeDir.isDirectory())){
  37.                                                 storeDir.mkdirs();
  38.                                         }
  39.                                         
  40.                                         File toStoreFile = new File(storePath + File.separator + fields.get("storeFileName"));
  41.                          
  42.                                              fos = new FileOutputStream(toStoreFile);
  43.                                             copyStream(is,fos,1024);        //将is中的二进制流写到fos文件中
  44.                                            
  45.                                     fos.close();
  46.                                     is.close();
  47.                                             ret.put("result", "成功");
  48.                     }
  49.        
  50.                 } catch (FileUploadException e) {
  51.                     e.printStackTrace();
  52.                 } catch (SQLException e) {
  53.                     e.printStackTrace();
  54.                 } catch (Exception e) {
  55.                     e.printStackTrace();
  56.                 }
  57.                 return ret;

  58.         }
  59.        
  60.        
  61.         private static long copyStream(InputStream input, OutputStream output, int bufferSize) throws IOException {
  62.                 byte[] buffer = new byte[bufferSize];
  63.                 int readCount = 0;
  64.                 long allCount = 0;
  65.                 while (true) {
  66.                         readCount = input.read(buffer);
  67.                         if (readCount > 0) {
  68.                                 output.write(buffer, 0, readCount);
  69.                                 output.flush();
  70.                                 allCount += readCount;
  71.                         } else
  72.                                 break;
  73.                 }
  74.                 return allCount;
  75.         }
复制代码
长春鱼熊企业管理咨询有限公司



X5开发出入库培训视频
(出处: 起步论坛)
回复 支持 反对

使用道具 举报

33

主题

213

帖子

1158

积分

金牌会员

Rank: 6Rank: 6

积分
1158
QQ
发表于 2016-3-3 17:18:47 | 显示全部楼层
太厉害了,赞赞
回复 支持 反对

使用道具 举报

73

主题

375

帖子

1002

积分

金牌会员

Rank: 6Rank: 6

积分
1002
QQ
发表于 2016-3-9 20:38:54 | 显示全部楼层
这不是一般的功力!赞
回复 支持 反对

使用道具 举报

8

主题

28

帖子

102

积分

初级会员

Rank: 2

积分
102
发表于 2016-3-23 15:40:37 | 显示全部楼层
不错
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2024-3-29 09:20 , Processed in 0.096153 second(s), 27 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表