SSM框架poi实现Excel导入

第一次撸项目,使用SSM框架,需要用Excel导入学生信息,花了很长的时间,特此记录下来,分享给大家,有什么问题希望不要见怪,本人是刚入门的小白。

首先看一项目结构

image

一、pojo下定义两个实体类,一个是对于excel文件,解析它的数据(ExcelBean),另一个是导入数据库表的实体类(student)
ExcelBean.java

import org.apache.poi.xssf.usermodel.XSSFCellStyle;
 
public class ExcelBean implements java.io.Serializable {  
    private String headTextName;//列头(标题)名  
    private String propertyName;//对应字段名  
    private Integer cols;//合并单元格数  
    private XSSFCellStyle cellStyle;  
      
    public ExcelBean(){  
          
    }  
    public ExcelBean(String headTextName, String propertyName){  
        this.headTextName = headTextName;  
        this.propertyName = propertyName;  
    }  
      
    public ExcelBean(String headTextName, String propertyName, Integer cols) {  
        super();  
        this.headTextName = headTextName;  
        this.propertyName = propertyName;  
        this.cols = cols;  
    }   
      
    public String getHeadTextName() {  
       return headTextName;  
   }  
 
   public void setHeadTextName(String headTextName) {  
       this.headTextName = headTextName;  
   }  
 
   public String getPropertyName() {  
       return propertyName;  
   }  
 
   public void setPropertyName(String propertyName) {  
       this.propertyName = propertyName;  
   }  
 
   public Integer getCols() {  
       return cols;  
   }  
 
   public void setCols(Integer cols) {  
       this.cols = cols;  
   }  
 
   public XSSFCellStyle getCellStyle() {  
       return cellStyle;  
   }  
 
   public void setCellStyle(XSSFCellStyle cellStyle) {  
       this.cellStyle = cellStyle;  
   }  
}  

student.java

public class Student {
    //用户id
    private Long id;
    //用户登录名
    private String username;
    //用户密码
    private String password;
    private String classname;
    private  String num;

    public Long getId(String stringCellValue) {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }


    public String getNum() {
        return num;
    }

    public void setNum(String num) {
        this.num = num;
    }

    public void setUserName(String valueOf) {
        this.username = username == null ? null : username.trim();
    }

    public String getClassname() {
        return classname;
    }

    public void setClassname(String classname) {
        this.classname = classname;
    }
}

二、定义mapper文件(SSM里面就是这种结构,相当于DAO文件一样)。
StudentMapper.java

public interface StudentMapper {
    Student login(String username);
    int deleteByPrimaryKey(Long id);
     int insert(Student record);
    int insertSelective(Student record);
    Student selectByPrimaryKey(Long id);
    int updateByPrimaryKeySelective(Student record);
    int updateByPrimaryKey(Student record);
    void insertInfoBatch(List<Student> list);
}

