读书人

利用struts的FormFile下传excel文件

发布时间: 2012-10-25 10:58:57 作者: rapoo

利用struts的FormFile上传excel文件,并导入插入数据库
<%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><script language="javascript">function myFormCheck(theform){ if(theform.theFile.value=="") { alert("请点击浏览按钮,选择您要上传的文件!") theform.theFile.focus; return (false); } else { str= theform.theFile.value; strs=str.toLowerCase(); lens=strs.length; extname=strs.substring(lens-4,lens); if(extname!=".xls") { alert("请选择excel文件!") return (false); } }}</script><meta http-equiv="Content-Type" content="text/html; charset=GBK"><title>Insert title here</title></head><body> <form name="uploadform" action="importdata.do" enctype="multipart/form-data" method=post onsubmit="return myFormCheck(this)"> <input type="file" name="theFile"> <input type="submit" value="导入"> </form></body></html>

?

其中用js从客户端判断了下文件的类型。在服务端同样判断了类型,这是防止某些人绕过js,直接上传非excel文件。其中调用action  importdata.do ,在struts-config.xml配置如下:<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd"><struts-config>  <data-sources />  <form-beans >    <form-bean name="uploadForm" type="com.alihoo.struts.form.UploadForm" />  </form-beans>  <global-exceptions />  <global-forwards >    <forward name="import_data_error" path="/importJsp.jsp" />    <forward name="success" path="/success.jsp" />  </global-forwards>  <action-mappings >    <action      attribute="uploadForm"      name="uploadForm"      path="/importdata"      scope="request"      type="com.alihoo.struts.action.ImportdataAction"      validate="false" />  </action-mappings>  <message-resources parameter="com.alihoo.struts.ApplicationResources" /></struts-config>因为是上传文件,request应该是得不到数据的,所以用了一个UploadForm,其中只有一个成员FormFile theFile.注意,theFile不是随便命名的,是跟上传页面中<input type="file" name="theFile">的name一样的。其中UploadForm代码如下:package com.alihoo.struts.form;import org.apache.struts.action.ActionForm;import org.apache.struts.upload.FormFile;public class UploadForm extends ActionForm ...{    private FormFile theFile;    public FormFile getTheFile() ...{        return theFile;    }    public void setTheFile(FormFile theFile) ...{        this.theFile = theFile;    }}为了方面测试,都没分什么dao层之类,全部放在aciton中了。这里数据表有exceltable有三个字段,一个id,int型自增,一个username,一个password都是字符型。这里假设excel的数据也是三个字段的,即已经指定id。一般来说不应在excel指定id,里面指定了id是主键,所以有重复记录的时候就终止了,这里都没判断是否有重复id,太麻烦了。那个aciton的具体代码如下:/**//* * Generated by MyEclipse Struts * Template path: templates/java/JavaClass.vtl */package com.alihoo.struts.action;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.SQLException;import java.sql.Statement;import java.util.List;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import jxl.Cell;import jxl.CellType;import jxl.NumberCell;import jxl.Sheet;import jxl.Workbook;import org.apache.struts.action.Action;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionForward;import org.apache.struts.action.ActionMapping;import org.apache.struts.upload.FormFile;import com.alihoo.struts.form.UploadForm;/** *//**  * MyEclipse Struts * Creation date: 04-21-2008 *  * XDoclet definition: * @struts.action path="/importdata" name="uploadForm" scope="request" */public class ImportdataAction extends Action ...{    /**//*     * Generated Methods     */    /** *//**      * Method execute     * @param mapping     * @param form     * @param request     * @param response     * @return ActionForward     */    public ActionForward execute(ActionMapping mapping, ActionForm form,            HttpServletRequest request, HttpServletResponse response) ...{        UploadForm uploadForm = (UploadForm) form;// TODO Auto-generated method stub        FormFile xlsFile=uploadForm.getTheFile();                System.out.println(xlsFile.getFileName());        System.out.println(xlsFile.getContentType());        System.out.println(xlsFile.getFileSize());                                if(!xlsFile.getContentType().equals("application/vnd.ms-excel"))////////////不是excel文件        ...{            System.out.println("类型不对");            return mapping.findForward("import_data_error");                    }        else        ...{            try ...{                if(!importData(xlsFile.getInputStream()))                ...{                                        return mapping.findForward("import_data_error");                }            } catch (FileNotFoundException e) ...{                // TODO Auto-generated catch block                e.printStackTrace();                return mapping.findForward("import_data_error");                        } catch (IOException e) ...{                // TODO Auto-generated catch block                e.printStackTrace();                return mapping.findForward("import_data_error");            }            return mapping.findForward("success");        }                    }    private boolean importData(InputStream is)    ...{      /**//*连接数据库 */        String url = "jdbc:mysql://localhost/exceltest";        String userName = "root";        String password = "850522";        String sql = null;        Connection conn = null;        Statement stmt = null;        try ...{            Class.forName("com.mysql.jdbc.Driver");                    } catch (ClassNotFoundException e) ...{            System.err.print("classNotFoundException");            e.printStackTrace();        }        try ...{            conn = DriverManager.getConnection(url, userName, password);        } catch (SQLException e1) ...{            // TODO Auto-generated catch block            e1.printStackTrace();        }                /**//*获得xls数据,并导入*/        try...{            jxl.Workbook rwb = Workbook.getWorkbook(is);                        /**//*这里假设有多个sheets,若只有一个,则下面没必要用for,直接get(0)*/            int sheets = rwb.getNumberOfSheets();                                              for(int i=0;i<sheets;i++)            ...{                 Sheet rs = rwb.getSheet(i);                 System.out.println("Sheet Name:"+rs.getName());                 int columnNum=rs.getColumns();                 int rowNum=rs.getRows();                 System.out.println("columnNum:"+columnNum);                                 for(int row=0;row<rowNum;row++)                 ...{                     PreparedStatement pstmInsert = conn.prepareStatement("insert into exceltable values(?,?,?)");                     for(int column=0;column<columnNum;column++)                     ...{                         Cell crl=rs.getCell(column,row);                         if(crl.getType()==CellType.NUMBER)                         ...{                              System.out.println(column+1);                             NumberCell numc = (NumberCell)crl;                            pstmInsert.setInt(column+1,(int)numc.getValue());                                                   }                         else                         ...{                             System.out.println(column+1);                             pstmInsert.setString(column+1, crl.getContents());                                                      }                      }                     System.out.println("************");                     pstmInsert.executeUpdate();                                     }            }                                                         rwb.close();                }        catch (Exception e)        ...{            e.printStackTrace();            return false;        }        finally ...{            try ...{                if(stmt!=null)                     stmt.close();                if(conn!=null)                    conn.close();                is.close();/////////关闭输入流            } catch (SQLException e) ...{                e.printStackTrace();            } catch (IOException e) ...{                // TODO Auto-generated catch block                e.printStackTrace();            }        }                return true;            }    }差不多就这样吧,不懂q我,哈哈~

?

读书人网 >其他数据库

热点推荐