SpringMVC导入Excule并解析Excule中的数据以及下载Excule模板

把Excule导入,并把Excule中的数据解析出来,包装成对象的属性,保存在数据库中;

Excule中的数据:

1.web.xml的配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <servlet>
        <servlet-name>Dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:ApplicationContext.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!-- 文件上传 -->
    <!--
     1.在web.xml中添加listener
     2.在web.xml中添加spring框架启动的加载的配置文件路径:
     -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:ApplicationContext.xml</param-value>
    </context-param>
</web-app>

2.ApplicationContext.xml中的配置

<!-- 支持上传文件 -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> </bean>  

3.文件上传的JSP以及JS判断上传的文件是否为指定格式:

①:form表单

<form enctype="multipart/form-data" action="${paths}/upload.do" method="post" onchange="selectFile(this)">
                    <p style="font-size:16px;">请选择正确的excel文件上传</p>
                    <input id="txt" class="input" type="text" disabled="disabled" value="文件域" name="txt">
                    <input type="button" onclick="file.click()" value="上传文件" onmousemove="file.style.pixelLeft=event.x-60;file.style.pixelTop=this.offsetTop;">
                    <input id="file1" class="files" type="file" hidefocus="" size="1" style="height:26px;" name="file" onchange="txt.value=this.value">
                    <p style="color:red;">支持的excel格式为:xls、xlsx、xlsb、xlsm、xlst!</p>
                       <input  class="btn btn_ok" type="submit" value="确认">
                </form>

②:JS代码:

function selectFile(fnUpload){
        var filename=document.getElementById("txt").value;
        var mime = filename.toLowerCase().substr(filename.lastIndexOf("."));
        if(!(mime==".xls"||mime==".xlsx"||mime==".xlsb"||mime==".xlsm"||mime==".xlst")){
            alert("请选择正确的格式上传");
        }
    }

4.ExculeUtil类:

package com.bgiseq.Experiment_Center.controller;

import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.CellFormat;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;

public class ExculeUtils {
    /**
     * 下载Excule模板
     *
     * @param output
     * @return
     * @throws IOException
     * @throws WriteException
     */
    public static WritableWorkbook createTemplate(OutputStream output) throws IOException, WriteException {
        WritableWorkbook writableWorkbook = Workbook.createWorkbook(output);
        WritableSheet wsheet = writableWorkbook.createSheet("测试title", 0);

        CellFormat cf = writableWorkbook.getSheet(0).getCell(1, 0).getCellFormat();
        WritableCellFormat wc = new WritableCellFormat();
        // 设置居中
        wc.setAlignment(Alignment.CENTRE);
        // 设置边框线
        // wc.setBorder(Border.ALL, BorderLineStyle.THIN);
        wc.setBackground(jxl.format.Colour.GREEN);// 设置背景颜色
        // Label(x,y,z)其中x代表单元格的第x+1列,第y+1行,
        Label nc1 = new Label(0, 0, "药品编号", wc);
        Label nc0 = new Label(1, 0, "药品名称", wc);
        // 单元格的内容是z
        Label nc2 = new Label(2, 0, "药品厂家", wc);
        Label nc3 = new Label(3, 0, "备注", wc);
        Label nc4 = new Label(4, 0, "创建日期", wc);
        Label nc5 = new Label(5, 0, "修改日期", wc);
        Label nc6 = new Label(6, 0, "删除标志", wc);
        wsheet.addCell(nc0);
        wsheet.addCell(nc1);
        wsheet.addCell(nc2);
        wsheet.addCell(nc3);
        wsheet.addCell(nc4);
        wsheet.addCell(nc5);
        wsheet.addCell(nc6);
        return writableWorkbook;
    }

