poi导入excel文件!(spring+springmvc+mybatis)

这篇博客介绍了如何在Spring MVC项目中使用Apache POI库导入Excel文件。主要步骤包括:准备poi依赖,理解导入流程,前端使用ajax进行文件上传,后端通过工具类解析Excel并保存数据。博主提醒注意文件上传配置、文件格式校验和数据合理性检查。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,准备poi依赖的jar包.这部分不具体说了,看到导入相信你之前肯定研究过导出了.

不明白的童鞋看这篇:点击打开链接,打不开就访问这个址:http://blog.youkuaiyun.com/qq_36074672/article/details/54093319#t1

2,首先你要明确导入excel是怎么回事?具体思路?

a,所谓导入说的通俗易懂点就是文件上传,这里导入excel文件,实际上就是将excel文件解析成你需要的数据(导入是严格有格式要求的,按照导出的格式进行反推.视不同项目而定!需要自己的逻辑!说是没法说清楚的.)

b,说下大体步骤:首先前台点击导入按钮,选择文件,这里博主使用的easyui框架,直接就把不是以*.xls结尾的文件给pass掉了.如果读者使用其他的,需要进行相应的js校验(应该是的,我没弄过).选中之前导出生成的excel文件.进行导入操作(文件上传操作).

c,这里需要注意的是:一般前台都使用ajax异步处理机制,需要返回给前台一个信息(导入成功与否的提示!以及关闭哪些窗口!).由于ajax无法传递file文件,这里需要用FormData将表单的数据封装到这里.不懂得去百度搜索下,很简单的,(博主后续文章也会写).

d,传到controller中后解析表单中的数据,其中可能不单单只有file文件,也有可能会有其他需要用户填写的.对应上前台控件的''name''属性值即可.在下面代码中会有,这里简单描述下.(练练写作能力,太渣了!哈哈)

e,接收到file后,首先将file文件(也就是excel文件)写到一个路径下(这里博主写到服务器上的upload文件夹下了),如果想要备份以后看的话,可以也到固定盘下如"c://xxx文件夹/子文件夹"的位置,可以生产一个时间戳用来保证上传文件名字不重复,重复的话会覆盖之前的文件.

f,创建Workbook,利用之前上传的文件绝对路径生产一个输入流.具体代码看.

g,根据格式自己解析出来需要的数据,在进行插入数据库的操作.(这的逻辑就因人而异了,博主这里只是启示左右.)

h,需要进行校验,不能随便一个excel文件导入都能导入进来吧!校验方向:excel格式的校验,数据合理化校验.(这个部分没啥分享的了,因为水平有限!博主是个彩币.哈哈,只是想到这俩方向!)

上面叭叭叭说了一堆,很多童鞋已经懵逼了,下面直接上代码,当然也需要简单的叙述.慢慢体会吧!可能某一块就令你茅塞顿开!!!

首先是spring-mvc.xml需要下面这段代码(文件上传,一定要有,否则会出错的):

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="defaultEncoding" value="UTF-8"/>
        <property name="maxUploadSize" value="20971520"/>
        <property name="maxInMemorySize" value="2048"/>
        <property name="resolveLazily" value="true"/>
        <!-- 配置的是虚拟路径 -->
        <!-- <property name="uploadTempDir" value="/uploadFile/temp"/>    --> 
</bean>

前台(博主用的easyui框架)代码:

