2019-11-21 00:28:01 kangshifu007 阅读数 31
  • 基于SSM的POI导入导出Excel实战

    本课程将给大家分享如何基于SSM实现POI导入导出Excel,并讲解目前企业级JavaWeb应用mvc三层模式的开发流程,可让初学者或者职场萌新掌握如何基于SSM整合第三方框架并采用mvc三层开发模式实现自己的业务模块!

    1272 人正在学习 去看看 钟林森

poi导出Excel文件下载数据

poi上传Excel文件批量的添加数据 : https://blog.csdn.net/kangshifu007/article/details/103149764

步骤 :

1.添加依赖

2.添加工具类 ,

3.根据实际情况创建相对应的实体类(下面有具体的说明)

4.编写controller层代码

5.service层中的代码省略了 , 只需要根据需要查询的条件查询数据 , 把数据封装到一个list集合中 , 然后返回controller层中即可

友情提示 : 本文只是用于导出适量的数据 , 不能用于导出百万级别的数据

 

导出的Excel文件部分数据展示: 颜色等样式都是从Excel模板中读取的

 

1.添加依赖

<!--poi的依赖包-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>4.0.1</version>
        </dependency>
 
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.5</version>
        </dependency>
 
        <!--文件上传 , 一般有下载就有上传 , 可以选择性添加-->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>

2.添加工具类 

