java实现导出excel表到磁盘上(二)---封装

关于使用java语言,实现导出数据到excel表的功能,之前写过一个(

java实现导出excel表到磁盘上(二)---封装)简单的写了一下,发现有一点问题,就是使用者使用的时候通用性不好,这一篇做了一些补充优化,是的使用者,可以直接使用,具体如下:

直接贴代码了,代码中有详细的注释:


package com.excel;

import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;


/**
 * 实现导出数据到excel表的功能类
 */
public class CreateExcelToDisk {

	/**
	 * 导出excel文件
	 */
	public void exprotExcel(String filePath, List<Map<String, Object>> list, String[] array) {
		// 第一步、创建一个workbook对象,对应一个Excel文件,如xxx.xls
		HSSFWorkbook wb = new HSSFWorkbook();

		// 第二步、在workbook中添加一个sheet,对应Excel文件中的数据格,这个sheetname随便起
		HSSFSheet sheet = wb.createSheet("sheet_test");

		// 设置表头样式:居中、字体
		HSSFCellStyle style = getCellStyle(wb);

		// 第三步,在sheet中添加表头第0行
		setSheetHeader(wb, sheet, array, style);

		// 第四步、将数据添加到excel表
		insertDatasToSheet(sheet, list, array, style);

		// 第五步,将excel文件存到指定位置
		writeExcelToDisk(filePath, wb);

	}

	/**
	 * 设置表头样式:居中、字体
	 * 
	 * @param wb
	 * @return
	 */
	private HSSFCellStyle getCellStyle(HSSFWorkbook wb) {
		// 设置表头样式:居中、字体
		HSSFCellStyle style = wb.createCellStyle();
		style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式
		style.setFont(setFont(wb));// 设置字体
		return style;
	}

	/**
	 * 设置字体,可不设
	 * 
	 * @param wb
	 */
	private HSSFFont setFont(HSSFWorkbook wb) {
		HSSFFont fontBold = wb.createFont();// 设置字体
		fontBold.setFontHeightInPoints((short) 10);// 设置字体高
		fontBold.setFontName("宋体");// 设置字体类型
		fontBold.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 设置字体宽
		return fontBold;
	}

