博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
struts2结合poi-3.7实现数据导出为excel
阅读量:6413 次
发布时间:2019-06-23

本文共 9175 字,大约阅读时间需要 30 分钟。

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

示列截图:

下载后的excel文件:

1、下载poi-3.7相应的jar包,有用的jar包我已经给大家列出来了哦,下载地址:

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

3、代码如下:

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

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
> 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
> mapJCZXFixRec(Integer rjhmId) { List
jcZxFixRecs = queryService.findJCZXFixRec(rjhmId); Map
> map = new HashMap
>(); for (JCZXFixRec jcZxFixRec : jcZxFixRecs) { String unitName = jcZxFixRec.getUnitName(); if (map.get(unitName) == null) { map.put(unitName, new ArrayList
()); } map.get(unitName).add(jcZxFixRec); } return map; } /** * 文件导出 * @param os * @param map */ private void exportExcel(OutputStream os, Map
> map) { // 创建一个excel文件 HSSFWorkbook wb = new HSSFWorkbook(); for (Iterator
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
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的详细介绍及使用方法!

 

你可能感兴趣的文章
注解@Slf4j的作用
查看>>
linux 文件操作与目录操作
查看>>
解决IE6浏览器下position:fixed固定定位问题
查看>>
KMP串匹配算法解析与优化
查看>>
css3动画简介以及动画库animate.css的使用
查看>>
javascript DOM节点操作
查看>>
c++ invoke java in android
查看>>
meta 之 viewport
查看>>
Linux下文件 ~/.bashrc 和 ~/.bash_profile 和 /etc/bashrc 和 /etc/profile 的区别 | 用户登录后加载配置文件的顺序...
查看>>
关于在swiper轮播组件中使用echarts的'click'事件无效
查看>>
Android开源项目README规范
查看>>
asp.net core 教程(五)-配置
查看>>
Spring Bean Scope (作用域)
查看>>
Redis命令操作详解
查看>>
c++ map: 使用struct或者数组做value
查看>>
列表中的陷阱
查看>>
算法-无重复字符的最长子串
查看>>
java.lang.ClassNotFoundException: org.apache.axis2.transport.http.AxisAdminServlet
查看>>
SSL协议详解
查看>>
leetcode-496-Next Greater Element I
查看>>