关于使用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;
}
}