说明 : 工具类和下面controller层中的代码相匹配

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class DownloadUtil {
	
	/**
	 * @param filePath 要下载的文件路径
	 * @param returnName 返回的文件名
	 * @param response HttpServletResponse
	 * @param delFlag 是否删除文件
	 */
	protected void download(String filePath,String returnName,HttpServletResponse response,boolean delFlag){
		this.prototypeDownload(new File(filePath), returnName, response, delFlag);
	}


	/**
	 * @param file 要下载的文件
	 * @param returnName 返回的文件名
	 * @param response HttpServletResponse
	 * @param delFlag 是否删除文件
	 */
	protected void download(File file,String returnName,HttpServletResponse response,boolean delFlag){
		this.prototypeDownload(file, returnName, response, delFlag);
	}
	
	/**
	 * @param file 要下载的文件
	 * @param returnName 返回的文件名
	 * @param response HttpServletResponse
	 * @param delFlag 是否删除文件
	 */
	public void prototypeDownload(File file,String returnName,HttpServletResponse response,boolean delFlag){
		// 下载文件
		FileInputStream inputStream = null;
		ServletOutputStream outputStream = null;
		try {
			if(!file.exists()) return;
			response.reset();
			//设置响应类型	PDF文件为"application/pdf",WORD文件为:"application/msword", EXCEL文件为:"application/vnd.ms-excel"。  
			response.setContentType("application/octet-stream;charset=utf-8");

			//设置响应的文件名称,并转换成中文编码
			//returnName = URLEncoder.encode(returnName,"UTF-8");
			returnName = response.encodeURL(new String(returnName.getBytes(),"iso8859-1"));	//保存的文件名,必须和页面编码一致,否则乱码
			
			//attachment作为附件下载;inline客户端机器有安装匹配程序,则直接打开;注意改变配置,清除缓存,否则可能不能看到效果
			response.addHeader("Content-Disposition",   "attachment;filename="+returnName);  
			
			//将文件读入响应流
			inputStream = new FileInputStream(file);
			outputStream = response.getOutputStream();
			int length = 1024;
			int readLength=0;
			byte buf[] = new byte[1024];
			readLength = inputStream.read(buf, 0, length);
			while (readLength != -1) {
				outputStream.write(buf, 0, readLength);
				readLength = inputStream.read(buf, 0, length);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				outputStream.flush();
			} catch (IOException e) {
				e.printStackTrace();
			}
			try {
				outputStream.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			try {
				inputStream.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			//删除原文件
			
			if(delFlag) {				
				file.delete();
			}
		}
	}

	/**
	 * by tony 2013-10-17
	 * @param byteArrayOutputStream 将文件内容写入ByteArrayOutputStream
	 * @param response HttpServletResponse	写入response
	 * @param returnName 返回的文件名
	 */
	public void download(ByteArrayOutputStream byteArrayOutputStream, HttpServletResponse response, String returnName) throws IOException{
		response.setContentType("application/octet-stream;charset=utf-8");
		returnName = response.encodeURL(new String(returnName.getBytes(),"iso8859-1"));			//保存的文件名,必须和页面编码一致,否则乱码
		response.addHeader("Content-Disposition",   "attachment;filename=" + returnName);  
		response.setContentLength(byteArrayOutputStream.size());
		
		ServletOutputStream outputstream = response.getOutputStream();	//取得输出流
		byteArrayOutputStream.writeTo(outputstream);					//写到输出流
		byteArrayOutputStream.close();									//关闭
		outputstream.flush();											//刷数据
	}
}

3.创建相对应的实体类

说明 : 实体类中的属性是下载Excel文件中对应的标题 , 也就是从数据库查询的数据的字段 , 根据项目需求做适当的修改

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

public class ContractProductVo implements Serializable {

    //属性都是Excel表中的每一列对应的标题 , 根据具体的下载情况做具体的修改

	private String customName;		//客户名称
	private String contractNo;		//合同号,订单号
	private String productNo;		//货号
	private Integer cnumber;		//数量
	private String factoryName;		//厂家名称,冗余字段
	private Date deliveryPeriod;	//交货期限
	private Date shipTime;			//船期
	private String tradeTerms;		//贸易条款

	public String getCustomName() {
		return customName;
	}

	public void setCustomName(String customName) {
		this.customName = customName;
	}

	public String getContractNo() {
		return contractNo;
	}

	public void setContractNo(String contractNo) {
		this.contractNo = contractNo;
	}

	public String getProductNo() {
		return productNo;
	}

	public void setProductNo(String productNo) {
		this.productNo = productNo;
	}

	public Integer getCnumber() {
		return cnumber;
	}

	public void setCnumber(Integer cnumber) {
		this.cnumber = cnumber;
	}

	public String getFactoryName() {
		return factoryName;
	}

	public void setFactoryName(String factoryName) {
		this.factoryName = factoryName;
	}

	public Date getDeliveryPeriod() {
		return deliveryPeriod;
	}

	public void setDeliveryPeriod(Date deliveryPeriod) {
		this.deliveryPeriod = deliveryPeriod;
	}

	public Date getShipTime() {
		return shipTime;
	}

	public void setShipTime(Date shipTime) {
		this.shipTime = shipTime;
	}

	public String getTradeTerms() {
		return tradeTerms;
	}

	public void setTradeTerms(String tradeTerms) {
		this.tradeTerms = tradeTerms;
	}
}

4.编写controller层代码(核心代码)

说明 : DownloadUtil downloadUtil = new DownloadUtil();    是第二步导入的工具类 , 因为这个工具类中的方法不是静态的 , 所以使用了new对象的方法的

import com.alibaba.dubbo.config.annotation.Reference;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

@Controller
@RequestMapping("/cargo/contract")
public class ContractPrintController{

    @Reference
    private ContractService contractService;


    /*
    * 出货表的打印
    * */
    @RequestMapping("/printExcel")
    public String printExcel(String inputDate , String companyId) throws IOException {
        //1.根据条件查询数据 , 把数据存在list集合中
        List<ContractProductVo> list = contractService.findByShipTime(inputDate,companyId);
        System.out.println("list集合"+list);
        //2.构建excel , 读取的是webAPP下的模板Excel文件,session.getServletContext().getResourceAsStream();是读取webAPP下的文件
        ///make/xlsprint/tOUTPRODUCT.xlsx  是模板文件在webAPP下的路径
        InputStream is = session.getServletContext().getResourceAsStream("/make/xlsprint/tOUTPRODUCT.xlsx");
        //2.1创建工作簿
        Workbook workbook = new XSSFWorkbook(is);
        //2.2 获得表对象
        Sheet sheet = workbook.getSheetAt(0);
        //2.3 赋值大标题
        Row row = sheet.getRow(0);
        //获得单元格
        Cell cell = row.getCell(1);
        //赋值 , 把标题中的时间设置为前端页面传入的时间
        cell.setCellValue(inputDate.replace("-","年")+"月份出货表");//2012年8月份出货表  2015年01

        //样式部分-> 先获得样式  赋值给其他的行 和 单元格
        row = sheet.getRow(2);
        short lastCellNum = row.getLastCellNum();
        CellStyle[]  cellStyles = new  CellStyle[lastCellNum];
        for (int i = 1; i < lastCellNum; i++) {
            //获得第三行的每一个cell对象
            cell = row.getCell(i);
            cellStyles[i]= cell.getCellStyle(); //将获得每一个样式 复制到数组中
        }


        //2.5 数据部分 一个对象是一行
        int index = 2 ;
        for (ContractProductVo productVo : list) { //165条数据
           
            row = sheet.createRow(index);//创建行
            // "客户",
            cell = row.createCell(1  );//创建单元格
            cell.setCellValue(productVo.getCustomName());//赋值
            cell.setCellStyle(cellStyles[1]);//赋值样式
            // "订单号",
            cell = row.createCell(2 );//创建单元格
            cell.setCellValue(productVo.getContractNo());//赋值
            cell.setCellStyle(cellStyles[2]);//赋值样式
            // "货号",
            cell = row.createCell(3  );//创建单元格
            cell.setCellValue(productVo.getProductNo());//赋值
            cell.setCellStyle(cellStyles[3]);//赋值样式
            // "数量",
            cell = row.createCell(4  );//创建单元格
            cell.setCellValue(productVo.getCnumber());//赋值
            cell.setCellStyle(cellStyles[4]);//赋值样式
            // "工厂",
            cell = row.createCell(5 );//创建单元格
            cell.setCellValue(productVo.getFactoryName());//赋值
            cell.setCellStyle(cellStyles[5]);//赋值样式
            // "工厂交期",
            cell = row.createCell(6  );//创建单元格
            cell.setCellValue(productVo.getDeliveryPeriod());//赋值
            cell.setCellStyle(cellStyles[6]);//赋值样式
            // "船期",
            cell = row.createCell(7 );//创建单元格
            cell.setCellValue(productVo.getShipTime());//赋值
            cell.setCellStyle(cellStyles[7]);//赋值样式
            // "贸易条款"
            cell = row.createCell(8 );//创建单元格
            cell.setCellValue(productVo.getTradeTerms());//赋值
            cell.setCellStyle(cellStyles[8]);//赋值样式

            index ++;//索引增加

        }

        //3.下载即可 不是写到自己本地 写回给浏览器
        DownloadUtil downloadUtil = new DownloadUtil();
        //流
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        // workbook 转换成 流
        workbook.write(byteArrayOutputStream);
        //下载
        downloadUtil.download(byteArrayOutputStream, response, "出货表.xlsx");
        return "redirect:/cargo/contract/print.do";
    }

}

 

2015-08-03 09:11:46 hekewangzi 阅读数 789
  • 基于SSM的POI导入导出Excel实战

    本课程将给大家分享如何基于SSM实现POI导入导出Excel,并讲解目前企业级JavaWeb应用mvc三层模式的开发流程,可让初学者或者职场萌新掌握如何基于SSM整合第三方框架并采用mvc三层开发模式实现自己的业务模块!

    1272 人正在学习 去看看 钟林森
2019-05-07 08:33:31 yuyecsdn 阅读数 122
  • 基于SSM的POI导入导出Excel实战

    本课程将给大家分享如何基于SSM实现POI导入导出Excel,并讲解目前企业级JavaWeb应用mvc三层模式的开发流程,可让初学者或者职场萌新掌握如何基于SSM整合第三方框架并采用mvc三层开发模式实现自己的业务模块!

    1272 人正在学习 去看看 钟林森

Easyui DataGrid Spring mvc poi 数据导出Excel,具体代码:

1、html:

<div class="btnbar-tools">
    <a href="javascript:void(0);" class="count" id="exportHnStatics"><i class="fa fa-pie-chart purple"></i>导出</a>
</div>


2、JS实现,(用Ajax无法导出)

$(document).ready(function(){
    //导出
    $('#exportHnStatics').on('click', function(){
        var mouth=$('#st_mouth').val();
        //查询参数
        param = "?mouth="+mouth;
        window.location.href = basePath+"/api/exportHnStatics"+param;
        
    });
});


3、后台pom.xml依赖添加:

<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.10</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.17</version>
</dependency>
<dependency>
    <groupId>org.apache.directory.studio</groupId>
    <artifactId>org.apache.commons.io</artifactId>
    <version>2.4</version>
</dependency>


4、后台Controller实现:

@RequestMapping(value = "/exportHnStatics")
@ResponseBody
public void exportHnStatics(HttpServletResponse response, HttpServletRequest request, String mouth) {    
    List<Map> listData = this.dataLogService.selectLoginStatistics(params);
 
    //listData格式如下:
    //Map map = new HashMap<>();
    //map.put("date", "2018-09-27");
    //map.put("bjTotal", "100");
    //map.put("tjTotal", "200");
    //map.put("shTotal", "300");
    //List<Map> list = new ArrayList<>();
    //list.add(map);
 
    String columnNames[] = { "日期",  "北京", "天津", "上海"};// 列名
    String keys[] = { "date", "bjTotal", "tjTotal", "shTotal"};// map中的key
    String fileName = "test";
    //导出
    Map<Short, HorizontalAlignment> styleMap = new HashMap<Short, HorizontalAlignment>();
    //可以设置列样式,靠左靠右
    styleMap.put(new Short("1"), HorizontalAlignment.LEFT);
    //调用导出,数据内容为List<Map>格式
    ExportExcelUtils.exportExcel(listData, keys, columnNames, response, fileName, styleMap, request);
}


5、导出ExportExcelUtils工具类封装:

 
 

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.BorderStyle;
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.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
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.SXSSFWorkbook;
 
 
/**
 * @ClassName: ExportExcelUtils
 * @Description: 导出Excel文件
 * @author sam
 * @date 2017年6月23日 上午9:45:03
 */
public class ExportExcelUtils {
    /**
     * @Description: 创建工作簿导出
     * @param list 导出数据集合
     * @param keys 表头数组集合
     * @param columnNames  导出excel里面的列名属性
     * @param styleMap  样式列表[可以使用默认样式]
     * @return
     */
    @SuppressWarnings("rawtypes")
    public static Workbook createWorkbook(List<Map> list, String[] keys,
            String[] columnNames,Map<Short, HorizontalAlignment> styleMap) {
        // 创建excel工作簿
        SXSSFWorkbook wb = new SXSSFWorkbook(1000);
        // 创建第一个sheet(页),并命名
        Sheet sheet = null;
        
        // 创建两种单元格格式
        CellStyle cs = wb.createCellStyle();
        CellStyle cs2 = wb.createCellStyle();
 
        // 创建两种字体
        Font f = wb.createFont();
        Font f2 = wb.createFont();
 
        // 创建第一种字体样式(用于列名)
        f.setFontHeightInPoints((short) 10);
        f.setColor(IndexedColors.BLACK.getIndex());
        f.setBold(true);
 
        // 创建第二种字体样式(用于值)
        f2.setFontHeightInPoints((short) 10);
        f2.setColor(IndexedColors.BLACK.getIndex());
 
        // 设置第一种单元格的样式(用于列名)
        cs.setFont(f);
        cs.setBorderLeft(BorderStyle.THIN);
        cs.setBorderRight(BorderStyle.THIN);
        cs.setBorderTop(BorderStyle.THIN);
        cs.setBorderBottom(BorderStyle.THIN);
        cs.setAlignment(HorizontalAlignment.CENTER);
 
        // 设置第二种单元格的样式(用于值)
        cs2.setFont(f2);
        cs2.setBorderLeft(BorderStyle.THIN);
        cs2.setBorderRight(BorderStyle.THIN);
        cs2.setBorderTop(BorderStyle.THIN);
        cs2.setBorderBottom(BorderStyle.THIN);
        cs2.setAlignment(HorizontalAlignment.CENTER);
        
        int startNum = 0;//sheet开始行
        
        // 设置每行每列的值
        for (int i = 0; i < list.size(); i++) {
            // Row 行,Cell 方格 , Row 和 Cell 都是从0开始计数的
            //超过50000条新建sheet
            int num = i%50000;
            if(0==num){
                startNum = 0;
                sheet = wb.createSheet();
                // 手动设置列宽。第一个参数表示要为第几列设;,第二个参数表示列的宽度,n为列高的像素数。
                for (int k = 0; k < keys.length; k++) {
                    sheet.setColumnWidth((short) k, (short) (45 * 150));
                }
 
                // 创建第一行
                Row row = sheet.createRow((short) 0);
                // 设置列名
                for (int l = 0; l < columnNames.length; l++) {
                    Cell cell = row.createCell(l);
                    cell.setCellValue(columnNames[l]);
                    cell.setCellStyle(cs);
                }
            }
            
            // 创建一行,在页sheet上
            Row row1 = sheet.createRow( startNum + 1);
            startNum++;
            // 在row行上创建一个方格
            for (short j = 0; j < keys.length; j++) {
                Cell cell = row1.createCell(j);
                cell.setCellValue(list.get(i).get(keys[j]) == null ? " " : list.get(i).get(keys[j]).toString());
                //判断是否使用特定样式
                if (styleMap!=null && styleMap.containsKey(j)) {
                    CellStyle csItem = wb.createCellStyle();
                    csItem.setFont(f2);
                    csItem.setBorderLeft(BorderStyle.THIN);
                    csItem.setBorderRight(BorderStyle.THIN);
                    csItem.setBorderTop(BorderStyle.THIN);
                    csItem.setBorderBottom(BorderStyle.THIN);
                    csItem.setAlignment(styleMap.get(j));
                    cell.setCellStyle(csItem);
                }else{
                    cell.setCellStyle(cs2);
                }
            }
        }
        return wb;
    }
    
 
    /**
     * @Description: 导出Excel
     * @param list   导出数据集合
     * @param keys  表头集合
     * @param columnNames  列属性集合
     * @param styleMap  样式列表[可以使用默认样式]
     * @param response  response请求对象
     * @throws Exception
     */
    @SuppressWarnings("rawtypes")
    public static void exportExcel(List<Map> list, String keys[], String columnNames[], HttpServletResponse response,
            String fileName,Map<Short, HorizontalAlignment> styleMap,HttpServletRequest request) throws Exception {
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        // 调用工具类创建excel工作簿
        if(list==null || list.size()==0){
            createEmptyWorkbook(columnNames).write(os);
        } else {
            createWorkbook(list, keys, columnNames,styleMap).write(os);
        }
        byte[] content = os.toByteArray();
        InputStream is = new ByteArrayInputStream(content);
        // 设置response参数,可以打开下载页面
        response.reset();
        fileName = getDownloadFileName(fileName+".xlsx",request);
        response.setContentType("application/vnd.ms-excel;charset=utf-8");
        response.setHeader("Content-Disposition",
                "attachment;filename=" + fileName);
        OutputStream out = response.getOutputStream();
        byte[] b = new byte[2048];
        int length;
        while ((length = is.read(b)) > 0) {
            out.write(b, 0, length);
        }
        // 关闭。
        os.flush();
        os.close();
        is.close();
    }
 
    /**
     * @Description: List数据案例
     * @return
     */
    public static List<Map> getData() {
 
        String keys[] = { "companyName", "companyUserCount", "userCount", "notLoginCount", "useCount", "userPercent" };// map中的key
 
        Map map = new HashMap<>();
        map.put("companyName", 1);
        map.put("companyUserCount", "aaa");
        map.put("userCount", "北京");
        map.put("notLoginCount", "aaa");
        map.put("useCount", "北京");
        map.put("userPercent", "aaa");
 
        Map map2 = new HashMap<>();
        map2.put("companyName", 2);
        map2.put("companyUserCount", "bbb");
        map2.put("userCount", "武汉");
        map2.put("notLoginCount", "bbb");
        map2.put("useCount", "武汉");
        map2.put("userPercent", "bbb");
 
        List<Map> list = new ArrayList<>();
        list.add(map);
        list.add(map2);
 
        return list;
    }
    
    public static String getDownloadFileName(String fileName,HttpServletRequest request) {
        String finalFileName = null;
        try {
            String userAgent = request.getHeader("USER-AGENT");
            if(StringUtils.contains(userAgent, "MSIE")||StringUtils.contains(userAgent, "Edge")||StringUtils.contains(userAgent, "like Gecko")){//IE浏览器
                finalFileName = URLEncoder.encode(fileName,"UTF8");
            }else if(StringUtils.contains(userAgent, "Mozilla")){//google,火狐浏览器
                finalFileName = new String(fileName.getBytes(), "ISO8859-1");
            }else{
                finalFileName = URLEncoder.encode(fileName,"UTF8");//其他浏览器
            }
        } catch (Exception e) {
            
        }
        return finalFileName;
    }
    
    public static Workbook createEmptyWorkbook(String[] columnNames){
        // 创建excel工作簿
        SXSSFWorkbook wb = new SXSSFWorkbook(1000);
        // 创建第一个sheet(页),并命名
        Sheet sheet = null;
        
        // 创建两种单元格格式
        CellStyle cs = wb.createCellStyle();
 
        // 创建两种字体
        Font f = wb.createFont();
 
        // 创建第一种字体样式(用于列名)
        f.setFontHeightInPoints((short) 10);
        f.setColor(IndexedColors.BLACK.getIndex());
        f.setBold(true);
        
        cs.setFont(f);
        cs.setBorderLeft(BorderStyle.THIN);
        cs.setBorderRight(BorderStyle.THIN);
        cs.setBorderTop(BorderStyle.THIN);
        cs.setBorderBottom(BorderStyle.THIN);
        cs.setAlignment(HorizontalAlignment.CENTER);
        
        sheet = wb.createSheet();
        // 手动设置列宽。第一个参数表示要为第几列设;,第二个参数表示列的宽度,n为列高的像素数。
        for (int k = 0; k < columnNames.length; k++) {
            sheet.setColumnWidth((short) k, (short) (45 * 150));
        }
 
        // 创建第一行
        Row row = sheet.createRow((short) 0);
        // 设置列名
        for (int l = 0; l < columnNames.length; l++) {
            Cell cell = row.createCell(l);
            cell.setCellValue(columnNames[l]);
            cell.setCellStyle(cs);
        }
        
        Row row2 = sheet.createRow(1);
        Cell cell = row2.createCell(0);
        cell.setCellValue("未查询到符合条件的数据");
        
        return wb;
    }
}


配置完成!

2018-10-28 20:55:00 chao821 阅读数 245
  • 基于SSM的POI导入导出Excel实战

    本课程将给大家分享如何基于SSM实现POI导入导出Excel,并讲解目前企业级JavaWeb应用mvc三层模式的开发流程,可让初学者或者职场萌新掌握如何基于SSM整合第三方框架并采用mvc三层开发模式实现自己的业务模块!

    1272 人正在学习 去看看 钟林森

一、Apache POI简介

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

二、POI结构

  • HSSF - 提供读写Microsoft Excel XLS格式档案的功能。

  • XSSF - 提供读写Microsoft Excel OOXML XLSX格式档案的功能。

  • HWPF - 提供读写Microsoft Word DOC格式档案的功能。

  • HSLF - 提供读写Microsoft PowerPoint格式档案的功能。

  • HDGF - 提供读Microsoft Visio格式档案的功能。

  • HPBF - 提供读Microsoft Publisher格式档案的功能。

  • HSMF - 提供读Microsoft Outlook格式档案的功能。

三、参考案例

在web开发中,有一个经典的功能,就是数据的导入导出。特别是数据的导出,在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的工作。而数据导出的格式一般是EXCEL或者PDF,我这里介绍下excel的导出。

1、excel表动态设置标题以及内容

package com.xxx.xxx;

import java.util.*;

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.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.web.servlet.view.document.AbstractExcelView;


public class ObjectExcelView extends AbstractExcelView{

	@SuppressWarnings("unchecked")
	@Override
	protected void buildExcelDocument(Map<String, Object> model,
			HSSFWorkbook workbook, HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		// TODO Auto-generated method stub
		Date date = new Date();
		String filename = Tools.date2Str(date, "yyyyMMddHHmmss");
		HSSFSheet sheet;
		HSSFCell cell;
		 
		response.setContentType("application/octet-stream");
		response.setHeader("Content-Disposition", "attachment;filename=" + model.get("preFilename") + filename+".xls");
		sheet = workbook.createSheet("sheet1");
		
		List<String> titles = (List<String>) model.get("titles");
		int len = titles.size();
		HSSFCellStyle headerStyle = workbook.createCellStyle(); //标题样式
		headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		headerStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
		HSSFFont headerFont = workbook.createFont();	//标题字体
		headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
		headerFont.setFontHeightInPoints((short)11);
		headerStyle.setFont(headerFont);
		short width = 20,height=25*20;
		sheet.setDefaultColumnWidth(width);
		for(int i=0; i<len; i++){ //设置标题
			String title = titles.get(i);
			cell = getCell(sheet, 0, i);
			cell.setCellStyle(headerStyle);
			setText(cell,title);
		}
		sheet.getRow(0).setHeight(height);
		
		HSSFCellStyle contentStyle = workbook.createCellStyle(); //内容样式
		contentStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		
		List<HashMap> varList = (List<HashMap>) model.get("varList");
		int varCount = varList.size();
		for(int i=0; i<varCount; i++){
			HashMap vpd = varList.get(i);
			for(int j=0;j<len;j++){
				String varstr = vpd.get("var"+(j+1)) != null ? vpd.get("var"+(j+1)).toString() : "";
				cell = getCell(sheet, i+1, j);
				cell.setCellStyle(contentStyle);
				setText(cell,varstr);
			}
			
		}
		
	}

}

2、导出excel接口

//导出excel
    @RequestMapping("/excel/{beginDate}/{endDate}/{dwei_name}/{xming}")
    @ResponseBody
    public ModelAndView exportExcel(@PathVariable String beginDate, @PathVariable String endDate, @PathVariable String dwei_name,@PathVariable String xming){
        ModelAndView mv = new ModelAndView();
        PageData params=new PageData();
        //当dwei_name或xming字段传值为*时,表示dwei_name或者xming是任意值
        if(dwei_name.equals("*")){
            dwei_name=null;
        }
        if(xming.equals("*")){
            xming=null;
        }
        params.put("beginDate",beginDate);
        params.put("endDate",endDate);
        params.put("xming",xming);
        params.put("dwei_name",dwei_name);
        try{
            Map<String,Object> dataMap = new HashMap<String,Object>();
            List<String> titles = new ArrayList<String>();
            titles.add("姓名");	//2
            titles.add("性别");	//3
            titles.add("单位名称");	//4
            titles.add("职务");	//5
            titles.add("出勤次数");	//7
            titles.add("缺勤次数");	//8
            dataMap.put("titles", titles);
            List<AttendanceResult> varOList = query(params);
            List<PageData> varList = new ArrayList<PageData>();
            for(int i=0;i<varOList.size();i++){
                PageData vpd = new PageData();
                vpd.put("var2", varOList.get(i).getXming());
                vpd.put("var3", varOList.get(i).getXbie());
                vpd.put("var4", varOList.get(i).getDwei_name());
                vpd.put("var5", varOList.get(i).getZwu());
                vpd.put("var7", varOList.get(i).getSum_cqtimes());
                vpd.put("var8", varOList.get(i).getSum_qqtimes());
                varList.add(vpd);
            }
            dataMap.put("varList", varList);
            dataMap.put("preFilename", "attendance");	//文档名称
            ObjectExcelView erv = new ObjectExcelView();
            mv = new ModelAndView(erv,dataMap);
        } catch(Exception e){
            logger.error(e.toString(), e);
        }
        return mv;
    }

参考文档:

官方网站:

http://poi.apache.org/spreadsheet/quick-guide.html

参考博客:

http://langhua9527.iteye.com/blog/388005

2018-12-02 12:24:21 zorro_jin 阅读数 194
  • 基于SSM的POI导入导出Excel实战

    本课程将给大家分享如何基于SSM实现POI导入导出Excel,并讲解目前企业级JavaWeb应用mvc三层模式的开发流程,可让初学者或者职场萌新掌握如何基于SSM整合第三方框架并采用mvc三层开发模式实现自己的业务模块!

    1272 人正在学习 去看看 钟林森

一、Apache POI

        Apache POI是免费开源的、具有能对Microsoft Office格式文件进行读和写功能的Java API。它支持对Microsoft Office各种格式文件的读写,但在实际应用中,我们最常使用的是利用POI来导入导出Excel表格。

        所以这篇文章就主要讲,如何使用POI导出Excel表格,以及动态数据的导出。

二、导入必须的jar包

        若我们只需要导入导出Excel表格,则只需要导入以下三个jar包:poi.jar; poi-ooxml.jar; poi-ooxml-schemas.jar。

        poi-3.9_Excel表格所需jar包下载

三、简单的导出Excel表格示例

public void exportExcel(HttpServletRequest request, HttpServletResponse response) throws IOException{
	/**  创建excel表格  */
	// 1.创建HSSFWorkbook对象(excel的文档对象)
	HSSFWorkbook wb = new HSSFWorkbook();
	// 2.建立新的sheet对象(excel的表单)
	HSSFSheet sheet = wb.createSheet("测试导出表格");
   
	sheet.setDefaultColumnWidth(20);         //设置缺省列宽
	sheet.setDefaultRowHeight((short)22);    // 设置缺省行高
	sheet.setDefaultRowHeightInPoints(22);
	
	/** 添加样式 */
	HSSFCellStyle cellDefStyle = wb.createCellStyle();   // 创建单元格样式
	cellDefStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);   // 设置左右居中
	cellDefStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);    // 设置水平居中
	// 设置单元格边框(四周都有边框线)
	cellDefStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);    // HSSFCellStyle.BORDER_NONE:无边框线
	cellDefStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
	cellDefStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
	cellDefStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
	cellDefStyle.setWrapText(true);  // 自动换行
	// 设置文字样式
	HSSFFont fontDef = wb.createFont();
	fontDef.setFontName("宋体");    // 设置字体类型
	fontDef.setFontHeightInPoints((short)12);    // 设置字体大小
	fontDef.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);   // 设置字体加粗(fontDef.setBold(true)同样有用)
	fontDef.setUnderline(HSSFFont.U_SINGLE);    // 设置下划线
	cellDefStyle.setFont(fontDef);
  
	
	/** 设置标题  */
	// 1.在sheet里创建第一行,参数为行索引(excel的行),可以是0~65535之间的任何一个
	int rowIndex = 0;    // 记录行号
	HSSFRow titleRow = sheet.createRow(rowIndex);
	titleRow.setHeightInPoints(30);    // 设置此行的行高
	// 2.创建单元格(excel的单元格,参数为列索引,可以是0~255之间的任何一个
	HSSFCell cell = titleRow.createCell(0);
	cell.setCellValue("测试导出Excel表格");    // 设置单元格内容
	// 3.设置单元格样式
	cell.setCellStyle(cellDefStyle);
	// 4.合并单元格CellRangeAddress构造参数依次表示起始行,截至行,起始列, 截至列
	sheet.addMergedRegion(new CellRangeAddress(rowIndex, rowIndex, 0, 5));
	++ rowIndex;
	
	/** 设置表格内容  */
	// 1.获取要填入表格的数据(根据自己实际情况获取数据)
	List<T> datas = 。。。
	for (T obj : datas) {
		HSSFRow contentRow = sheet.createRow(rowIndex);
		cell = contentRow.createCell(0);
		cell.setCellValue(obj.getName());
		cell.setCellStyle(cellDefStyle);
		cell = contentRow.createCell(1);
		cell.setCellValue(obj.getSex());
		cell.setCellStyle(cellDefStyle);
		sheet.setColumnWidth(colIndex -1,  256 * 20);    // 设置列宽(第一个参数是列号, 第二个参数是宽度)(setColumnWidth这个方法宽度的单位是字符数的256分之一)
		cell = contentRow.createCell(2);
		cell.setCellValue(obj.getAge());
		cell.setCellStyle(cellcontentStyle);
		sheet.setColumnWidth(colIndex - 1,  256 * 80);
		sheet.addMergedRegion(new CellRangeAddress(rowIndex, rowIndex, 2, 5));    // 合并单元格CellRangeAddress构造参数依次表示起始行,截至行,起始列,截止列
		++ rowIndex;
	}
	
	
	/** 设置行高(前面设置了默认行高,这里只需设置非默认部分,) */
	for (int i = 2; i < rowIndex - 1; i++) {
		HSSFRow row = sheet.getRow(i);
		row.setHeightInPoints(22);
	}
	
	/** 画表格对角线(表格中常有需要画对角线) */
	HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
	HSSFClientAnchor anchor = new HSSFClientAnchor();   // 建立锚点(startRow, startCol, startX, startY, endRow, endCol, endX, endY)
	anchor.setAnchor((short) 1, 5, 0, 0, (short) 3, 6, 0, 0);
	HSSFSimpleShape line = patriarch.createSimpleShape(anchor);    // 建立一个简单的图形
	line.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE);    // 线
	line.setLineStyle(HSSFShape.LINESTYLE_SOLID);    // 实线
	line.setLineWidth(HSSFShape.LINEWIDTH_ONE_PT);   // 设置线条粗细(HSSFShape.LINEWIDTH_ONE_PT表示1pt)
	
	//输出Excel文件
	OutputStream output = response.getOutputStream();
	response.reset();
	response.setCharacterEncoding("UTF-8");        
	String fileName = "导出Excel表格测试文件.xls";
	response.setContentType("application/vnd.ms-excel");
	response.setHeader("Content-disposition", "attachment; filename=" + dealFileName(request, fileName) );
	wb.write(output);
	output.close();
}

