• struts2结合poi-3.7实现数据导出为excel


      我们在处理数据的时候,有可能要将数据导出到excel文件中,那么java中是怎么实现的呢?apache开发的poi就可以帮我们实现啦,它也是开源的代码,导入相应的jar包,就可以轻松实现,下面让我们来小试牛刀吧,呵呵...

    示列截图:

    下载后的excel文件:

    1、下载poi-3.7相应的jar包,有用的jar包我已经给大家列出来了哦,下载地址:http://download.csdn.net/detail/harderxin/5952435

    2、搭建好struts2框架平台,开始编写代码

    3、代码如下:

    实现方式是我把数据从数据库中取出来后封装为map对象,map的键就是我们上面看到的excel的sheet标题,然后map的值是一个个对应的List对象,也就是excel中的一条条数据,然后插入到excel中,下面代码的链接方式:http://localhost:8080/min/excelAction.do?rjhmId=29349

    package com.repair.query.action;
    
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    
    import javax.annotation.Resource;
    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.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.struts2.ServletActionContext;
    
    import com.repair.common.pojo.DatePlanPri;
    import com.repair.common.pojo.JCZXFixRec;
    import com.repair.common.util.Contains;
    import com.repair.query.service.QueryService;
    
    /**
     * 处理Excel文件导入和导出
     * 
     * @author Administrator
     * 
     */
    public class ExcelAction {
    
    	@Resource(name = "queryService")
    	private QueryService queryService;
    
    	/**
    	 * 导出excel
    	 * 
    	 * @return
    	 */
    	public String execute() {
    		HttpServletRequest request = ServletActionContext.getRequest();
    		HttpServletResponse response = ServletActionContext.getResponse();
    		Integer rjhmId = Integer.parseInt(request.getParameter("rjhmId"));
    		DatePlanPri datePlan = queryService.findDatePlanPriById(rjhmId);
    		//将数据从数据库中查询出来,并且自己封装成为一个map对象
    		Map<String, List<JCZXFixRec>> map = this.mapJCZXFixRec(rjhmId);
    		String fileName = datePlan.getJcType() + "-" + datePlan.getFixFreque() + "-" + datePlan.getJcnum() +"-"+dealDateString(datePlan.getKcsj())+".xls";
    		setResponseHeader(response, fileName);
    		try {
    			exportExcel(response.getOutputStream(), map);
    			response.getOutputStream().flush();
    			response.getOutputStream().close();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
    
    	/**
    	 * 将检修记录封装为一个map对象
    	 * 
    	 * @param rjhmId
    	 * @return
    	 */
    	private Map<String, List<JCZXFixRec>> mapJCZXFixRec(Integer rjhmId) {
    		List<JCZXFixRec> jcZxFixRecs = queryService.findJCZXFixRec(rjhmId);
    		Map<String, List<JCZXFixRec>> map = new HashMap<String, List<JCZXFixRec>>();
    		for (JCZXFixRec jcZxFixRec : jcZxFixRecs) {
    			String unitName = jcZxFixRec.getUnitName();
    			if (map.get(unitName) == null) {
    				map.put(unitName, new ArrayList<JCZXFixRec>());
    			}
    			map.get(unitName).add(jcZxFixRec);
    		}
    		return map;
    	}
    
    	/**
    	 * 文件导出
    	 * @param os
    	 * @param map
    	 */
    	private void exportExcel(OutputStream os, Map<String, List<JCZXFixRec>> map) {
    		// 创建一个excel文件
    		HSSFWorkbook wb = new HSSFWorkbook();
    		for (Iterator<String> iterator = map.keySet().iterator(); iterator.hasNext();) {
    			String key = iterator.next();
    			// 创建一个sheet对象
    			HSSFSheet sheet = wb.createSheet(key);
    			//设置单元格宽度
    			sheet.setColumnWidth(1, 6300);
    			sheet.setColumnWidth(4, 5000);
    			// 创建第一行
    			HSSFRow row = sheet.createRow(0);
    			// 设置单元格
    			cteateCell(wb,row,0,"部件");
    			cteateCell(wb,row,1,"检修项目");
    			cteateCell(wb,row,2,"所处节点");
    			cteateCell(wb,row,3,"检修情况");
    			cteateCell(wb,row,4,"配件编号");
    			cteateCell(wb,row,5,"检修人");
    			cteateCell(wb,row,6,"工长");
    			cteateCell(wb,row,7,"质检员");
    			cteateCell(wb,row,8,"技术员");
    			cteateCell(wb,row,9,"交车工长");
    			cteateCell(wb,row,10,"验收员");
    
    			List<JCZXFixRec> jcZxFixRecs = map.get(key);
    			for (int i = 1; i <= jcZxFixRecs.size(); i++) {
    				JCZXFixRec jcZxFixRec = jcZxFixRecs.get(i - 1);
    				row = sheet.createRow(i);
    				cteateCell(wb,row,0,jcZxFixRec.getUnitName());
    				cteateCell(wb,row,1,jcZxFixRec.getItemName());
    				if (jcZxFixRec.getNodeId().intValue() == Contains.ZX_FG_NODEID.intValue()) {
    					cteateCell(wb,row,2,"机车分解");
    				} else {
    					cteateCell(wb,row,2,"车上组装");
    				}
    				if (jcZxFixRec.getUnit() != null && !"".equals(jcZxFixRec.getUnit())) {
    					cteateCell(wb,row,3,jcZxFixRec.getFixSituation() + jcZxFixRec.getUnit());
    				} else {
    					cteateCell(wb,row,3,jcZxFixRec.getFixSituation());
    				}
    				if (jcZxFixRec.getNodeId().intValue() == Contains.ZX_FG_NODEID.intValue()) {
    					//创建单元格,并且给单元格设置值
    					row.createCell(4).setCellValue("/");
    				} else {
    					if(jcZxFixRec.getUpPjNum()==null){
    						row.createCell(4).setCellValue("");
    					}else{
    						cteateCell(wb,row,4,jcZxFixRec.getUpPjNum());
    					}
    				}
    				if(jcZxFixRec.getFixEmp()!=null){
    					row.createCell(5).setCellValue(jcZxFixRec.getFixEmp().substring(1, jcZxFixRec.getFixEmp().length() - 1) + " "
    							+ jcZxFixRec.getFixEmpTime().substring(5,16));
    				}else{
    					row.createCell(5).setCellValue("");
    				}
    				if(jcZxFixRec.getLead()!=null){
    					row.createCell(6).setCellValue(jcZxFixRec.getLead()+" "+jcZxFixRec.getLdAffirmTime().substring(5,16));
    				}else{
    					row.createCell(6).setCellValue("");
    				}
    				if(jcZxFixRec.getQi()==null&&jcZxFixRec.getItemCtrlQi()==1){
    					row.createCell(7).setCellValue("");
    				}else if(jcZxFixRec.getQi()==null&&jcZxFixRec.getItemCtrlQi()==0){
    					row.createCell(7).setCellValue("/");
    				}else{
    					row.createCell(7).setCellValue(jcZxFixRec.getQi()+" "+jcZxFixRec.getQiAffiTime().substring(5,16));
    				}
    				if(jcZxFixRec.getTeachName()==null&&jcZxFixRec.getItemCtrlTech()==1){
    					row.createCell(8).setCellValue("");
    				}else if(jcZxFixRec.getTeachName()==null&&jcZxFixRec.getItemCtrlTech()==0){
    					row.createCell(8).setCellValue("/");
    				}else{
    					row.createCell(8).setCellValue(jcZxFixRec.getTeachName()+" "+jcZxFixRec.getTeachAffiTime().substring(5,16));
    				}
    				if(jcZxFixRec.getCommitLead()==null&&jcZxFixRec.getItemCtrlComld()==1){
    					row.createCell(9).setCellValue("");
    				}else if(jcZxFixRec.getCommitLead()==null&&jcZxFixRec.getItemCtrlComld()==0){
    					row.createCell(9).setCellValue("/");
    				}else{
    					row.createCell(9).setCellValue(jcZxFixRec.getCommitLead()+" "+jcZxFixRec.getComLdAffiTime().substring(5,16));
    				}
    				if(jcZxFixRec.getAcceptEr()==null&&jcZxFixRec.getItemCtrlAcce()==1){
    					row.createCell(10).setCellValue("");
    				}else if(jcZxFixRec.getAcceptEr()==null&&jcZxFixRec.getItemCtrlAcce()==0){
    					row.createCell(10).setCellValue("/");
    				}else{
    					row.createCell(10).setCellValue(jcZxFixRec.getAcceptEr()+" "+jcZxFixRec.getAcceAffiTime().substring(5,16));
    				}
    			}
    
    			sheet.autoSizeColumn(5);//调整第六列的宽度
    			sheet.autoSizeColumn(6);//调整第七列的宽度
    			sheet.autoSizeColumn(7);//调整第八列的宽度
    			sheet.autoSizeColumn(8);//调整第九列的宽度
    			sheet.autoSizeColumn(9);//调整第十列的宽度
    			sheet.autoSizeColumn(10);//调整第11列的宽度
    		}
    		try {
    			wb.write(os);
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    
    	/** 设置响应头 */
    	public void setResponseHeader(HttpServletResponse response, String fileName) {
    		try {
    			// response.setContentType("application/msexcel;charset=UTF-8"); //两种方法都可以
    			response.setContentType("application/octet-stream;charset=iso-8859-1");
    			response.setHeader("Content-Disposition", "attachment;filename=" + java.net.URLEncoder.encode(fileName, "UTF-8"));
    			// 客户端不缓存
    			response.addHeader("Pargam", "no-cache");
    			response.addHeader("Cache-Control", "no-cache");
    		} catch (Exception ex) {
    			ex.printStackTrace();
    		}
    	}
    	
    	/**
    	 * 创建带有样式的表格
    	 * @param wb
    	 * @param row
    	 * @param col
    	 * @param val
    	 */
    	private void cteateCell(HSSFWorkbook wb,HSSFRow row,int col,String val)
        {
    		//创建一个celll单元格
            HSSFCell cell=row.createCell(col);
            cell.setCellValue(val);
            //创建样式
            HSSFCellStyle cellstyle=wb.createCellStyle();
            cellstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER_SELECTION);//居中对齐
            cellstyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直方向居中对齐
           // cellstyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);//带边框
            cellstyle.setWrapText(true);//设置自动换行
            cell.setCellStyle(cellstyle);//给单元格设置样式
        }
    	
    	/**
    	 * 格式数据
    	 * @param str
    	 * @return
    	 */
    	@SuppressWarnings("unused")
    	private String format(String str) {
    		if (str != null && !"".equals(str)) {
    			return str;
    		}
    		return "";
    	}
    	
    	/**
    	 * 处理日期字符串
    	 * @param date
    	 * @return
    	 */
    	private String dealDateString(String date){
    		if(date!=null&&!"".equals(date)){
    			String[] str=date.split("-");
    			return str[1]+str[2].substring(0,2);
    		}else{
    			return "";
    		}
    	}
    
    }
    


    4、理解上面的代码其实很简单,操作excel中的poi的对象也就是HSSFWorkbook(创建excel文件)、HSSFSheet(创建excel中的sheet)、HSSFRow(创建excel中sheet中的一行),HSSFCell(创建一个cell单元格)、HSSFCellStyle(定义单元格样式),主要就是这些对象了,里面的方法也很好理解的哦!

    POI中可能会用到一些需要设置EXCEL单元格格式的操作小结:

    先获取工作薄对象:

    HSSFWorkbook wb = new HSSFWorkbook();

    HSSFSheet sheet = wb.createSheet();

    HSSFCellStyle setBorder = wb.createCellStyle();

    一、设置背景色:

    setBorder.setFillForegroundColor((short) 13);// 设置背景色
    setBorder.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

    二、设置边框:

    setBorder.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
    setBorder.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
    setBorder.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
    setBorder.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框

    三、设置居中:

    setBorder.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中

    四、设置字体:

    HSSFFont font = wb.createFont();
    font.setFontName("黑体");
    font.setFontHeightInPoints((short) 16);//设置字体大小

    HSSFFont font2 = wb.createFont();
    font2.setFontName("仿宋_GB2312");
    font2.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//粗体显示
    font2.setFontHeightInPoints((short) 12);

    setBorder.setFont(font);//选择需要用到的字体格式

    五、设置列宽:

    sheet.setColumnWidth(0, 3766); //第一个参数代表列id(从0开始),第2个参数代表宽度值  参考 :"2012-08-10"的宽度为2500

    六、设置自动换行:

    setBorder.setWrapText(true);//设置自动换行

    七、合并单元格:

    Region region1 = new Region(0, (short) 0, 0, (short) 6);

    //参数1:行号 参数2:起始列号 参数3:行号 参数4:终止列号

    或者用

    CellRangeAddress region1 = new CellRangeAddress(rowNumber, rowNumber, (short) 0, (short) 11);

    但应注意两个构造方法的参数不是一样的,具体使用哪个取决于POI的不同版本。
    sheet.addMergedRegion(region1);

    目前用过的就这么多,后续有新的会继续添加。

    5、大家也可以从这里下载poi的详细介绍及使用方法!
    http://download.csdn.net/detail/harderxin/5953617

  • 相关阅读:
    挺喜欢的一幅摄影作品,不知道作者 不知道出处...
    使用触发器来监控表的使用情况
    SQL Server 针对表的只读权限分配
    tnslsnr.exe进程占用大量内存的解决.
    记录一次MYSQL的备份(浅尝辄止型)
    记录temp被撑爆的一次SQL tuning
    Bug 5880921 V$SYSMETRIC_HISTORY 的时间错乱
    sqlite3学习记录
    指针 数组指针 指针数组 函数指针等说明。
    c/c++ 运算符 优先级 结合性 记录
  • 原文地址:https://www.cnblogs.com/james1207/p/3260628.html
Copyright © 2020-2023  润新知