Jfinal 导入Excel(2)

前面我们在JFianl项目中把Excel导出去了,所以我们要想办法把它导回来。

JFinal导入Excel

导入依赖jar

poi-ooxml-3.8-20120326.jarxmlbeans-2.3.0.jar

导入Excel

我们导入前端插件还是我们之前使用过的uploadify

当我们接收了Excel文件。我们首先要判断一下是否为Excel文件以及Excel的版本。

添加Excel文件检测类,CEVUtil


package util;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import org.apache.poi.POIXMLDocument;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

public class CEVUtil {
    /**
    * 依据后缀名判断读取的是否为Excel文件
    * @param filePath
    * @return
    */
    public static boolean isExcel(String filePath){
         if(filePath.matches("^.+\\.(?i)(xls)$")||filePath.matches("^.+\\.(?i)(xlsx)$")){
             return true;
         }
         return false;
    } 
         
     /** 
      * 检查文件是否存在 
      */  
     public static boolean fileExist(String filePath){
         if(filePath == null || filePath.trim().equals("")) 
             return false;
         File file = new File(filePath);  
         if (file == null || !file.exists()){  
             return false;  
         } 
         return true;
     }
     /**
      * 依据内容判断是否为excel2003及以下
     */
     public static boolean isExcel2003(String filePath){
         try {
             BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filePath));
             if(POIFSFileSystem.hasPOIFSHeader(bis)) {
                 System.out.println("Excel版本为excel2003及以下");
                 return true;
             }
         } catch (IOException e) {
             e.printStackTrace();
             return false;
         }
         return false;
     }
     /**
      * 依据内容判断是否为excel2007及以上
     */
     public static boolean isExcel2007(String filePath){
         try {
             BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filePath));
             if(POIXMLDocument.hasOOXMLHeader(bis)) {
                 System.out.println("Excel版本为excel2007及以上");
                 return true;
             }
         } catch (IOException e) {
             e.printStackTrace();
             return false;
         }
         return false;
     }
}

添加Excel读取类:


package util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/**
 * 有判断性的读取
 * @author Administrator
 *
 */
public class ReadExcel {
     /** 错误信息 */  
    private String errorInfo;
    
    /**
     * 验证EXCEL文件是否合法 
     */
    public boolean validateExcel(String filePath){ 
    
        /**判断文件名是否为空或者文件是否存在 */
        if(!CEVUtil.fileExist(filePath)){
            errorInfo = "文件不存在";
            return false; 
        }
    
        /**检查文件是否是Excel格式的文件 */  
        if (!CEVUtil.isExcel(filePath))  {  
            errorInfo = "文件名不是excel格式";  
            return false;  
        } 
        return true;  
    }
    
    /** 
     * @描述:根据文件名读取excel文件 
     */  
    public Map<String,Object> read(String filePath){
        Map<String,Object> map = new HashMap<String,Object>(); 
        InputStream is = null;  
        try{
            /** 验证文件是否合法 */  
            if (!validateExcel(filePath)){ 
                map.put("error", errorInfo);
                return map;
            }  
            /** 判断文件的类型,是2003还是2007 */  
            boolean isExcel2003 = true; 
            if (CEVUtil.isExcel2007(filePath)){ 
                isExcel2003 = false;  
            }  
            /** 调用本类提供的根据流读取的方法 */  
            is = new FileInputStream(new File(filePath));
            Workbook wb = null;  
            if (isExcel2003){  
                wb = new HSSFWorkbook(is);  
            }else{  
                wb = new XSSFWorkbook(is);  
            }
            map.put("wb", wb);
            is.close();
        }catch (IOException e){  
            e.printStackTrace(); 
        }catch (Exception ex){  
            ex.printStackTrace();  
        }finally{  
            if (is != null){  
                try{  
                    is.close();  
                }catch (IOException e){  
                    is = null;  
                    e.printStackTrace();  
                }  
            }  
        }  
        return map;  
    }
    
    /** 
     * @描述:读取数据 
     */  
 
    public List<List<Object>> readExcel(Workbook workbook) 
            throws  FileNotFoundException, IOException, org.apache.poi.openxml4j.exceptions.InvalidFormatException{
        //Workbook workbook = WorkbookFactory.create(new FileInputStream(new File(excelPath)));
        //String values="";
        Sheet sheet = workbook.getSheetAt(0);
        int startRowNum = sheet.getFirstRowNum();
        int endRowNum = sheet.getLastRowNum();
        List<List<Object>> dataLst = new ArrayList<List<Object>>();
        
        for(int rowNum = startRowNum;rowNum<=endRowNum;rowNum++){
            List<Object> rowLst = new ArrayList<Object>();  
            //values += "(";
            Row row = sheet.getRow(rowNum);
            if(row == null) continue;
            int startCellNum = row.getFirstCellNum();
            int endCellNum = row.getLastCellNum();
            for(int cellNum = startCellNum;cellNum<endCellNum;cellNum++){
                Cell cell = row.getCell(cellNum);
                if(cell == null) continue;
                int type = cell.getCellType(); 
                switch (type) {
                    case Cell.CELL_TYPE_NUMERIC://数值、日期类型
                        double d = cell.getNumericCellValue();
                        if (HSSFDateUtil.isCellDateFormatted(cell)) {//日期类型
                            // Date date = cell.getDateCellValue();
                            Date date = HSSFDateUtil.getJavaDate(d);
                            rowLst.add(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date));
                            //values +="'"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date)+"',";
                        }else{//数值类型          
                            System.out.print(" "+d+" ");
                            rowLst.add(d);
                        }
                        break;
                    case Cell.CELL_TYPE_BLANK://空白单元格
                        System.out.print(" null ");
                        rowLst.add("");
                        break;
                    case Cell.CELL_TYPE_STRING://字符类型
                        System.out.print(" "+cell.getStringCellValue()+" ");
                        rowLst.add(cell.getStringCellValue());
                        break;
                    case Cell.CELL_TYPE_BOOLEAN://布尔类型
                        System.out.println(cell.getBooleanCellValue());
                        rowLst.add(cell.getBooleanCellValue());
                        break;
                    case HSSFCell.CELL_TYPE_ERROR: // 故障  
                        System.err.println("非法字符");//非法字符;  
                        rowLst.add("非法字符");
                        break;
                    default:      
                        System.err.println("error");//未知类型
                         rowLst.add("error");
                        break;
                }
            }
            dataLst.add(rowLst);
            System.out.println();
        }
        return dataLst;
    }
    
   
}


