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
struts2结合poi-3.7实现数据导出为excel的更多相关文章
- POI之SXSSFWorkbook大量数据导出至excel
一:简介 SXSSFWorkbook是用来生成海量excel数据文件,主要原理是借助临时存储空间生成excel, SXSSFWorkbook专门处理大数据,对于大型 ...
- 使用POI把查询到的数据表数据导出到Excel中,一个表一个sheet.最详细!!!
一.需求 我们会遇到开发任务: 经理:小王,你来做一下把数据库里的数据导出到Excel中,一个表是一个sheet,不要一个表一个Excel. 小王:好的,经理.(内心一脸懵逼) 二.前期准备 首先我们 ...
- Java利用Apache POI将数据库数据导出为excel
将数据库中的数据导出为excel文件,供其他人查看 public class POITest { public static void main(String[] args) { POITest te ...
- 大批量数据导出到Excel的实现
在平时的项目中,将数据导出到Excel的需求是很常见的,在此对一些常见的方法做以总结,并提供一种大数据量导出的实现. OLEDB 使用OLEDB可以很方便导出Excel,思路很简单,处理时将Exc ...
- 学习笔记 DataGridView数据导出为Excel
DataGridView数据导出为Excel 怎样把WinForm下的“DGV”里的绑定数据库后的数据导出到Excel中. 比如:在窗体里有个一“DGV”,DataGridView1,绑定了数据源 ...
- 将C1Chart数据导出到Excel
大多数情况下,当我们说将图表导出到Excel时,意思是将Chart当成图片导出到Excel中.如果是这样,你可以参考帮助文档中保存和导出C1Chart章节. 不过,也有另一种情况,当你想把图表中的数据 ...
- vb.net-三种将datagridview数据导出为excel文件的函数
第一种方法较慢,但是数据格式都比较好,需要引用excel的 Microsoft.Office.Interop.Excel.dll office.dll #Region "导出excel函数 ...
- 数据导出至Excel文件--好库编程网http://code1.okbase.net/codefile/SerializeHelper.cs_2012122018724_118.htm
using System; using System.IO; using System.Data; using System.Collections; using System.Data.OleDb; ...
- 数据导出到Excel中
自己修改后的一个数据导出到Excel的方法,粘出来与大家共享. 只需要将 System.Web.HttpContext.Current.Response.Charset = ...
随机推荐
- 如何严格设置php中session过期时间 (转)
如何严格限制session在30分钟后过期!1.设置客户端cookie的lifetime为30分钟:2.设置session的最大存活周期也为30分钟:3.为每个session值加入时间戳,然后在程序调 ...
- Python3 文件基本修改替换
现有原文件: Somehow, it seems the love I knew was always the most destructive kind 不知为何,我经历的爱情总是最具毁灭性的的那种 ...
- win10安装mysql8.0.15
1:下载mysql8.0.15 https://www.mysql.com/downloads/ 2:下载完解压,增加my.ini配置文件 [mysqld] # 设置3306端口 port= # 设置 ...
- Electron:将前端应用打包成桌面应用
首先戳我下载安装对应版本的node.js. 安装完成后,打开命令行输入node -v以及npm -v查看对应版本.能够正常显示说明安装成功. 写一个最简单的hello world的nodejs应用.n ...
- 初识C#设计模式
利用设计模式可以使我们的代码更灵活,更容易扩展,更容易维护.各种面向对象的程序设计语言都提供了基本相同的机制:比如类.继承.派生.多态等等.但是又有各自的特色,C# 中的反射机制便是一个很重要的工具, ...
- [Luogu1979][NOIP2013]华容道(BFS+SPFA)
考虑从起点到终点的过程,一定是先将空格子移到指定格子旁边,和指定格子交换,再移到下一个指定格子要到的地方,再交换,如此反复. 于是问题分为两个部分: 1.给定两个曼哈顿距离为2的格子求最短路,BFS即 ...
- [TCO2013]Block3Checkers
题意:一个网格上有一些障碍和$3$个在网格边界上的棋子,你要添加一些障碍使得没有两个棋子四连通,问最少添加多少个障碍 官方题解——一张图教你做人... 三个棋子将网格边界分成三段,添加障碍后网格中一定 ...
- maven项目修改项目名
修改pom文件下面三处
- Android 卡顿优化 1 卡顿解析
1, 感知卡顿 用户对卡顿的感知, 主要来源于界面的刷新. 而界面的性能主要是依赖于设备的UI渲染性能. 如果我们的UI设计过于复杂, 或是实现不够好, 设备又不给力, 界面就会像卡住了一样, 给用户 ...
- CDHtmlDialog 基本使用
跳转 Navigate("res://tt.exe/#138"); 138是html的资源号 输入框的Get,set HRESULT CTTDlg::OnButtonCancel( ...