第一步:导入包必要的包
官方指导引入的包
自己使用的包
第二步:excel导出的实现
已经存在的类
/**
* UserWallet entity. @author MyEclipse Persistence Tools
*/
public class UserWallet implements java.io.Serializable {
// Fields
private Integer uid;
private Float money;
// Constructors
/** default constructor */
public UserWallet() {
}
/**
*
* <p>Description:这里是自己手动添加的! </p>
* 不能自己修改一下构造函数
* @param uid
* @param money
*//*
public UserWallet(Integer uid, Float money) {
super();
this.uid = uid;
this.money = money;
}*/
/** full constructor */
public UserWallet(Float money) {
this.money = money;
}
// Property accessors
public Integer getUid() {
return this.uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public Float getMoney() {
return this.money;
}
public void setMoney(Float money) {
this.money = money;
}
}
最基本的使用情况(针对已经存在的类)
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.swing.JOptionPane;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import cn.com.jsoft.jframe.entities.UserWallet;
/**
* 利用开源组件POI3.0.2动态导出EXCEL文档
*
* @author csz
* @version v1.0
* @param <T>
* 应用泛型,代表任意一个符合javabean风格的类
* 注意这里为了简单起见,boolean型的属性xxx的get器方式为getXxx(),而不是isXxx()
*/
public class ExportExcel_csz<T> {
//最基本的调用情况
public void Export(){
//声明一个工作簿
HSSFWorkbook hwb = new HSSFWorkbook();
//声明一个单子并命名
HSSFSheet sheet = hwb.createSheet("设备故障");
//给单子名称一个长度
sheet.setDefaultColumnWidth((short)15);
//生成一个样式
HSSFCellStyle style = hwb.createCellStyle();
//创建第一行(也可以成为表头)
HSSFRow row = sheet.createRow(0);
//样式字体居中
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//给表头第一行一次创建单元格
HSSFCell cell = row.createCell((short) 0);
cell.setCellValue("用户编号");
cell.setCellStyle(style);
cell = row.createCell((short)1);
cell.setCellValue("余额");
cell.setCellStyle(style);
//添加数据
List<UserWallet> list = new ArrayList<UserWallet>();
/*list.add(new UserWallet(45,5.20f));
list.add(new UserWallet(78,8.88f));
list.add(new UserWallet(106,2.88f));*/
//向单元格里添加数据
for(short i=0;i<list.size();i++){
row = sheet.createRow(i+1);
row.createCell(0).setCellValue(list.get(i).getUid());
row.createCell(1).setCellValue(list.get(i).getMoney());
}
try {
FileOutputStream out = new FileOutputStream("F://学生.xls");
hwb.write(out);
out.close();
JOptionPane.showMessageDialog(null, "导出成功!");
} catch (FileNotFoundException e) {
JOptionPane.showMessageDialog(null, "导出失败!");
e.printStackTrace();
} catch (IOException e) {
JOptionPane.showConfirmDialog(null, "导出失败!");
e.printStackTrace();
}
}
集合实现
/**
* **********按客户需求的字段导出(list集合实现)***********
* 这是一个通用的方法,利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出
*
* @param title
* 表格标题名
* @param headersName
* 表格属性列名数组
* @param headersId
* 表格属性列名对应的字段(客户想要导出的字段)
* @param dataset
* 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象
* @param out
* 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
*/
@SuppressWarnings("unchecked")
public void exportExcel(String title,String[] headersName, List<T> dtolist,String[] headerIds){
//**************表头map*******************
Map<Integer, String> map = new HashMap<Integer, String>();
int key = 0;
for(int i=0 ;i<headersName.length;i++){
if(!headersName[i].equals(null)){
map.put(key, headersName[i]);
key++;
}
}
//*********字段map************
Map<Integer, String> fontMap = new HashMap<Integer, String>();
int value=0;
for(int i=0;i<headerIds.length;i++){
if(!headerIds[i].equals(null)){
fontMap.put(value, headerIds[i]);
value++;
}
}
// *******************声明一个工作薄*********************
HSSFWorkbook hwb = new HSSFWorkbook();
HSSFSheet sheet = hwb.createSheet(title);
sheet.setDefaultColumnWidth((short)15);
//生成一个样式
HSSFCellStyle style = hwb.createCellStyle();
HSSFRow row = sheet.createRow(0);
//居中
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
HSSFCell cell;
//***************根据选择的字段生成表头*********************
Collection c = map.values();//将 map的值返回一个集合
Iterator<String> it = c.iterator();//将集合变成迭代器
short size = 0;
while(it.hasNext()){
cell = row.createCell(size);
cell.setCellValue(it.next());
cell.setCellStyle(style);
size++;
}
//****************根据字段生成表格内容***********************
Collection fontC = fontMap.values();
Iterator<?> labIt = dtolist.iterator();//数据集合
int fontRow = 0;
while(labIt.hasNext()){
int fontCell = 0; //第一列
fontRow++;
row = sheet.createRow(fontRow);//从第一行开始
T l = (T)labIt.next();
// 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值
Field[] fields = l.getClass().getDeclaredFields();//只能获取自己声明的各种字段,包括public,protected,private。
for (short i = 0; i < fields.length; i++) {
Field field = fields[i];
String fieldName = field.getName();//获取名称直接field.getName(),但是属性值则是field.get(Object),这个object是该field所属的
System.out.println("第"+i+"步:"+fieldName);
Iterator<String> zdIt = fontC.iterator();
while (zdIt.hasNext()) {
if (zdIt.next().equals(fieldName)) {
String getMethodName = "get"
+ fieldName.substring(0, 1).toUpperCase()
+ fieldName.substring(1);
Class tCls = l.getClass();
System.out.println("2:"+getMethodName);
try {
Method getMethod = tCls.getMethod(getMethodName,
new Class[] {});
Object val = getMethod.invoke(l, new Object[] {});
// System.out.println(fields[i].getName());
// System.out.println(val);
String textVal = null;
if (val!= null) {
textVal = val.toString();
}else{
textVal = null;
}
row.createCell((short) fontCell).setCellValue(textVal);
fontCell++;
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
}
}
try {
FileOutputStream xls = new FileOutputStream("C://Users//Administrator//Desktop//"+title+".xls");
hwb.write(xls);
xls.close();
JOptionPane.showMessageDialog(null, "导出成功!");
} catch (FileNotFoundException e) {
JOptionPane.showMessageDialog(null, "导出失败!");
e.printStackTrace();
} catch (IOException e) {
JOptionPane.showMessageDialog(null, "导出失败!");
e.printStackTrace();
}
}
map集合实现
/**
* **********按客户需求的字段导出(Map<String,Object>实现)***********
* 这是一个通用的方法,利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出
* @param title 表格标题名
* @param headersName 表格属性列名数组
* @param dataMap 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象
* @param out 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
*/
public void exportExcel(String title,String[] headersName,List<Map<String, Object>> dataMap){
//**************表头map*******************
Map<Integer, String> map = new HashMap<Integer, String>();
int key = 0;
for(int i=0 ;i<headersName.length;i++){
if(!headersName[i].equals(null)){
map.put(key, headersName[i]);
key++;
}
}
// *******************声明一个工作薄*********************
HSSFWorkbook hwb = new HSSFWorkbook();
HSSFSheet sheet = hwb.createSheet(title);
sheet.setDefaultColumnWidth((short)15);
//生成第一个样式
HSSFCellStyle style = hwb.createCellStyle();
HSSFRow row = sheet.createRow(0);//第一行
//居中
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
HSSFCell cell;
//生成第二个样式:如果生成的数字是整数,则使用这个样式
HSSFCellStyle style1 = hwb.createCellStyle();
style1.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//***************根据选择的字段生成表头*********************
Collection c = map.values();//将 map的值返回一个集合
Iterator<String> it = c.iterator();//将集合变成迭代器
short size = 0;
while(it.hasNext()){
cell = row.createCell(size);//创建行的每个列
cell.setCellValue(it.next());
cell.setCellStyle(style);
size++;
}
//****************字段内容*****************
int index=0;
for (Map<String, Object> mapEntity : dataMap) {
row = sheet.createRow(++index);
int cellCount = 0;
for (Map.Entry<String, Object> eSet : mapEntity.entrySet()) {
cell = row.createCell(cellCount++);
//先用正则表达式判断是否为数值型
Boolean isNum = false;//data是否为数值型
Boolean isInteger=false;//data是否为整数
//Boolean isPercent=false;//data是否为百分数
int strLength=0;
Object data = eSet.getValue();
if(data!=null){
//判断data是否为数值型
isNum = data.toString().matches("^(-?\\d+)(\\.\\d+)?$");
//判断data是否为整数(小数部分是否为0)
isInteger=data.toString().matches("^[-\\+]?[\\d]*$");
//判断是否为整数
//isInteger=data.toString().matches("^\\d+$|-\\d+$");
//判断data是否为百分数(是否包含“%”)
//isPercent=data.toString().contains("%");
//判断数字的长度
strLength = data.toString().length();
}
//如果单元格内容是数值类型,涉及到金钱(金额、本、利),则设置cell的类型为数值型,设置data的类型为数值类型
if(isNum && strLength!=9){
HSSFDataFormat hdf = hwb.createDataFormat();//设置数据格式
if(isInteger){
//style.setDataFormat(hdf.getBuiltinFormat("#,#0"));//数据格式只显示整数
cell.setCellStyle(style1);
cell.setCellValue(Double.parseDouble(data.toString()));//不能增加样式了吗?
}else{
style.setDataFormat(hdf.getBuiltinFormat("#,##0.00"));//保留两位小数点
//设置单元格式
cell.setCellStyle(style);
// 设置单元格内容为double类型
cell.setCellValue(Double.parseDouble(data.toString()));
}
}else{
if(eSet.getKey().equals("createtime") || eSet.getKey().equals("read_time")){
cell.setCellStyle(style);
SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
cell.setCellValue(sdf.format(data));//将Object装换成 String
}else{
cell.setCellStyle(style);
cell.setCellValue(data.toString());
}
}
}
}
try {
FileOutputStream out = new FileOutputStream("C://Users//Administrator//Desktop//"+title+".xls");
hwb.write(out);
out.close();
JOptionPane.showMessageDialog(null, "导出成功");
} catch (FileNotFoundException e) {
JOptionPane.showMessageDialog(null, "导出失败");
e.printStackTrace();
} catch (IOException e) {
JOptionPane.showMessageDialog(null, "导出失败");
e.printStackTrace();
}
}
}
第三步:增加jsp (table)页面
<table id="table_p">
<thead>
<tr>
<th>
SN
</th>
<th>
备注名称
</th>
<th>
用户级别
</th>
<th>
(持有/使用)者
</th>
<th>
关联表数量
</th>
<th>
<%--<a style="color: black;"
href="javascript:stateClick(${wipmState});">通信状态</a>
--%>
通信状态
</th>
<th>
设备状态
</th>
<th>
<%--<a style="color: black;"
href="javascript:moneyClick(${monthMoney});">本月电费</a>
--%>
本月电费
</th>
<th>
余额
</th>
<th>
操作
</th>
</tr>
</thead>
<tr>...</tr><a href="javascript:void(0);" οnclick="exportExcel()">导出数据</a>
</table>
增加js:
<script type="text/javascript" src="../patternFron/pattern/js/jquery-1.8.2.min.js"></script>
<script type="text/javascript">
function exportExcel(){
//第一步获取 th中的值
var tab = document.getElementById("table_p");//获取到这个表并且用变量记住它
var rows = tab.getElementsByTagName("tr")[0];//利用上面获取到的表 获取第一行
var lie = rows.getElementsByTagName('th');//利用上面获取到的行来获取第一行的列属性
var arr = new Array();
for(var i=0;i<lie.length;i++){
var col = rows.getElementsByTagName('th')[i];
var coll = col.innerHTML;
//alert(coll);
arr[i] = coll;
}
$.ajax({
type:'post',
url:'${basePath }/power/exportExcel.html',
dataType:'json',
traditional: true, //有这个值,arr数组才会传到后台.如果你想要用传统的方式来序列化数据,设置为true
data:{"da":arr},
success:function(data){
}
});
}
</script>
@Controller
@RequestMapping("/power/")
public class PowerStationController{
<span style="white-space:pre"> </span>//定义全局变量
ExportExcel_csz<List<Map<String, Object>>> csz =new ExportExcel_csz<List<Map<String,Object>>>();
//excelList是从之前加载的地方传过来的,也可以默认写一个Liat<Map<String,Object>>作为测试用
private List<Map<String, Object>> excelList = new ArrayList<Map<String,Object>>();
<span style="white-space:pre"> </span>/**下载execl文件
* @param request
* @param response
* @return
*/
@RequestMapping(value = "exportExcel.jspx")
public void exportExcel(HttpServletRequest request, HttpServletResponse response) {
<span style="white-space:pre"> </span>//获取表头
String[] as=request.getParameterValues("da");
int length = as.length;//得到指定长度
String[] ths =new String[length];//初始化字符串数组
int i=0;
for (String string : as) {
String tea=string.trim();//trim()这个方法是用来清楚空格键的
ths[i] = tea;
i++;
}
//获取数据值字段内容
List<Map<String, Object>> dataList = new ArrayList<Map<String,Object>>();
for (Map<String, Object> singleMap : excelList) {
Map<String, Object> dataMap = new LinkedHashMap<String, Object>();//能够按输入顺序输出
dataMap.put("wipm_sn",singleMap.get("wipm_sn"));
dataMap.put("nicename", singleMap.get("nicename"));
dataMap.put("level", (Integer)singleMap.get("level")==0?"持有者":"使用者");
dataMap.put("levelname", singleMap.get("levelname")==null?"本人":singleMap.get("levelname"));
dataMap.put("relEquipCount", (Integer)singleMap.get("relEquipCount")==0?0:singleMap.get("relEquipCount"));
dataMap.put("wipm_state", (Integer)singleMap.get("wipm_state")==1?"在线":"离线");
dataMap.put("wipminfo_state", (Integer)singleMap.get("wipminfo_state")==1?"通电":"非通电");
dataMap.put("monthMoney", singleMap.get("monthMoney"));
dataMap.put("balance", singleMap.get("balance"));
dataMap.put("chechin_state", (Integer)singleMap.get("chechin_state")==1?"空置":"非空置");
dataList.add(dataMap);
}
System.out.println(dataList.toString());
csz.exportExcel("shixiana", ths, dataList);
}
}
未完,待续