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源码分享:基于Apache POI,将List<T>内封装的实体类信息写出到磁盘Excel文件(20170905)
- JAVA源码分享:基于Apache POI,将List<T>内封装的实体类信息写出到磁盘Excel文件(20170905)
- JAVA源码分享:基于Apache POI,将List<T>内封装的实体类信息写出到磁盘Excel文件(20170925)
- JAVA源码分享:基于Apache POI,将List<T>内封装的实体类信息写出到磁盘Excel文件(20170615)
- JAVA源码分享:基于Apache POI,将List<T>内封装的实体类信息写出到磁盘Excel文件(20171018)
- JAVA源码分享:基于Apache POI,将List<T>内封装的实体类信息写出到磁盘Excel文件
- java微信网页授权获取用户信息以及JSSDK自定义分享等功能<二>
- java—将查询的结果封装成List<Map>与用回调函数实现数据的动态封装(44)
- java 如何将List<objetct>类型强制转为新的List<实体类>
- Java实现List<Object>转List<实体类>
- java 基于List<MultipartFile>实现多文件上传
- Java程序员的日常—— 基于类的策略模式、List<?>与List、泛型编译警告、同比和环比
- [原]Unity手游之路<三> 基于Unity+Java的聊天室源码
- [原]Unity手游之路<三> 基于Unity+Java的聊天室源码
- java微信网页授权获取用户信息以及JSSDK自定义分享等功能<一>
- SSM框架下分页的实现(封装page.java和List<?>)
- java实现List<Object>转List<实体类>,java实现Object转对象,java实现Object转实体类
- Java 如何将List<实体类> 转为List<Object>类型
- java微信网页授权获取用户信息以及JSSDK自定义分享等功能<四>
- Unity手游之路<三> 基于Unity+Java的聊天室源码