对应的Controller类,ExportExcelController

为了防止用户上传的Excel格式不争取,额外添加了一个导出Excel模板方法。


package controller;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;

import common.util.XLSFileKit;
import service.ExportExcelService;

import com.jfinal.core.Controller;
import com.jfinal.plugin.activerecord.Record;


public class ExportExcelController extends Controller{

    ExportExcelService exportExcelService = new ExportExcelService();
    /**
     * 导出表格
     */
    public void exportOutExcel(){
        String sheetName = getPara("sheetName");        
        
        String fileName = new Date().getTime() + "_" + UUID.randomUUID().toString() + ".xls";
        String filePath = getRequest().getRealPath("/") + "/file/export/";
        File file = new File(filePath);
        if(!file.exists()){
            file.mkdirs();
        }
        String relativePath = "/file/export/" + fileName;
        filePath += fileName;
        XLSFileKit xlsFileKit = new XLSFileKit(filePath);
        List<List<Object>> content = new ArrayList<List<Object>>();
        List<String> title = new ArrayList<String>();
        
        List<Record> datas = exportExcelService.getList();
        title.add("序号");
        title.add("id");
        title.add("caseId");
        title.add("imgId");
        int i = 0;
        OK:
        while(true){
            if(datas.size() < (i + 1)){
                break OK;
            }
            int index = i + 1;
            List<Object> row = new ArrayList<Object>(); 
            row.add(index + "");
            row.add(null==datas.get(i).get("id")?"":datas.get(i).get("id"));
            row.add(null==datas.get(i).get("caseId")?"":datas.get(i).get("caseId"));
            row.add(null==datas.get(i).get("imgId")?"":datas.get(i).get("imgId"));
            content.add(row);
            i ++;
        }
        xlsFileKit.addSheet(content, sheetName, title);
        xlsFileKit.save();
        renderJson(new Record().set("relativePath", relativePath));
    }
    
    
    /**
     * 导出表格模板
     */
    public void exportOutExcelStandard(){
        String sheetName = getPara("sheetName");        
        
        String fileName = new Date().getTime() + "_" + UUID.randomUUID().toString() + ".xls";
        String filePath = getRequest().getRealPath("/") + "/file/export/";
        File file = new File(filePath);
        if(!file.exists()){
            file.mkdirs();
        }
        String relativePath = "/file/export/" + fileName;
        filePath += fileName;
        XLSFileKit xlsFileKit = new XLSFileKit(filePath);
        List<List<Object>> content = new ArrayList<List<Object>>();
        List<String> title = new ArrayList<String>();
        
        title.add("序号");
        title.add("id");
        title.add("caseId");
        title.add("imgId");
        
        xlsFileKit.addSheet(content, sheetName, title);
        xlsFileKit.save();
        renderJson(new Record().set("relativePath", relativePath));
    }
}

对应的Services类,InportExcelService


package service;

import com.jfinal.plugin.activerecord.Db;

public class InportExcelService {

    public static void delAll(){
        
        Db.update("delete from zt_case_img");
    }
    
    public static void addSql(String sqlValues){
        
        String sql = "insert into zt_case_img"
                  + " (caseId,imgId)"
                  + " values " + sqlValues;
        Db.update(sql);
    }
}

然后前端相应的方法调用。


//导出`Excel`模板
        $("#exportS").click(function() {
            $.post("excel/exportOutExcelStandard", {
                sheetName: "报表"
            }, function(data) {
                var relativePath = data.relativePath;
                console.log(relativePath);
                window.location.href = "." + relativePath;

            });

        });

        $('#inport').uploadify({
        'swf': 'js/uploadify/uploadify.swf',
        'buttonText': '导入Excel',
        'auto': false,
        'buttonClass': 'crud-btn import-btn',
        'width': '78',
        'height': '26',
        'fileTypeExts': '*.xls;*.xlsx',
        'uploader': 'inexcel/exportInExcel',
        'removeCompleted': true,
        'onSelect': function(file) {
            layer.confirm('请选择清空数据库插入,还是追加插入?', {
                btn: ['清空插入', '追加插入']
                    //按钮
            }, function() {
                $("#inport").uploadify("settings", "uploader", "../../inexcel/exportInExcel?flag=1");
                $('#inport').uploadify('upload', '*');
            }, function() {
                $("#inport").uploadify("settings", "uploader", "../../inexcel/exportInExcel?flag=0");
                $('#inport').uploadify('upload', '*');
            });
        },
        'onUploadStart': function(file) {

        },
        'onUploadSuccess': function(file,
            data, respone) {
            var img = $.parseJSON(data);
            if(img.flag != "1") {
                alert(img.flag);
            } else {
                alert("导入成功!", function() {
                    window.location
                        .reload();
                });
            }
            $('#pic_upload').uploadify(
                'stop');
        }
        });

        });       

导入Excel:

outPut

导入Excel成功:

outPut

导出Excel模板:

outPut

完整源代码

转载于:https://www.cnblogs.com/chenjy1225/p/9662005.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值