在SSM下使用POI实现Excel表的导入/导出

导出就是将List转化为ExcellistToExcel

导入就是将Excel转化为ListexcelToList

POI

Apache POIApache软件基金会的开放源码函式库,POI提供APIJava程序对Microsoft Office格式档案读和写的功能。

我们知道要创建一张excel你得知道excel由什么组成,比如说sheet也就是一个工作表格,例如一行,一个单元格,单元格格式,单元格内容格式…这些都对应着poi里面的一个类。

一个excel表格:

HSSFWorkbook wb = new HSSFWorkbook();

一个工作表格(sheet):

HSSFSheet sheet = wb.createSheet("测试表格");

一行(row):

HSSFRow row1 = sheet.createRow(0);

一个单元格(cell):

HSSFCell cell2 = row2.createCell((short)0)

单元格格式(cellstyle):

HSSFCellStyle style4 = wb.createCellStyle()

单元格内容格式()

HSSFDataFormat format= wb.createDataFormat();

知道上面的基本知识后下面学起来就轻松了

poi批量导入导出的jar

http://pan.baidu.com/s/1o7CsH78

poi-ooxml-3.13.jar

poi-ooxml-schemas-3.13.jar

poi-3.13.jar

xmlbeans-2.6.0.jar

fastjson-1.2.2-sources.jar

fastjson-1.2.2.jar

创建一个Excel表数据导入和导出的工具类ExcelUtil

http://pan.baidu.com/s/1c2vYsog

package com.city.pms.common.utils;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletOutputStream;
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.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFComment;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFPatriarch;
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.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
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.streaming.SXSSFCell;
import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

public class ExcellUtil{
	
    public static String NO_DEFINE = "no_define";//未定义的字段
    public static String DEFAULT_DATE_PATTERN="yyyy-MM-dd";//默认日期格式
    public static int DEFAULT_COLOUMN_WIDTH = 17;
    