StudentMapper.xml

 <mapper namespace="cn.ds.mapper.StudentMapper">


    <resultMap type="cn.ds.pojo.Student" id="BaseResultMap">
        <id column="id" property="id" />
        <result column="username" property="username" />
        <result column="password" property="password" />
        <result column="classname" property="classname"  />
        <result column="num" property="num"  />
    </resultMap>
    <sql id="Base_Column_List" >
      id, username, password,classname,num
  </sql>
    <!-- 用户登录的方法 id与方法名中相同  持久层-->
    <select id="login" parameterType="cn.ds.pojo.Student" resultType="Student">
        select * from student where username = #{username}
    </select>
    <insert id="insertInfoBatch" parameterType="java.util.List">
        insert into student (id, username, password,classname,num)
        values
        <foreach collection="list" item="item" index="index" separator=",">
            (#{id,jdbcType=INT},
            #{userName,jdbcType=VARCHAR},
            #{password,jdbcType=VARCHAR} ,
            #{classname,jdbcType=VARCHAR},
            #{num,jdbcType=VARCHAR})
        </foreach>
    </insert>
    <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="Long"  >
        select *from student
        where id = #{id}
    </select>
    <insert id="insert" parameterType="cn.ds.pojo.Student" >
    insert into Student (id, username, password,classname,num)
    values (#{id}, #{username}, #{password},
            #{classname}, #{num})
  </insert>
    <update id="updateByPrimaryKey" parameterType="cn.ds.pojo.Student" >
    update student
    set username = #{username},
      password = #{password},
            classname = #{classname},
      num = #{num}
    where id = #{id}
  </update>
</mapper>

三、util下ExcelUtils工具类(也就是解析EXCEL文件,判断EXCEL的类型以及数据的类型)


public class ExcelUtils {

private final static Stringexcel2003L =".xls";    //2003- 版本的excel

    private final static Stringexcel2007U =".xlsx";  //2007+ 版本的excel

    /**

    * 描述:获取IO流中的数据,组装成List<List<Object>>对象

    * @param in,fileName

    * @return

    * @throws IOException

*/

    public  List>getBankListByExcel(InputStream in,String fileName)throws Exception{

List> list =null;

        //创建Excel工作薄

        Workbook work =this.getWorkbook(in,fileName);

        if(null == work){

throw new Exception("创建Excel工作薄为空!");

        }

Sheet sheet =null;  //页数

        Row row =null;  //行数

        Cell cell =null;  //列数

        list =new ArrayList>();

        //遍历Excel中所有的sheet

        for (int i =0; i < work.getNumberOfSheets(); i++) {

sheet = work.getSheetAt(i);

            if(sheet==null){continue;}

//遍历当前sheet中的所有行

            for (int j = sheet.getFirstRowNum(); j <= sheet.getLastRowNum(); j++) {

row = sheet.getRow(j);

                if(row==null||row.getFirstCellNum()==j){continue;}

//遍历所有的列

                List li =new ArrayList();

                for (int y = row.getFirstCellNum(); y < row.getLastCellNum(); y++) {

cell = row.getCell(y);

                    li.add(this.getValue(cell));

                }

list.add(li);

            }

}

return list;

    }

/**

* 描述:根据文件后缀,自适应上传文件的版本

    * @param inStr,fileName

    * @return

    * @throws Exception

*/

    public  WorkbookgetWorkbook(InputStream inStr,String fileName)throws Exception{

Workbook wb =null;

        String fileType = fileName.substring(fileName.lastIndexOf("."));

        if(excel2003L.equals(fileType)){

wb =new HSSFWorkbook(inStr);  //2003-

        }else if(excel2007U.equals(fileType)){

wb =new XSSFWorkbook(inStr);  //2007+

        }else{

throw new Exception("解析的文件格式有误!");

        }

return wb;

    }

/**

* 描述:对表格中数值进行格式化

    * @param cell

    * @return

    */

    //解决excel类型问题,获得数值

    public  StringgetValue(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");

                    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

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;

            default:

value = cell.getStringCellValue().toString();

        }

if("null".endsWith(value.trim())){

value="";

        }

return value;

    }

}

四、实现service接口
StudentServiceImpl.java

@Service
public class StudentServiceImpl implements StudentService {
    @Autowired
    private StudentMapper studentmapper;
    public String ajaxUploadExcel(HttpServletRequest request,HttpServletResponse response){
        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;

        MultipartFile file = multipartRequest.getFile("file");

        System.out.println("得到数据文件");
        if(file.isEmpty()){
            try {
                throw new Exception("文件不存在!");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        InputStream in =null;
        try {
            in = file.getInputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("加载流");
        List<List<Object>> listob = null;
        try {
            System.out.println("加载流");
            listob = new ExcelUtils().getBankListByExcel(in,file.getOriginalFilename());
        } catch (Exception e) {
            e.printStackTrace();
        }

        //该处可调用service相应方法进行数据保存到数据库中,现只对数据输出
        for (int i = 0; i < listob.size(); i++) {
            List<Object> lo = listob.get(i);
            System.out.println("遍历" + listob.get(i));
            Student vo = new Student();
            Student j = null;

            try {
                //j = studentmapper.selectByPrimaryKey(Long.valueOf());
                j = studentmapper.selectByPrimaryKey(Long.valueOf(String.valueOf(lo.get(0))));
            } catch (NumberFormatException e) {
                // TODO Auto-generated catch block
                System.out.println("没有新增");
            }

            vo.setId(Long.valueOf(String.valueOf(lo.get(0))));
            vo.setUsername(String.valueOf(lo.get(1)));
            vo.setPassword(String.valueOf(lo.get(2)));
            vo.setClassname(String.valueOf(lo.get(3)));
            vo.setNum(String.valueOf(lo.get(4)));
            if(j == null)
            {
                studentmapper.insert(vo);
            }
            else
            {
                studentmapper.updateByPrimaryKey(vo);
            }
        }
        return "success";
    }
}

五、控制层Controller
StudentController.java

@ResponseBody
    @RequestMapping(value="ajaxUpload",method={RequestMethod.GET,RequestMethod.POST})
    public String ajaxUploadExcel(HttpServletRequest request,HttpServletResponse response) throws Exception {
        System.out.println("这是请求");
         return studentService.ajaxUploadExcel(request, response);
    }

六、jsp页面

<form action="<%=basePath%>/student/ajaxUpload.do" method="post" enctype="multipart/form-data">
    请选择Excel:<input type="file" name="file">
    <input type="submit" name="提交">
</form>

七、实现图片


image.png

image.png

image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,193评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,306评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,130评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,110评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,118评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,085评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,007评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,844评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,283评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,508评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,395评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,985评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,630评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,797评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,653评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,553评论 2 352

推荐阅读更多精彩内容

  • 打开微博热搜,头条便是医院凌晨公布监控截图:产妇两次下跪与家属沟通。看完文章才知道,这是2017年8月31日,榆林...
    marinayu阅读 1,341评论 1 0
  • 从阿伦图灵首创人工智能,以机器炸弹bomem?解决机器,到深海打败国际象棋冠军,到alfago在围棋上打败围棋大师...
    蘇_Suu阅读 353评论 0 0
  • 贪心问题——求最值问题 贪心问题一般都是求解最多或最少的最值问题,每一步总是得到当前最优解(局部最优解),若是想得...
    XDgbh阅读 311评论 0 0
  • 前天做了一个噩梦 这几天心情都特别低沉 感觉在一个特别脆弱的时期 我仿佛又开始习惯依赖 我有点讨厌这样的不坚强 但...
    鱼木易阅读 100评论 0 0