特别提醒:需要引入一个jquery.form.js,用于封装表单数据,主要用它封装file.好在ajax中能传递数据.
<body>
    <div align="center">
        <form id="news_scheme_upload_form" enctype="multipart/form-data"> 
            <table align="center" cellpadding="10">
                <tr align="center">
                    <td colspan="2"><input id="news_scheme_upload_file" name="file" type="text" style="width:300px" data-options="required:true,prompt:'请选择导出生成的excel文件'"></td>
                </tr>
                <tr align="center">
                    <td>设置名称:</td>
                    <td><input id="news_scheme_upload_schemeName" class="easyui-textbox" type="text" name="schemeName" data-options="required:true,missingMessage:'请输入方案名称',prompt:'请输入方案名称'" style="width:200px"></input></td>
                </tr>
                <tr align="center">
                    <td>设置备注:</td>
                    <td><input id="news_scheme_upload_schemeRemark" class="easyui-textbox" type="text" name="schemeRemark" data-options="required:true,multiline:true,prompt:'请输入方案备注信息'" style="width:200px;height:80px"></td>
                </tr>
                <tr align="center">
                    <td colspan="2"><span id="news_scheme_upload_message"></span></td>
                </tr>
                <tr align="center">
                    <td colspan="2"><a id="news_scheme_upload_button" href="#" class="easyui-linkbutton" data-options="iconCls:'icon-ok'">确认 </a></td>
                </tr>
            </table>
        </form>
     </div>  
    <script type="text/javascript" src="js/jquery.form.js"></script>
    <script type="text/javascript">
         $('#news_scheme_upload_file').filebox({    
            buttonText: '选择文件', 
            buttonAlign: 'left',
            //限定了上传文件的类型只能为"*.xls"类型.
            accept: ['application/vnd.ms-excel'],
        }); 
        
        $('#news_scheme_upload_button').on('click',function(){
        	
    	    if($(".validatebox-text.validatebox-invalid:first").val()==null){
            	//使用FormData,进行Ajax请求并'上传文件'.普通异步传递无法传传递文件,下面一句相当于把表单中的所有属性都封装进去了.
                var formData = new FormData(document.getElementById("news_scheme_upload_form")); 
                $.ajax({ 
                    url : 'newsSchemes/upload', 
                    type : 'POST', 
                    data : formData, 
                    // 告诉jQuery不要去处理发送的数据
                    processData : false, 
                    // 告诉jQuery不要去设置Content-Type请求头
                    contentType : false,
                    beforeSend: function(){
                    	//数据合理.显示绿色
                        $("#news_scheme_upload_message").css('color',"green");
                        $("#news_scheme_upload_message").html("数据合理,正在导入,请稍后...");
                    },
                    success : function(data) { 
                    	if(data==0){
                    	    //提示信息变成红色.
                            $("#news_scheme_upload_message").css('color',"#ff0000");
                            $("#news_scheme_upload_message").html("数据导入失败!!!!");
                    	}else if(data==-1){
                    		//提示信息变成红色.
                            $("#news_scheme_upload_message").css('color',"#ff0000");
                            $("#news_scheme_upload_message").html("数据导入失败!格式错误!!");
                    	}else if(data==-2){
                            //提示信息变成红色.
                            $("#news_scheme_upload_message").css('color',"#ff0000");
                            $("#news_scheme_upload_message").html("数据导入失败!格式错误!");
                        }else {
                    		//提示信息变成绿色.
                            $("#news_scheme_upload_message").css('color',"green");
                            $("#news_scheme_upload_message").html("数据导入成功!");
                            // alert( "文件导入成功重新reload当前页面" );
                            $( "#news_scheme_manage_div" ).dialog( "close" );
                            //$.messager.alert("提示信息","恭喜您删除成功!","info");
                            $( "#news_scheme_manage" ).datagrid( 'reload' );
                            // 删除所有选中的行数的状态
                            $( '#news_scheme_manage' ).datagrid( 'clearSelections' );
                            //点击返回重新刷新该页面对应的panel.
                            $("#news_anls_centerPanel").panel('refresh');
                    	}
                    	
                    }, 
                    error : function(data) { 
                    	//提示信息变成红色.
                        $("#news_scheme_upload_message").css('color',"#ff0000");
                        $("#news_scheme_upload_message").html("数据导入失败!请检查导入的excel文件是否与导出的文件完全一样!不一样则会导入失败!");
                    } 
                });
    	
    	    }else{
    		   //document.getElementById("news_scheme_upload_message").style.color="#ff0000"; 
    		   //提示信息变成红色.
    		   $("#news_scheme_upload_message").css('color',"#ff0000");
    		   $("#news_scheme_upload_message").html("数据不能为空!请检查带有警告的数据!");
    	    }
        });
        
   </script>
     
</body>
controller中代码:
    @RequestMapping(value = "/newsSchemes/upload")
    @ResponseBody
    public Integer importNewsScheme(@RequestParam(value = "file", required = false) MultipartFile file,String schemeName,String schemeRemark) throws IOException{
        
        //存储到服务器上的路径.
        String filePath = this.request.getSession().getServletContext().getRealPath("/")+"WEB-INF/upload";
        //获取文件名xxx.xls(前台设定了这里只能上传excel文件)
        String fileName = file.getOriginalFilename();
        //防止重名.(时间戳+文件名:*.xls结尾)
        fileName = DateUtil.createTimeStemp(new Date())+fileName;
        System.err.println("文件上传的临时文件夹:"+filePath);
        
        //文件写入到指定位置
        ExcelUtils.write(file , filePath , fileName);
        
        String currPid = (String) this.session.getAttribute("currPid");
        //切换到rsdb数据库
        DataSourceContextHolder.setDbType(DataSourceType.SOURCE_RSDB);
        //获取项目下的新闻源id数组
        Integer[] proSids = this.projectService.siteIdsByPid(currPid);
        int row = this.newsSchemesService.importNewsScheme(filePath+"//"+fileName , currPid , schemeName , schemeRemark , new Date() , proSids);
        //根据row的值,前台返回什么样的提示.
        return row;
    }