    private final static String excel2003L =".xls";    //2003- 版本的excel  
    private final static String excel2007U =".xlsx";   //2007+ 版本的excel  
    /** 
     * Excel导入
     */  
    public static  List<List<Object>> getBankListByExcel(InputStream in, String fileName) throws Exception{  
        List<List<Object>> list = null;  
        //创建Excel工作薄  
        Workbook work = getWorkbook(in,fileName);  
        if(null == work){  
            throw new Exception("创建Excel工作薄为空!");  
        }  
        Sheet sheet = null;  
        Row row = null;  
        Cell cell = null;  
        list = new ArrayList<List<Object>>();  
        //遍历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<Object> li = new ArrayList<Object>();  
                for (int y = row.getFirstCellNum(); y < row.getLastCellNum(); y++) {  
                    cell = row.getCell(y);  
                    li.add(getCellValue(cell));  
                }  
                list.add(li);  
            }  
        }  
        return list;  
    }  
    /** 
     * 描述:根据文件后缀,自适应上传文件的版本 
     */  
    public static  Workbook getWorkbook(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;  
    }  
    /** 
     * 描述:对表格中数值进行格式化 
     */  
    public static  Object getCellValue(Cell cell){  
        Object value = null;  
        DecimalFormat df = new DecimalFormat("0");  //格式化字符类型的数字  
        SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd");  //日期格式化  
        DecimalFormat df2 = new DecimalFormat("0.00");  //格式化数字  
        switch (cell.getCellType()) {  
            case Cell.CELL_TYPE_STRING:  
                value = cell.getRichStringCellValue().getString();  
                break;  
            case Cell.CELL_TYPE_NUMERIC:  
                if("General".equals(cell.getCellStyle().getDataFormatString())){  
                    value = df.format(cell.getNumericCellValue());  
                }else if("m/d/yy".equals(cell.getCellStyle().getDataFormatString())){  
                    value = sdf.format(cell.getDateCellValue());  
                }else{  
                    value = df2.format(cell.getNumericCellValue());  
                }  
                break;  
            case Cell.CELL_TYPE_BOOLEAN:  
                value = cell.getBooleanCellValue();  
                break;  
            case Cell.CELL_TYPE_BLANK:  
                value = "";  
                break;  
            default:  
                break;  
        }  
        return value;  
    }  
    
    
    /**
     * 导出Excel 97(.xls)格式 ,少量数据
     * @param title 标题行 
     * @param headMap 属性-列名
     * @param jsonArray 数据集
     * @param datePattern 日期格式,null则用默认日期格式
     * @param colWidth 列宽 默认 至少17个字节
     * @param out 输出流
     */
	public static void exportExcel(Map<String, String> headMap,JSONArray jsonArray,String datePattern,int colWidth, OutputStream out) {
        if(datePattern==null) datePattern = DEFAULT_DATE_PATTERN;
        // 声明一个工作薄
        HSSFWorkbook workbook = new HSSFWorkbook();
        workbook.createInformationProperties();
        workbook.getDocumentSummaryInformation().setCompany("*****公司");
        
         //表头样式
        HSSFCellStyle titleStyle = workbook.createCellStyle();
        titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        HSSFFont titleFont = workbook.createFont();
        titleFont.setFontHeightInPoints((short) 20);
        titleFont.setBoldweight((short) 700);
        titleStyle.setFont(titleFont);
        
        // 列头样式
        HSSFCellStyle headerStyle = workbook.createCellStyle();
        headerStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        headerStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        headerStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        headerStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        headerStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
        headerStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
        headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        HSSFFont headerFont = workbook.createFont();
        headerFont.setFontHeightInPoints((short) 12);
        headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        headerStyle.setFont(headerFont);
        
        // 单元格样式
        HSSFCellStyle cellStyle = workbook.createCellStyle();
        cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
        cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        HSSFFont cellFont = workbook.createFont();
        cellFont.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
        cellStyle.setFont(cellFont);
        
        // 生成一个(带标题)表格
        HSSFSheet sheet = workbook.createSheet();
        // 声明一个画图的顶级管理器
        HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
        // 定义注释的大小和位置,详见文档
        HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0,
                0, 0, 0, (short) 4, 2, (short) 6, 5));
        // 设置注释内容
        comment.setString(new HSSFRichTextString("可以在POI中添加注释!"));
        // 设置注释作者,当鼠标移动到单元格上是可以在状态栏中看到该内容.
        comment.setAuthor("JACK");
        //设置列宽
        int minBytes = colWidth<DEFAULT_COLOUMN_WIDTH?DEFAULT_COLOUMN_WIDTH:colWidth;//至少字节数
        int[] arrColWidth = new int[headMap.size()];
        // 产生表格标题行,以及设置列宽
        String[] properties = new String[headMap.size()];
        String[] headers = new String[headMap.size()];
        int ii = 0;
        for (Iterator<String> iter = headMap.keySet().iterator(); iter
                .hasNext();) {
            String fieldName = iter.next();

            properties[ii] = fieldName;
            headers[ii] = fieldName;

            int bytes = fieldName.getBytes().length;
            arrColWidth[ii] =  bytes < minBytes ? minBytes : bytes;
            sheet.setColumnWidth(ii,arrColWidth[ii]*256);
            ii++;
        }
        // 遍历集合数据,产生数据行
        int rowIndex = 0;
        for (Object obj : jsonArray) {
            if(rowIndex == 65535 || rowIndex == 0){
                if ( rowIndex != 0 ) sheet = workbook.createSheet();//如果数据超过了,则在第二页显示

                HSSFRow headerRow = sheet.createRow(0); //列头 rowIndex =0
                for(int i=0;i<headers.length;i++)
                {
                    headerRow.createCell(i).setCellValue(headers[i]);
                    headerRow.getCell(i).setCellStyle(headerStyle);

                }
                rowIndex = 1;//数据内容从 rowIndex=1开始
            }
            JSONObject jo = (JSONObject) JSONObject.toJSON(obj);
            HSSFRow dataRow = sheet.createRow(rowIndex);
            for (int i = 0; i < properties.length; i++)
            {
                HSSFCell newCell = dataRow.createCell(i);

                Object o =  jo.get(properties[i]);
                String cellValue = ""; 
                if(o==null) cellValue = "";
                else if(o instanceof Date) cellValue = new SimpleDateFormat(datePattern).format(o);
                else cellValue = o.toString();

                newCell.setCellValue(cellValue);
                newCell.setCellStyle(cellStyle);
            }
            rowIndex++;
        }
        // 自动调整宽度
        /*for (int i = 0; i < headers.length; i++) {
            sheet.autoSizeColumn(i);
        }*/
        try {
            workbook.write(out);
            workbook.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
	
    /**
     * 导出Excel 2007 OOXML (.xlsx)格式
     * @param title 标题行
     * @param headMap 属性-列头
     * @param jsonArray 数据集
     * @param datePattern 日期格式,传null值则默认 年月日
     * @param colWidth 列宽 默认 至少17个字节
     * @param out 输出流
     */
    public static void exportExcelX(Map<String, String> headMap,JSONArray jsonArray,String datePattern,int colWidth, OutputStream out) {
        if(datePattern==null) datePattern = DEFAULT_DATE_PATTERN;
        // 声明一个工作薄
        SXSSFWorkbook workbook = new SXSSFWorkbook(1000);//缓存
        workbook.setCompressTempFiles(true);
        
         //表头样式
        CellStyle titleStyle = workbook.createCellStyle();
        titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        Font titleFont = workbook.createFont();
        titleFont.setFontHeightInPoints((short) 20);
        titleFont.setBoldweight((short) 700);
        titleStyle.setFont(titleFont);
        
        // 列头样式
        CellStyle headerStyle = workbook.createCellStyle();
        headerStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        headerStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        headerStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        headerStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
        headerStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
        headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        Font headerFont = workbook.createFont();
        headerFont.setFontHeightInPoints((short) 12);
        headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        headerStyle.setFont(headerFont);
        
        // 单元格样式
        CellStyle cellStyle = workbook.createCellStyle();
        cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
        cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        Font cellFont = workbook.createFont();
        cellFont.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
        cellStyle.setFont(cellFont);
        
        // 生成一个(带标题)表格
        SXSSFSheet sheet = workbook.createSheet();
        //设置列宽
        int minBytes = colWidth<DEFAULT_COLOUMN_WIDTH?DEFAULT_COLOUMN_WIDTH:colWidth;//至少字节数
        int[] arrColWidth = new int[headMap.size()];
        // 产生表格标题行,以及设置列宽
        String[] properties = new String[headMap.size()];
        String[] headers = new String[headMap.size()];
        int ii = 0;
        for (Iterator<String> iter = headMap.keySet().iterator(); iter
                .hasNext();) {
            String fieldName = iter.next();

            properties[ii] = fieldName;
            headers[ii] = headMap.get(fieldName);

            int bytes = fieldName.getBytes().length;
            arrColWidth[ii] =  bytes < minBytes ? minBytes : bytes;
            sheet.setColumnWidth(ii,arrColWidth[ii]*256);
            ii++;
        }
        // 遍历集合数据,产生数据行
        int rowIndex = 0;
        for (Object obj : jsonArray) {
            if(rowIndex == 65535 || rowIndex == 0){
                if ( rowIndex != 0 ) sheet = workbook.createSheet();//如果数据超过了,则在第二页显示

                SXSSFRow headerRow = sheet.createRow(0); //列头 rowIndex =0
                for(int i=0;i<headers.length;i++)
                {
                    headerRow.createCell(i).setCellValue(headers[i]);
                    headerRow.getCell(i).setCellStyle(headerStyle);

                }
                rowIndex = 1;//数据内容从 rowIndex=1开始
            }
            JSONObject jo = (JSONObject) JSONObject.toJSON(obj);
            SXSSFRow dataRow = sheet.createRow(rowIndex);
            for (int i = 0; i < properties.length; i++)
            {
                SXSSFCell newCell = dataRow.createCell(i);

                Object o =  jo.get(properties[i]);
                String cellValue = ""; 
                if(o==null) cellValue = "";
                else if(o instanceof Date) cellValue = new SimpleDateFormat(datePattern).format(o);
                else if(o instanceof Float || o instanceof Double) 
                    cellValue= new BigDecimal(o.toString()).setScale(2,BigDecimal.ROUND_HALF_UP).toString();
                else cellValue = o.toString();

                newCell.setCellValue(cellValue);
                newCell.setCellStyle(cellStyle);
            }
            rowIndex++;
        }
        // 自动调整宽度
        for (int i = 0; i < headers.length; i++) {
            sheet.autoSizeColumn(i);
        }
        try {
            workbook.write(out);
            workbook.close();
            workbook.dispose();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    
    
    //Web 导出excel
    public static void downloadExcelFile(String title,Map<String,String> headMap,JSONArray ja,HttpServletResponse response){
        try {
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            ExcellUtil.exportExcelX(headMap,ja,null,0,os);
            byte[] content = os.toByteArray();
            InputStream is = new ByteArrayInputStream(content);
            // 设置response参数,可以打开下载页面
            response.reset();

            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8"); 
            response.setHeader("Content-Disposition", "attachment;filename="+ new String((title + ".xlsx").getBytes(), "iso-8859-1"));
            response.setContentLength(content.length);
            ServletOutputStream outputStream = response.getOutputStream();
            BufferedInputStream bis = new BufferedInputStream(is);
            BufferedOutputStream bos = new BufferedOutputStream(outputStream);
            byte[] buff = new byte[8192];
            int bytesRead;
            while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
                bos.write(buff, 0, bytesRead);

            }
            bis.close();
            bos.close();
            outputStream.flush();
            outputStream.close();
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
}

导出的实体类

http://pan.baidu.com/s/1c2EVh2w

package com.city.pms.entity.project.design.designDTO;

import java.util.Date;
/**
 * 
 * @Description: 导出的实体类
 * @CreateTime: 2017-11-20 上午9:47:56 
 * @author: zhuhongfei 
 * @version V1.0
 */
public class ProjectDesignDTO {

	private String projectName;
	private String name;
	private String applicantUnit;
	private String reviewUnit;
	private String status;
	private String createName;
	private Date createDate;
	
	
	public String getProjectName() {
		return projectName;
	}
	public void setProjectName(String projectName) {
		this.projectName = projectName;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getApplicantUnit() {
		return applicantUnit;
	}
	public void setApplicantUnit(String applicantUnit) {
		this.applicantUnit = applicantUnit;
	}
	public String getReviewUnit() {
		return reviewUnit;
	}
	public void setReviewUnit(String reviewUnit) {
		this.reviewUnit = reviewUnit;
	}
	public String getStatus() {
		return status;
	}
	public void setStatus(String status) {
		this.status = status;
	}
	
	public String getCreateName() {
		return createName;
	}
	public void setCreateName(String createName) {
		this.createName = createName;
	}
	public Date getCreateDate() {
		return createDate;
	}
	public void setCreateDate(Date createDate) {
		this.createDate = createDate;
	}
	
}

导入的实体类

http://pan.baidu.com/s/1i5pc6hf

package com.city.pms.entity.project.design.designA;

import java.io.Serializable;
import java.util.Date;

/**
 * 
 * @Description: 导入实体类
 * @CreateTime: 2017-11-16 上午9:23:21 
 * @author: chenzw  
 * @version V1.0
 */

public class DesignA implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1749623906718021284L;
	
	private Double id;
	private Integer eid;//整数
	private Integer safe;//安全值
	private Double prewarning;//预警值
	private Double alarm;//报警值
	private Double voerflow;//溢流值
	private Date createDate;//创建时间
	
	public Double getId() {
		return id;
	}
	public void setId(Double id) {
		this.id = id;
	}
	public Integer getEid() {
		return eid;
	}
	public void setEid(Integer eid) {
		this.eid = eid;
	}
	public Integer getSafe() {
		return safe;
	}
	public void setSafe(Integer safe) {
		this.safe = safe;
	}
	public Double getPrewarning() {
		return prewarning;
	}
	public void setPrewarning(Double prewarning) {
		this.prewarning = prewarning;
	}
	public Double getAlarm() {
		return alarm;
	}
	public void setAlarm(Double alarm) {
		this.alarm = alarm;
	}
	public Double getVoerflow() {
		return voerflow;
	}
	public void setVoerflow(Double voerflow) {
		this.voerflow = voerflow;
	}
	public Date getCreateDate() {
		return createDate;
	}
	public void setCreateDate(Date createDate) {
		this.createDate = createDate;
	}
	
}

整体架构(dao,service,.xml,Controller

http://pan.baidu.com/s/1hsF2Zha

//Dao层
//获取excel数据并插入数据库
public void insertDatasFromExcel(List<DesignA> designA);
//service层
//从excel导入到designA
public String insertDatasFromExcel(InputStream in,String fileName,Map<String, String> headMap);
//获取显示列表
public List<ProjectDesign> getAllProjectDesign();
//导出接口
public List<ProjectDesignDTO> getAllProjectDesignDTO();

一、ServiceImpl-导入

package com.city.pms.service.project.design.designA;

import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.city.pms.common.utils.ImportUtil2;
import com.city.pms.entity.project.design.designA.DesignA;
import com.city.pms.repository.project.design.designA.DesignADao;
@Service
public class DesignAServiceImpl implements DesignAService {

	@Autowired  
	private DesignADao designADao;
	
	//
	@Override
	public DesignA save(String id) {
		// TODO Auto-generated method stub
		return designADao.save(id);
	}
	//导入
	@Override
	public String insertDatasFromExcel(InputStream in, String fileName,Map<String, String> headMap) {
		try {
			//首先调用工具类,读取excel文件,封装称实体集合
			List<List<Object>> listob = ImportUtil2.getListByExcel(in, fileName);
			//获取动态数组  动态的增加和减少元素  实现了ICollection和IList接口  灵活的设置数组的大小
			List<DesignA> designA = new ArrayList<DesignA>(); 
			//读取第一列,列头信息,第一行
			List<Object> list = listob.get(0);
			Iterator<String> keys = headMap.keySet().iterator();
			//LinkedHashMap保留插入的顺序(key,value)
			Map<String,Integer> newMap=new LinkedHashMap<String,Integer>();
			while(keys.hasNext()){
				String key = keys.next();
				String name = headMap.get(key);
				boolean flag=true;
				for (int i = 0; i < list.size(); i++) {
					if(StringUtils.contains(name, list.get(i).toString())){
						newMap.put(key,i);
						flag=false;
						break;
					}
				}
				if(flag==true){
					throw new Exception("Excel表格参数错误,缺少"+name);
				}
			}
		    //遍历listob数据,把数据放到List中  从第二行开始
		    for (int i = 1; i < listob.size(); i++) {  
		        List<Object> ob = listob.get(i); 
		        DesignA design = new DesignA();  
		        design.setEid(Integer.parseInt(ob.get(newMap.get("eid")).toString()));
		        design.setSafe(Integer.parseInt(ob.get(newMap.get("safe")).toString()));
		        //object类型转Double类型  
		        design.setPrewarning(Double.parseDouble(ob.get(newMap.get("prewarning")).toString()));
		        design.setAlarm(Double.parseDouble(ob.get(newMap.get("alarm")).toString()));
		        design.setVoerflow(Double.parseDouble(ob.get(newMap.get("voerflow")).toString()));
		        Date parse = new SimpleDateFormat("yyyy-MM-dd").parse(ob.get(newMap.get("createDate")).toString());
		        design.setCreateDate(parse);
		        //Add方法用于添加一个元素到当前列表的末尾
		        designA.add(design);
		    }  
		    //批量插入
		    designADao.insertDatasFromExcel(designA);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	

}

ServiceImpl-导出

//导出
	@Override
	public List<ProjectDesignDTO> getAllProjectDesignDTO() {
		//获取动态数组  动态的增加和减少元素  实现了ICollection和IList接口  灵活的设置数组的大小
		List<ProjectDesignDTO> projectDesignList=new ArrayList<>();
		//获取列表
		List<ProjectDesign> allProjectDesign= projectDesignDao.getAllProjectDesign();
		//遍历projectDesign获取真值
		 for (ProjectDesign projectDesign : allProjectDesign) {
			 //需要导出的实体类
			ProjectDesignDTO projectDesignDTO=new ProjectDesignDTO();
			projectDesignDTO.setProjectName(projectDesign.getProjectinfoId().getName());
			projectDesignDTO.setName(projectDesign.getName());
			projectDesignDTO.setApplicantUnit(projectDesign.getApplicantUnit());
			projectDesignDTO.setReviewUnit(projectDesign.getReviewUnit());
			projectDesignDTO.setStatus(projectDesign.getStatus());
			projectDesignDTO.setCreateName(projectDesign.getCreator().getCnname());
			projectDesignDTO.setCreateDate(projectDesign.getCreateDate());
			//Add方法用于添加一个元素到当前列表的末尾
			projectDesignList.add(projectDesignDTO);
		}
		 return projectDesignList;
	}

一、导入-xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.city.pms.repository.project.design.designA.DesignADao">
	<resultMap type="DesignA" id="DesignAMap">
		<id property="id" column="id"/>
		<id property="eid" column="eid"/>
		<id property="safe" column="safe"/>
		<id property="prewarning" column="prewarning"/>
		<id property="alarm" column="alarm"/>
		<id property="voerflow" column="voerflow"/>
		<id property="createDate" column="createDate"/>
	</resultMap>
	
	<!-- 批量插入 -->
	<insert id="insertDatasFromExcel" parameterType="java.util.List">
<!-- 		<selectKey resultType ="java.lang.Integer" keyProperty= "ID" order= 
			"AFTER" > SELECT LAST_INSERT_ID() </selectKey > -->
		insert into WARNING 
		(ID,EID,SAFE,PREWARNING,ALARM,OVERFLOW,CREATEDATE)
		SELECT WARNING_SEQUENCE.Nextval ID, A.*
		FROM(
		<foreach collection="list" item="item" index="index"
			separator="union all">
			SELECT
			#{item.eid},
	        #{item.safe},
	        #{item.prewarning},
	        #{item.alarm},
	        #{item.voerflow},
	        #{item.createDate}
				FROM
				DUAL
		</foreach>
		) A
	</insert>
</mapper>

一、Controller

package com.city.pms.controller.project.design.designA;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.LinkedHashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.city.pms.service.project.design.designA.DesignAService;

/**
 * 
 * @Description: TODO 
 * @CreateTime: 2017-11-16 上午10:39:06 
 * @author: zhuhongfei 
 * @version V1.0
 */
@Controller
@RequestMapping("/designa")
public class DesignAController {

	@Autowired
	private DesignAService designAService;
	
	@RequestMapping(value= "toExcel",method = RequestMethod.GET)
	public String toExcel(){
		return "Excel";
	}
	
	//导入
	@RequestMapping(value= "importExcel",method = RequestMethod.GET)
	public String importExcel(HttpServletRequest request, Model model){
		
		try {
		    File f=new File("E:\\嘉兴.xlsx");
			String fileName = "嘉兴.xlsx";
			Map<String, String> headMap=new LinkedHashMap<String, String>();
			headMap.put("eid", "设备编号");
			headMap.put("safe", "安全值");
			headMap.put("prewarning", "预警值");
			headMap.put("alarm", "报警值");
			headMap.put("voerflow", "溢流值");
			headMap.put("createDate", "创建时间");
			//数据导入
			InputStream in2=new FileInputStream(f);
		    designAService.insertDatasFromExcel(in2, fileName, headMap);
		    in2.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return "Excel";
	}
	
	@RequestMapping(value = "/{id}/detail")
	public String detail(@PathVariable String id, Model model) {
		model.addAttribute("d",designAService.save(id));
		return "";
	}
}
	


/**
	 * 数据库数据导入excel(导出)
	 * 
	 * @param response
	 */
	@RequestMapping(value = "exportExcel",method = RequestMethod.GET)
	public void exportExcel(HttpServletResponse response){
			//读取数据库
	        List<ProjectDesignDTO> allProjectDesign = projectDesignService.getAllProjectDesignDTO();
	        //后台返回给前台时,可以把JSON对象转化成JSON字符串
	        com.alibaba.fastjson.JSONArray ja= (com.alibaba.fastjson.JSONArray) com.alibaba.fastjson.JSONArray.toJSON(allProjectDesign);
	        //LinkedHashMap保留插入的顺序(key,value)
	        Map<String,String> headMap = new LinkedHashMap<String,String>();
	        headMap.put("projectName","项目名称");
	        headMap.put("name","方案名称");
	        headMap.put("applicantUnit","申请单位");
	        headMap.put("reviewUnit","评审单位");
	        headMap.put("status","状态");
	        headMap.put("createName","创建人");
	        headMap.put("createDate","创建时间");
	      String title = "工程设计方案 ";
	     //调用工具类导出方法
	     ExcellUtil.downloadExcelFile(title,headMap,ja,response);
	}

一、Jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<base href="<%=basePath%>">
    <title>嘉兴市海绵城市规划建设运营平台</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<link href="css/css2.css" rel="stylesheet" type="text/css" />
	<script type="text/javascript"src="jquery/jquery-3.2.0.min.js"></script>
<style type="text/css">
body{text-align:center}
.ceshi1{margin:0 auto; width:750px;height:100px;}
</style>
  </head>
  
  <body>
    <div class="warpper">
	    <div class="top-warpper">
	        <div class="logo-userInfo">
	            <h1 class="logo"><a href="#" >嘉兴市海绵城市规划建设运营平台</a></h1>
	            </div><br><br>
			<div class="ceshi1">
				<button class="src-derive derive" id="derive">导出</button>
				  
				<!-- <tr>
					<button class="src-derive leadin1" id="leadin" type="file" name="userUploadFile">导入</button> 
                    <td><input type="file" name="userUploadFile"></td>
				</tr> -->
				<form action="/designa/importExcel.do" method="post" enctype="multipart/form-data" name="batchAdd" οnsubmit="return check();">
			        <div class="col-lg-4">
			            <input id="excel_file" type="file" name="filename" accept="xls/xlsx" size="50"/>
			        </div>
			        <input id="excel_button" class="src-derive leadin1" type="submit" value="导入Excel"/>
			       <%--  <font id="importMsg" color="red"><%=importMsg%></font><input type="hidden"/> --%>  
			    </form>
			</div>
			
<script type="text/javascript">
 var root="<%=basePath%>"
</script>
<script type="text/javascript"src="js/excel1.js"></script>
<script type="text/javascript"src="js/excel2.js"></script>

</html>

一、Js

//导出
  		$(document).on("mousedown",".derive",function(){
 			var id=$(this).attr("fileId");
 			window.location.href=root+"/design/exportExcel.do";
 		});
  		//导入
  		$(document).on("mousedown",".leadin1",function(){
  			if(confirm("确定导入?")){
 			var id=$(this).attr("fileId");
 			window.location.href=root+"/designa/importExcel.do";
  			}
 		});










SSM(Spring + SpringMVC + MyBatis)框架可以很方便地实现Excel文件的导入导出。下面是一个简单的实现流程: 1. 导出Excel文件 - 添加POI依赖,例如: ``` <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> </dependency> ``` - 创建一个Excel文件,例如: ``` Workbook workbook = new HSSFWorkbook(); Sheet sheet = workbook.createSheet("Sheet1"); Row row = sheet.createRow(0); Cell cell = row.createCell(0); cell.setCellValue("Hello, world!"); ``` - 将Excel文件写入输出流,例如: ``` response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-disposition", "attachment;filename=test.xls"); OutputStream outputStream = response.getOutputStream(); workbook.write(outputStream); outputStream.flush(); outputStream.close(); ``` 2. 导入Excel文件 - 添加POI依赖,例如: ``` <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> </dependency> ``` - 读取Excel文件,例如: ``` InputStream inputStream = new FileInputStream("test.xls"); Workbook workbook = new HSSFWorkbook(inputStream); Sheet sheet = workbook.getSheetAt(0); Row row = sheet.getRow(0); Cell cell = row.getCell(0); System.out.println(cell.getStringCellValue()); ``` - 将Excel数据保存到数据库,例如: ``` @Autowired private UserService userService; for (int i = 1; i <= sheet.getLastRowNum(); i++) { row = sheet.getRow(i); User user = new User(); user.setName(row.getCell(0).getStringCellValue()); user.setAge((int) row.getCell(1).getNumericCellValue()); userService.saveUser(user); } ``` 以上是一个简单的实现流程,具体实现方式可以根据实际需求进行调整。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值