	/**
	 * 将excel文件存到指定位置
	 * 
	 * @param filePath
	 * @param wb
	 */
	private void writeExcelToDisk(String filePath, HSSFWorkbook wb) {
		try {
			FileOutputStream fout = new FileOutputStream(filePath);
			wb.write(fout);
			fout.close();
			System.out.println("----------------数据已经导出到Excel表格 ,地址为 :" + filePath);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 获得要导出到excel表的数据,并添加导出数据到表中(实际应用中这些数据从数据库得到)
	 * 
	 * @param sheet
	 * @param style
	 */
	private void insertDatasToSheet(HSSFSheet sheet, List<Map<String, Object>> list, String[] array, HSSFCellStyle style) {
		// List<Person> list = getPersonDatas();
		for (int i = 0; i < list.size(); i++) {
			// 创建第i+1行
			HSSFRow row = sheet.createRow((int) i + 1);
			Map<String, Object> map = (Map<String, Object>) list.get(i);
			setCellValue(row, list, sheet, map, array, style);
		}
	}

	/**
	 * 创建单元格,并设置各个列中实际数据的值
	 * 
	 * @param row
	 * @param list
	 * @param sheet
	 * @param p
	 * @param style
	 */
	private void setCellValue(HSSFRow row, List<Map<String, Object>> list, HSSFSheet sheet, Map<String, Object> map, String[] array,
			HSSFCellStyle style) {

		HSSFCell cell = null;
		// 通过表头数组,可以知道有列数
		int i = 0 ;
		for (Map.Entry<String, Object> param : map.entrySet()) {
			cell = row.createCell(i) ;
			String value = String.valueOf(param.getValue()) ;
			setCellValue(value , cell) ;
			
			i ++ ;
		}
	}
	
	/**
	 * 设置单元格值
	 * @param value
	 * @param cell
	 */
	private void setCellValue(String value, HSSFCell cell) {
		if (isNumeric(value) || isInteger(value)) {
			// 数字
			cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
			try {
				int integer = Integer.parseInt(value);
				cell.setCellValue(integer);
			} catch (Exception e) {
				try {
					long l = Long.parseLong(value);
					cell.setCellValue(l);
				} catch (Exception e2) {
					try {
						double d = Double.parseDouble(value);
						cell.setCellValue(d);
					} catch (Exception e3) {
						cell.setCellValue(value);
					}
				}
			}
		} else {
			// 字符串
			cell.setCellType(HSSFCell.CELL_TYPE_STRING);
			cell.setCellValue(value);
		}
	}

	/**
	 * 判断字符串是否为数字
	 * 
	 * @param str
	 * @return
	 */
	public static boolean isNumeric(String str) {
		Pattern pattern = Pattern.compile("-?[0-9]+.?[0-9]+");
		Matcher isNum = pattern.matcher(str);
		if (!isNum.matches()) {
			return false;
		}
		return true;
	}
	
	/**
	 * 判断字符串是否为数字
	 * @param str
	 * @return
	 */
	public static boolean isInteger(String str) {
		for (int i = 0; i < str.length(); i++) {
			if (!Character.isDigit(str.charAt(i))) {
				return false;
			}
		}
		return true;
	}
	
	
	

	/**
	 * 在sheet中添加表头第0行,并创建表头行的列单元,设置表头行样式和各个列的名字
	 * 
	 * @param wb
	 * @param sheet
	 * @param style
	 */
	private void setSheetHeader(HSSFWorkbook wb, HSSFSheet sheet, String[] array, HSSFCellStyle style) {

		// 在sheet中添加表头第0行,
		HSSFRow row = sheet.createRow((int) 0);
		// 创建表头行的列单元,并添加列头
		HSSFCell cell = null;
		// 获得数据头的列名称数据
		// String[] array = getHearData();
		for (int i = 0; i < array.length; i++) {
			// 这个输出编码必须设置,否则汉字会乱码
			cell = row.createCell(i);
			// cell.setEncoding(HSSFCell.ENCODING_UTF_16);
			cell.setCellStyle(style);
			cell.setCellValue(array[i]);
		}
	}

	
	
	public static void main(String[] args) {
		
		//获得数据
		List<Person> list = getPersonDatas();
		
		//转换为list_Map格式
		List<Map<String, Object>> listData = converterToListMapFormat(list) ;

		//获得数据头
		String[] array = getHearData();
		
		new CreateExcelToDisk().exprotExcel(getWindowSavePath(), listData, array);
		
		
	}
	
	/**
	 * 转化为list_map格式-这里调用方可以根据实际情况选择需要的excel格式
	 * @param list
	 * @return
	 */
	private static List<Map<String, Object>> converterToListMapFormat(List<Person> list) {
		List<Map<String, Object>> listData = new ArrayList<Map<String, Object>>();
		for (Person person : list) {
			Map<String, Object> paramters = new LinkedHashMap<String , Object>() ;
			paramters.put("id", person.getId()) ;
			paramters.put("name", person.getName()) ;
			paramters.put("age", person.getAge()) ;
			listData.add(paramters) ;
		}
		return listData ;
	}


	/**
	 * 获得当前时间字符串
	 * @param format
	 * @return
	 */
	private static String getCurrentDateStrBySDF(String format) {
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		String date = sdf.format(new Date());
		return date ;
	}

	/**
	 * 获得window保存路径
	 * @return
	 */
	private static String getWindowSavePath() {
		String date = getCurrentDateStrBySDF("yyyyMMddHHmmss") ;
		String save_window_save_path = "D:/persons/"+date + ".xls"; 
		return save_window_save_path;
	}

	/**
	 * 获得Person类数据集合
	 * 
	 * @return
	 */
	private static List<Person> getPersonDatas() {
		List<Person> list = new ArrayList<Person>();
		for (int i = 0; i < 5; i++) {
			Person p = new Person(i, "person_" + i, 10 + i);
			list.add(p);
		}
		return list;
	}

	/**
	 * 获得excel表头数据
	 * 
	 * @return
	 */
	private static String[] getHearData() {
		String[] array = new String[] { "编号", "姓名", "年龄" };
		return array;
	}

}



猜你喜欢

转载自blog.csdn.net/u011159417/article/details/78222350