service层代码(只是启示作用,需要结合实际进行解析封装.):
    @Override
    public Integer importNewsScheme(String absolutePath,String currPid,String schemeName,String schemeRemark,Date time
            ,Integer[] proSids){
        //获取工作簿workbook
        Workbook wb = ExcelUtils.getWorkBook(absolutePath);
        //校验导入的excel格式是否一致
        
        // 得到一个工作表
        Sheet sheet = wb.getSheetAt(0);
        //获取工作表的总行数
        int totalRowNum = sheet.getLastRowNum();
        //System.err.println("总行数totalRowNum:"+totalRowNum);
        
        if(totalRowNum==0){//说明是空表,没有数据,故格式不对
            return -1;
        }
        //获取2个表格分界处那行没有任何数据的行号.行号+1就是下一个表头行号.
        int emptyRowNum = 0;
        for(int i = 1 ; i <= totalRowNum ; i++){
            if(sheet.getRow(i)==null || sheet.getRow(i).getPhysicalNumberOfCells()==0){
                emptyRowNum = i;
                break;
            }
        }
        //System.err.println("分界2个数据表格的那行行数emptyRowNum:"+emptyRowNum);
        if(emptyRowNum<3){
            return -1;
        }
        //获取唯一标识行
        Row uniqueRow = sheet.getRow(emptyRowNum+3);
        int w=0;
        if(uniqueRow==null){//说明格式不对
            return -1;
        }
        if(uniqueRow.getPhysicalNumberOfCells()!=0){
            int q=0;
            //说明他有几组数据.(党媒,央媒...)
            for(int i=0;i<emptyRowNum-2;i++){
                if(uniqueRow.getCell(q)!=null && uniqueRow.getCell(q+1)!=null && uniqueRow.getCell(q+2)!=null){
                    //格式校验,已经列头校验
                    if(ExcelUtils.getCellValue(uniqueRow.getCell(q)).equals("新闻源id") && ExcelUtils.getCellValue(uniqueRow.getCell(q+1)).equals("新闻源站点名称") && ExcelUtils.getCellValue(uniqueRow.getCell(q+2)).equals("url")){
                        w=w+1;
                    }
                }
                q=q+3;
            }
        }
        
        //w==emptyRowNum-2说明新闻方案表格式验证成功
        if(w==emptyRowNum-2){
            //封装方案插入基本信息
            NewsSchemes newsSchemes = new NewsSchemes(schemeName,time,time,schemeRemark,currPid);
            //插入新闻方案数据库news_scheme表中
            Integer uploadSchemeId = this.addNewsScheme(newsSchemes);
            //获取第一个表格,的列属性.也就是弟2行,下标为1
            Row schemeRowNum = sheet.getRow(1);
            //存储NewsMediaCategory的集合.有几个就说明有几个自定义媒体类型
            List<NewsMediaCategory> newsMediaCategoryList = new ArrayList<NewsMediaCategory>();
            //头两行为表头信息(直接从第三行开始解析遍历,也就是从下标2开始)
            for(int i=2;i<emptyRowNum;i++){
                NewsMediaCategory newsMediaCategory = new NewsMediaCategory();
                //System.err.println("第"+(i+1)+"行数据:");
                Row row = sheet.getRow(i);
                for(int j=0;j<row.getLastCellNum();j++){
                    //获取每一个单元格的数据
                    Cell cell = row.getCell(j);
                    String cellValue = ExcelUtils.getCellValue(cell);
                    //获取方案表.列属性名
                    String columnName = ExcelUtils.getCellValue(schemeRowNum.getCell(j));
                    if("自定义媒体名称".equals(columnName)){
                        newsMediaCategory.setName(cellValue);
                    }else if("备注信息".equals(columnName)){
                        newsMediaCategory.setRemark(cellValue);
                    }
                    //System.err.print(","+cellValue);
                }
                
                //设置创建时间,更新时间,第一插入都为系统当前时间
                newsMediaCategory.setCreate_time(time);
                newsMediaCategory.setUpdate_time(time);
                newsMediaCategory.setNews_scheme_id(uploadSchemeId);
                newsMediaCategoryList.add(newsMediaCategory);
                //System.err.println();
            }
            
            //下面是向List<NewsMediaCategory>中的NewsMediaCategory赋值包含的新闻源id数组
            int n = 0;
            if(newsMediaCategoryList!=null && newsMediaCategoryList.size()>0){
                for(NewsMediaCategory nmc : newsMediaCategoryList){
                    
                    List<Integer> sidsList = new ArrayList<Integer>();
                    //封装每一个NewsMediaCategory的sids属性
                    for(int j=emptyRowNum+4;j<=totalRowNum;j++){
                        //System.err.println("--------"+j+"----");
                        Row row = sheet.getRow(j);
                        //System.err.println("ddddd"+row.getCell(n));
                        //只有当有数据是才封装
                        if(row.getCell(n)!=null){
                            if(CommonUtils.isNumeric(ExcelUtils.getCellValue(row.getCell(n)))){
                                //说明是数字,合理性正确.
                                sidsList.add(Integer.parseInt(ExcelUtils.getCellValue(row.getCell(n))));
                            }else{
                                //说明新闻源id不为数字,数据不合理.
                                return -2;
                            }
                            
                        }
                    }
                    //list转换成数组.
                    Integer[] sids = sidsList.toArray(new Integer[sidsList.size()]);
                    
                    //与当前需要导入方案的项目,的新闻源集合取交集,留下的源可以插入进去
                    sids = CommonUtils.arrayJiaoJi(sids , proSids);
                    /*
                     * 这里预留.以后会提示是否将没有的新闻源,添加到该项目下.
                     */
                    //将符合条件的新闻源封装到NewsMediaCategory对象中去.
                    nmc.setSids(sids);
                    //每次取得只是新闻源id数组那一列数据,作为存入数据库中的依据,其他2列为展示信息.
                    n=n+3;
                }
            }
            int row=0;
            for(NewsMediaCategory nmc : newsMediaCategoryList){
                if(nmc.getSids()!=null && nmc.getSids().length>0){
                    //插入数据库
                    row = this.newsMediaCategoryService.addNewsMediaCate(nmc);
                    //System.err.println("--"+nmc.getName()+"---"+nmc.getRemark()+"---"+nmc.getSids().length);
                }
            }
            
            return row;
        }else{
            return -1;
        }
        
    }

