POI导出excel的整个过程

第一步:导入包必要的包

官方指导引入的包      



自己使用的包


第二步: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


@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);
	}
}


未完,待续


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值