    /**
     * 解析Excule,并将解析出来的数据保存在list中   * JXL解析(要导入JXL包)
     *
     * @param file 传入一个Excule文件
     * @return
     */
    public static List<String[]> readEcxule(File file) {

        Sheet sheet;
        Workbook book;
        Cell cell1 = null;

        try {
            // file为要读取的excel文件名
            book = Workbook.getWorkbook(file);
            // 获得第一个工作表对象(ecxel中sheet的编号从0开始,0,1,2,3,....)
            sheet = book.getSheet(0);
            int columns = sheet.getColumns();//获取一共有多少列
            int rows = sheet.getRows();//获取一共有多少行
            List<String[]> list = new ArrayList<>();

            // 获取左上角的单元格
            // cell1 = sheet.getCell(0, 0);
            // System.out.println("标题:"+cell1.getContents());
            for (int i = 0; i < rows; i++) {
                String[] vals = new String[columns];

                for (int j = 0; j < columns; j++) {
                    // 获取每一行的单元格
                    cell1 = sheet.getCell(j, i);// (列,行)
                    String contents = cell1.getContents();
                    //将每一行的数据添加的String[]中
                    vals[j] = contents;
                }
                list.add(vals);
            }
            book.close();
            return list;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;

5.T_KitInfo对象类:

public class T_KitInfo {

    private String ID;//试剂盒编号
    private String KitNO;//
    private String KitName;//试剂盒名称
    private String Manufactor;//制造厂
    private String Note;//票据
    private Date CreateTime;//当前时间
    private Date UpdateTime;//修改时间
    private Character flag;//标记
        //getter和setter方法
}    

6.Controller类:

      @RequestMapping(value = "/upload.do")
      public String upload(@RequestParam(value = "file", required = false) MultipartFile file, HttpServletRequest request, ModelMap model) {
          String path = request.getSession().getServletContext().getRealPath("/WebContent/upload");
          String fileName = file.getOriginalFilename();
          try {
          File targetFile=null;
          if(fileName!=null||fileName!=""){
              //用\\.将文件名进行解析
              String[] split = fileName.split("\\.");
              String lastname = split[1];
              //判断文件的后缀名是不是指定的格式
              if("xls".equals(lastname)||"xlsx".equals(lastname)||"xlsb".equals(lastname)||"xlsm".equals(lastname)||"xlst".equals(lastname)){
                  targetFile = new File(path, fileName);
                  if(!targetFile.exists()){
                      targetFile.mkdirs();
                  }
                  //保存文件
                  file.transferTo(targetFile);
                  //调用ExculeUtils类中的解析Excule的方法
                  List<String[]> list = ExculeUtils.readEcxule(targetFile);
                  //遍历得到的list
                  for (int i = 1; i < list.size(); i++) {
                    //因为第一行数据为表头信息,所以不用获取到,i从1开始
                      String[] strings = list.get(i);
                      //将获取到的信息设置为T_KitInfo的属性
                      T_KitInfo t=new T_KitInfo();
                    for (int j = 0; j < strings.length; j++) {
                        String KitNO = strings[0];//药品编号
                        String KitName = strings[1];//药品名称
                        String Manufactor = strings[2];//药品厂家
                        String Note = strings[3];//备注
                        String createDate1 = strings[4];//创建日期
                        //T_KitInfo中的时间对象为Date对象,利用Date工具类对String进行解析,得到date对象
                        Date createDate = DateUtil.getDateFromString(createDate1);
                        String updateDate1 = strings[5];//修改日期
                        Date updateDate = DateUtil.getDateFromString(updateDate1);
                        t.setKitNO(KitNO);
                        t.setKitName(KitName);
                        t.setManufactor(Manufactor);
                        t.setNote(Note);
                        t.setCreateTime(createDate);
                        t.setCreateTime(updateDate);
                    }
                    //调用service层的保存对象的方法
                    service.save(t);
                }

-------------------------------------------------------------------------------------------------------------------------------------------------------  -------------------------------------------------------------------------------------------------------------------------------------------------------

文件下载:

1.jsp信息:

 <a class="import" href="${paths}/sjdcExcel">模板下载</a>

2.controller类:

 @RequestMapping("sjdcExcel")
        public void download(HttpServletRequest request, HttpServletResponse response) throws IOException, BiffException, WriteException {
            String filename="试剂盒信息";
              response.setHeader("Content-Disposition", "attachment; filename=SJHMessage.xls");
            WritableWorkbook writableWorkbook = ExculeUtils.createTemplate(response.getOutputStream());
            writableWorkbook.write();
            writableWorkbook.close();
        }
时间: 2024-10-20 17:21:01

SpringMVC导入Excule并解析Excule中的数据以及下载Excule模板的相关文章

模态方法解析字典中的数据

通过模态的方法把数组中的字典中的数组放到一个数组中,并可以用点语法实现调用 1.解析数据: 代码: NSString *path =[[NSBundle mainBundle] pathForResource:@"StudentArr" ofType:@"plist"]; self.stuArr =[NSMutableArray arrayWithContentsOfFile:path]; 用self.stuArr 来接收收据,这个数组里面全是字典 2.接下来用fo

使用fastJSON解析HashMap中的数据

import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; public class Demo { public static void main(Stri

【POI】导出excel文件,不生成中间文件,直接将内存中的数据创建对象下载到浏览器

不是从InputStream中read,然后outputStream再write @RequestMapping("download4Excel") public void download4Excel(HttpServletResponse response){ XSSFWorkbook workbook = new XSSFWorkbook(); XSSFSheet sheet = workbook.createSheet("测试Sheet"); sheet.s

将一个数据库中的数据导入另一个数据库(DB2)

将一个数据库中的数据导入另一个数据库(DB2) 我这里举得例子是使用的DB2数据库,其他数据库思路也是这样啦! 1.从db2 数据库中将表中的数据导入本地的excel中 export to d:\mytest.xls of del modified by nochardel coldel0x09 select * from IOUT_BUSI_YWDJMX_TEMP 2.在需要导入的数据库建立一个临时表 --创建临时表 CREATE TABLE NBADV.l_hzcitywa ( fhcode

SpringMVC 实现POI读取Excle文件中数据导入数据库(上传)、导出数据库中数据到Excle文件中(下载)

读取Excle表返回一个集合: package com.shiliu.game.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Field; import java.lang.reflect

【SpringMVC学习06】SpringMVC中的数据校验

这一篇博文主要总结一下springmvc中对数据的校验.在实际中,通常使用较多是前端的校验,比如页面中js校验,对于安全要求较高的建议在服务端也要进行校验.服务端校验可以是在控制层conroller,也可以是在业务层service,controller校验页面请求的参数的合法性,在服务端控制层conroller的校验,不区分客户端类型(浏览器.手机客户端.远程调用):service层主要校验关键业务参数,仅限于service接口中使用的参数.这里主要总结一下何如使用springmvc中contr

[SpringMVC]SpringMVC学习笔记一: springmvc原理及实例解析.

前言:今天来回顾下SpringMVC的开发原理, 使用图文并茂的方式 来解析其中的内幕, 我相信懂了其中的运行机制后, 对于面试中SpringMVC大家都可以说so easy了. 一, 图示法 第二张图的前端控制器应为DispatcherServlet. 看完图中的整体流程后, 我们再使用实际代码来说明每一步需要处理 的事情. 二. 代码示例 第一步: 用户发送请求, 前端控制器DispatcherServlet开始处理.在web.xml中配置前端控制器: 1 <servlet> 2 <

CSS控制XML与通过js解析xml然后通过html显示xml中的数据

使用CSS控制XML的显示 book.css bookname{ display:block;color:Red} author{ display:block;font-style:italic} price{ display:block;colo book.xml <?xml version="1.0" encoding="GB2312" ?> <?xml-stylesheet type="text/css" href=&qu

SpringMVC -- @ModelAttribute/视图,视图解析器/国际化

@ModelAttribute 这个注解注释比较多.. 我自己都有点看懵逼了... 还是在原来的例子上的Demo.... @ModelAttribute 和视图解析,以及国际化 我都写一起了,就不分开了.. package com.springmvc.handlers; import com.springmvc.model.User; import com.springmvc.model.User2; import org.springframework.stereotype.Controlle