/** 处理导出文件名乱码的问题 */ 
public String dealFileName(HttpServletRequest request, String fileName) {
	String returnFileName = "";
	try {
		String userAgent = request.getHeader("USER-AGENT");
		if (userAgent != null && (userAgent.indexOf("MSIE") != -1 || userAgent.indexOf("Trident") != -1) {    // IE浏览器
			returnFileName = java.net.URLEncoder.encode(fileName, "UTF8");
		} else if (userAgent != null && userAgent.indexOf("Mozilla") != -1) {    // 火狐,chrome浏览器等
			returnFileName = new String(fileName.getBytes("UTF-8"), "iso-8859-1");
		}
	} catch (Exception e) {
		e.printStackTrace();
	}
	return returnFileName;
}

四、动态数据的导出简单示例

        当我们要导出的数据格式是一致时,我们可以以对象的形式创建每一行的数据,通过对象数据列表,从而动态导出所有数据表格。

public String exportExcel() {
    try {
        // arg0:数据的集合
        List<?> data = getUserList();
        // arg1:集合中的数据的类型
        Class<?> clazz = User.class;
			
        // 创建工作本
        HSSFWorkbook workbook = new HSSFWorkbook();
        // 创建工作表
        HSSFSheet sheet = workbook.createSheet("Sheet1");
        // 创建第1行
        HSSFRow row = sheet.createRow(0);
			
        // 获取数据的字段列表
        Field[] fields = clazz.getDeclaredFields();
			
        // 创建?个单元格
        for (int i = 0; i < fields.length; i++) {
            // 设置当前字段可见
            fields[i].setAccessible(true);
            // 创建单元格
            HSSFCell cell = row.createCell((short) i);
            // 设计各单元格的数据类型(非必要)
            if ("java.lang.Integer".equals(fields[i].getType().getName())) {
                cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
            } else {
                cell.setCellType(HSSFCell.CELL_TYPE_STRING);
            }
            // 添加数据
            cell.setCellValue(fields[i].getName());
        }
	
        // 循环添加数据
        for (int i = 0; i < data.size(); i++) {
            // 创建第?行
            row = sheet.createRow(i + 1);
            // 循环创建?个单元格
            for (int c = 0; c < fields.length; c++) {
                // 创建单元格
                HSSFCell cell = row.createCell((short) c);
                // 设计各单元格的数据类型(非必要)
                if ("java.lang.Integer".equals(fields[c].getType().getName())) {
                    cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
                } else {
                    cell.setCellType(HSSFCell.CELL_TYPE_STRING);
                }
                // 添加数据
                cell.setCellValue(fields[c].get(data.get(i)).toString());
            }
        }
	
        // 将数据写到输出流对象中
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        workbook.write(out);
        // 通过输出流得到数据的byte[]
        byte[] bytes = out.toByteArray();
        // 关闭流
        out.close(); // 连接型资源都需要close()
        // 基于byte[]创建输入流对象,以返回给客户端
        setExcelStream(new ByteArrayInputStream(bytes));
        // 返回
        return "success";
    } catch (Exception e) {
        e.printStackTrace();
    }
    return "error";
}

注:我们还可以通过自定义注解,获得每一个字段的中文列名,以及该字段是否需要导出。

poi导出excel

阅读数 231

POI导出Excel换行

阅读数 1038

没有更多推荐了,返回首页