您的位置:首页 > 运维架构 > Apache

JAVA源码分享:基于Apache POI,将List<T>内封装的实体类信息写出到磁盘Excel文件(20170220)

2017-02-20 13:53 686 查看

注意事项:

写出Excel文件需要依赖Apache POI包,请自行下载,地址:http://poi.apache.org/。本人使用的版本是3.14,实测3.15可用。其他版本未测试,理论上全部可以兼容;

本源码输出的是97~2003格式的Excel文件(xls格式),若要输出2007格式(xlsx格式),请参照POI文档自行修改源码;

实体类要求重写toString方法,且返回的字符串格式为“变量1=值1,变量2=值2,变量3=值3”形式,其中的逗号和等号均为英文输入状态下半角符号。

ToExcel源码如下:
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
/**
* 写出到Excel文件
* @author AL
*/
public class ToExcel<T> {

/**
* 逗号(英文)
*/
private static final String COMMA =",";

/**
* 等号(英文)
*/
private static final String EQUAL_SIGN ="=";

private Map<String,List<T>> map;//key-value:sheet表格名称-表格内容
private String fileName;//最终输出的文件名(包含路径)

public ToExcel(Map<String, List<T>> map, String fileName) {
this.map = map;
this.fileName = fileName;
}

/**
* 写出内容到Excel
* @throws WriteExcelFailedException
*/
public void toExcel() throws WriteExcelFailedException {
//新建文件输出流及Excel表格缓存区
FileOutputStream out=null;
HSSFWorkbook excle = null;
try {
out = new FileOutputStream(fileName+".xls");
excle = new HSSFWorkbook();
} catch (FileNotFoundException e) {
throw new WriteExcelFailedException("写出Excel失败",e);
}

//若map为空,则重构一个map,装入一个空白键值对
if(map==null || map.isEmpty()){
map=new HashMap<>();
map.put("空", null);
}

//遍历键值对,将表格名称和表格内容传递给下一层,用于写出
for(Entry<String, List<T>> entry : map.entrySet()){
String sheetName=entry.getKey();
List<T> result=entry.getValue();
//向Excel(缓存区)内填充内容
writeWorkbook(result,sheetName,excle);
}

//写出到磁盘文件
writeToDisk(out, excle);
}

/**
* 向Excel(缓存区)内填充内容
* @param result
* @param sheetName
* @param excel
*/
private void writeWorkbook(List<T> result, String sheetName, HSSFWorkbook excel) {
if(sheetName==null  || "".equals(sheetName)){//若sheetName为空,则填充“空”
sheetName="空";
}

HSSFSheet sheet = excel.createSheet(sheetName);

if (result == null || result.isEmpty()) {// 若集合为空,则写出“空”字符
sheet.createRow(0).createCell(0).setCellValue("空");
return;
}

//按照“,”将集合内元素toString的字符串切割成数组
String[] temp = result.get(0).toString().split(COMMA);
HSSFRow row = sheet.createRow(0);//获取此sheet表格的第一行
int times=temp.length;
for (int t = 0; t < times; t++) {//遍历数组,用于构造表头
String str = temp[t];
str = str.substring(0, str.indexOf(EQUAL_SIGN));//只取“=”之前的字符
row.createCell(t).setCellValue(str);
}

//遍历集合,填充表格内容
int size=result.size();
for (int i = 1; i <= size; i++) {
row = sheet.createRow(i);
String[] infos=result.get(i - 1).toString().split(COMMA);//将toString返回的字符串按","切割成数组
int round=infos.length;
for (int j = 0; j < round; j++) {
String info = infos[j];
row.createCell(j).setCellValue(info.substring(info.indexOf(EQUAL_SIGN) + 1, info.length()));//只取“=”之后的字符
}
}
}

/**
* 写出到磁盘文件
* @param out
* @param excel
*/
private void writeToDisk(FileOutputStream out, HSSFWorkbook excel) {
try {
excel.write(out);
if(out!=null){
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

/**
* 异常
* @author AL
*
*/
class WriteExcelFailedException extends Exception {
private static final long serialVersionUID = 1L;

public WriteExcelFailedException() {
super();
}

public WriteExcelFailedException(String message, Throwable cause, boolean enableSuppression,
boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}

public WriteExcelFailedException(String message, Throwable cause) {
super(message, cause);
}

public WriteExcelFailedException(String message) {
super(message);
}

public WriteExcelFailedException(Throwable cause) {
super(cause);
}
}

说明:

构造器public ToExcel(Map<String, List<T>> map, String fileName) {//......}

fileName是Excel文件最终输出时的文件名,包含完整路径;例如:希望最终在E盘的temp文件夹输出一个“你好世界.xls”,则应当传入fileName为“E:/temp/你好世界”,字符串末尾无需包含“.xls”。

map内封装的是需要输出的最终需要输出的内容,输出Excel中可包含多个sheet分页,每个key-value键值对封装一个shee分页。key为分页名称,value为表格内容。

toString格式示例:



输出结果示例:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java excel poi
相关文章推荐