Excel工具类代码(还是那句话,启示作用,熟悉之后,写符合自己的工具类):

package com.***.utils;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.springframework.web.multipart.MultipartFile;

/**
 * <b>处理excel文件的工具类</b>
 * @author GQ
 * @date 2016年12月27日 上午10:39:56
 * @status
 */
public class ExcelUtils {
    /**
     * 方法描述:用于下载文件,根据存在的文件绝对路径下载.<br>
     * 返回类型:void<br>
     * 作者:GQ<br>
     * 创建时间:2016年12月27日上午10:51:17
     * @param filePath  欲下载的文件绝对路径.<br>如:"F:\apache-tomcat-7.0.70\webapps\Rs_sys\WEB-INF\download\xxx.xls"
     * @param request   request请求
     * @param response  response请求<br>
     */
    public static void download(String filePath,HttpServletRequest request,HttpServletResponse response){
        HSSFWorkbook workbook=null;
        ServletOutputStream sos=null;
        try {
            File file = new File(filePath);
            if (!file.exists()) {
                response.sendError(404, "File not found!");
                return;
            }
            BufferedInputStream br = new BufferedInputStream(new FileInputStream(
                    filePath));
            String downLoadName = null;
            String agent = request.getHeader("USER-AGENT");
            if (null != agent && -1 != agent.indexOf("MSIE")) // IE
            {
                downLoadName = java.net.URLEncoder.encode(file.getName(), "UTF-8");
            } else if (null != agent && -1 != agent.indexOf("Mozilla")) // Firefox
            {
                downLoadName = new String(file.getName().getBytes("UTF-8"),
                        "iso-8859-1");
            } else {
                downLoadName = java.net.URLEncoder.encode(file.getName(), "UTF-8");
            }
            byte[] buf = new byte[1024];
            int len = 0;
            response.reset();
            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
            response.setHeader("Content-Disposition", "attachment; filename="
                    + downLoadName);
            OutputStream out = response.getOutputStream();
            while ((len = br.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
            br.close();
            out.close();
        }catch (Exception e) {
            e.printStackTrace();
        }finally{
            try {
                if (null != workbook) {
                    workbook.close();
                }
                if(null!=sos){
                    sos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * 方法描述:获取单元格中的数据,根据存储的值的类型不同,调用相应的方法获取数据,最后返回一个字符串类型的数据<br>
     * 返回类型:String<br>
     * 作者:GQ<br>
     * 创建时间:2016年12月28日下午6:24:00
     * @param cell 单元格
     * @return<br>
     */
    public static String getCellValue(Cell cell) {
        String cellValue = "";
        //DecimalFormat df = new DecimalFormat("#");
        switch (cell.getCellType()) {
            case HSSFCell.CELL_TYPE_STRING:
                cellValue = cell.getRichStringCellValue().getString().trim();
                break;
            case HSSFCell.CELL_TYPE_NUMERIC:
                cellValue = String.valueOf(new Integer((int)cell.getNumericCellValue()));
                break;
            case HSSFCell.CELL_TYPE_BOOLEAN:
                cellValue = String.valueOf(cell.getBooleanCellValue()).trim();
                break;
            case HSSFCell.CELL_TYPE_FORMULA:
                cellValue = cell.getCellFormula();
                break;
            default:
                cellValue = "";
        }
        return cellValue;
    }
    
    /**
     * 方法描述:文件写入<br>
     * 返回类型:void<br>
     * 作者:GQ<br>
     * 创建时间:2016年12月30日下午1:41:24
     * @param file       为获得到的文件(也就是要讲这个文件写到哪里)
     * @param filePath   文件写入的位置
     * @param fileName<br>  文件的名
     */
    public static void write(MultipartFile file,String filePath,String fileName){
        //在指定目录下建立一个空的文件,作用:别的file文件往里写入
        File targetFile = new File(filePath, fileName);
        if(!targetFile.exists()){
            targetFile.mkdirs();
        }
        //保存
        try {
            //将前台传过来的file文件写到targetFile中.
            file.transferTo(targetFile);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 方法描述:创建行,rowNum控制创建第几行.sheet控制在哪个工作簿上创建<br>
     * 返回类型:HSSFRow<br>
     * 作者:GQ<br>
     * 创建时间:2017年1月3日下午4:58:09
     * @param sheet    工作簿
     * @param rowNum   行数(下标从0开始)
     * @return<br>
     */
    public static HSSFRow createRow(HSSFSheet sheet,int rowNum) {
        return sheet.getRow(rowNum)!=null?sheet.getRow(rowNum):sheet.createRow(rowNum);
    }
    /**
     * 方法描述:创建一个cell,样式,值.<br>
     * 返回类型:void<br>
     * 作者:GQ<br>
     * 创建时间:2017年1月3日下午4:02:32<br>
     * @param cellnum  第几个cell,下标从0开始,即0代表第一个<br>
     * @param value    该cell的值<br>
     * @param row      行<br>
     * @param style    样式(采用哪个样式)<br>
     */
    public static HSSFCell createCell(HSSFSheet sheet, int rowNumm, int cellNum, HSSFCellStyle style, String value) {
        HSSFRow row = createRow(sheet,rowNumm);
        HSSFCell cell = row.createCell((short) cellNum);
        cell.setCellValue(new HSSFRichTextString(value));
        cell.setCellStyle(style);
        return cell;
    }
    /**
     * 方法描述:创建多个单元格.必须是同一行的.并赋值上相应数据<br>
     * 返回类型:HSSFCell<br>
     * 作者:GQ<br>
     * 创建时间:2017年1月3日下午5:21:52
     * @param sheet          工作簿
     * @param rowNumm        行数
     * @param cellNums       要创建的单元格下标数组
     * @param style          样式
     * @param values         单元格下标对应的值,一个对应一个,顺序不能乱
     */
    public static List<HSSFCell> createMultiCell(HSSFSheet sheet, int rowNumm, Integer[] cellNums, HSSFCellStyle style, String[] values) {
        List<HSSFCell> cellList = new ArrayList<HSSFCell>();
        for(int i=0;i<cellNums.length;i++){
            HSSFCell cell = createCell(sheet , rowNumm , cellNums[i] , style , values[i]);
            cellList.add(cell);
        }
        return cellList;
    }
    /**
     * 方法描述:创建自定义cell单元格的基础样式.<br>
     * 返回类型:HSSFCellStyle<br>
     * 作者:GQ<br>
     * 创建时间:2017年1月3日下午4:04:02
     * @param workbook
     */
    public static HSSFCellStyle getCellStyle(HSSFWorkbook workbook) {
        /*//设置字体;
        HSSFFont font = workbook.createFont();
        //设置字体大小;
        font.setFontHeightInPoints((short) 5);
        //设置字体名字;
        font.setFontName("Courier New");*/
        //font.setItalic(true);
        //font.setStrikeout(true);
        //设置样式;
        HSSFCellStyle style = workbook.createCellStyle();
        //设置底边框;
        style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        //设置底边框颜色;
        style.setBottomBorderColor(HSSFColor.BLACK.index);
        //设置左边框;
        style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        //设置左边框颜色;
        style.setLeftBorderColor(HSSFColor.BLACK.index);
        //设置右边框;
        style.setBorderRight(HSSFCellStyle.BORDER_THIN);
        //设置右边框颜色;
        style.setRightBorderColor(HSSFColor.BLACK.index);
        //设置顶边框;
        style.setBorderTop(HSSFCellStyle.BORDER_THIN);
        //设置顶边框颜色;
        style.setTopBorderColor(HSSFColor.BLACK.index);
        //在样式用应用设置的字体;
        //style.setFont(font);
        //设置自动换行;
        style.setWrapText(true);
        //设置水平对齐的样式为居中对齐;
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        //设置垂直对齐的样式为居中对齐;
        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        return style;
    }
    /**
     * 方法描述:自定义设置标题样式,只有下边框<br>
     * 返回类型:HSSFCellStyle<br>
     * 作者:GQ<br>
     * 创建时间:2017年1月3日下午4:20:42<br>
     * @param workbook<br>
     */
    public static HSSFCellStyle getTitleStyle(HSSFWorkbook workbook){
        HSSFCellStyle style = workbook.createCellStyle();
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式
        // 设置标题只有下边框
        style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        return style;
    }
    /**
     * 方法描述:合并单元格<br>
     * 返回类型:int<br>
     * 作者:GQ<br>
     * 创建时间:2017年1月4日上午10:45:20<br>
     * @param sheet         工作簿<br>
     * @param firstRow      合并起止行(下标从0开始)<br>
     * @param lastRow       合并截止行(下标从0开始)<br>
     * @param firstCol      合并起止列(下标从0开始)<br>
     * @param lastCol       合并截止列(下标从0开始)<br>
     */
    public static int mergedRegion(HSSFSheet sheet,int firstRow, int lastRow, int firstCol, int lastCol){
        return sheet.addMergedRegion(new CellRangeAddress(firstRow,lastRow,firstCol,lastCol));
    }
    /**
     * 方法描述:将生成好的excel文件,写入到指定路径下的文件中.<br>
     * 返回类型:void<br>
     * 作者:GQ<br>
     * 创建时间:2017年1月4日上午10:57:04<br>
     * @param wb                一个workbook,对应一个Excel文件<br>
     * @param absolutePath      excel文件的绝对路径<br>
     */
    public static void writeExcelToLocation(HSSFWorkbook wb,String absolutePath){
        try {
            FileOutputStream fout = new FileOutputStream(absolutePath);
            wb.write(fout);
            fout.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 方法描述:获取workbook,将文件转换为workbook对象<br>
     * 返回类型:Workbook<br>
     * 作者:GQ<br>
     * 创建时间:2017年1月4日下午5:12:20<br>
     * @param absolutePath              文件的绝对路径(excel文件)<br>
     * @return<br>
     */
    public static Workbook getWorkBook(String absolutePath){
        FileInputStream fis =null;
        Workbook wb = null;
        try{
            // 获取一个绝对地址的流
            fis = new FileInputStream(absolutePath);
            wb = new HSSFWorkbook(fis);
        }catch(IOException e){
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        return wb;
    }
    
}
controller中的生成时间戳的方法代码:
public static String createTimeStemp(Date date){
        SimpleDateFormat dfs = new SimpleDateFormat("yyyyMMddHHmmss");// 设置日期格式
        String tStamp = dfs.format(date);
        return tStamp;
}
      这里说下,点击导入按钮,应该是先跳到一个页面.该页面有一个表单,包括上传的file文件,其他需要的数据等等.

特别声明:博主水平有限,其中不免有些不足,漏洞,bug,希望提出了,共同进步!!!再次声明,此文只是起到一个启示作用!!!最后谢谢大家!另外排版不是很会,希望理解!






评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值