效果如下:

代码如下:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; 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;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.util.CellRangeAddress;
/**
* 使用该类时,确定引入的poi相关的jar包
* Maven如下:
* <!-- POI -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.15</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.15</version>
</dependency>
* @author Mr.wang
* @date 2018/06/14
*
*/
public class ExcelUtils {
public static void main(String[] args) throws IOException {
List<String> title = Arrays.asList("姓名", "年龄", "生日", "邮箱"); List<List<String>> personInfos = new ArrayList<List<String>>();
List<String> person01 = Arrays.asList("Ben", "26", "1992-02-12", "ben@sina.com");
List<String> person02 = Arrays.asList("Tom", "27", "1993-08-18", "tom@sina.com");
List<String> person03 = Arrays.asList("Jack", "28", "1994-03-28", "jack@sina.com");
List<String> person04 = Arrays.asList("恩索", "29", "1995-01-09", "enso@sina.com");
personInfos.add(person01);
personInfos.add(person02);
personInfos.add(person03);
personInfos.add(person04); File file = new File("D:/demo.xls"); //createExcelFile(title, personInfos, file, null);
createExcelFileWithHead(title, personInfos, file, null, "个人信息表"); } /**
* 由生成流的方法进一步封装成生成excel(.xls)的文件
* @see #createExcelInStream(List, List, OutputStream, String)
* @param title
* @param listData
* @param fileWithPathAndName
* @param sheetName
* @throws IOException
*/
public static void createExcelFile(List<String> title, List<List<String>> listData, File fileWithPathAndName,
String sheetName) throws IOException {
FileOutputStream fos=new FileOutputStream(fileWithPathAndName);
createExcelInStream(title, listData, fos, sheetName);
if(fos!=null) {
fos.close();
}
} /**
* 由生成流的方法进一步封装成生成excel(.xls)的文件
* @see #createExcelInStreamWithHead(List, List, OutputStream, String, String)
* @param title
* @param listData
* @param fileWithPathAndName
* @param sheetName
* @param header
* @throws IOException
*/
public static void createExcelFileWithHead(List<String> title, List<List<String>> listData, File fileWithPathAndName,
String sheetName,String header) throws IOException {
FileOutputStream fos=new FileOutputStream(fileWithPathAndName);
createExcelInStreamWithHead(title, listData, fos, sheetName, header);
if(fos!=null) {
fos.close();
}
}
/**
* create by Mr.wang 2018/06/14
*
* 生成excel流(不带表头)。以xls为后缀的文件,防止有些电脑不支持office07以上的
*
* @param title
* 标题
* @param listData
* 数据内容
* @param outputStream
* 输出的流
* @param sheetName
* 创建的sheet(不是文件)的名称,如果有空,则采用sheet1作用默认的表名称
* @throws IOException
*
*
* example:
*
* List<String> title = Arrays.asList("姓名", "年龄", "生日", "邮箱"); List<List<String>> personInfos = new ArrayList<List<String>>();
List<String> person01 = Arrays.asList("Ben", "26", "1992-02-12", "ben@sina.com");
List<String> person02 = Arrays.asList("Tom", "27", "1993-08-18", "tom@sina.com");
List<String> person03 = Arrays.asList("Jack", "28", "1994-03-28", "jack@sina.com");
List<String> person04 = Arrays.asList("恩索", "29", "1995-01-09", "enso@sina.com");
personInfos.add(person01);
personInfos.add(person02);
personInfos.add(person03);
personInfos.add(person04); File file = new File("D:/demo.xls");
FileOutputStream fos=new FileOutputStream(file); createExcelFile(title, personInfos, fos, null);
...
*
*/
@SuppressWarnings("deprecation")
public static void createExcelInStream(List<String> title, List<List<String>> listData, OutputStream outputStream,
String sheetName) throws IOException {
// 创建工作簿
HSSFWorkbook workBook = new HSSFWorkbook(); // 创建工作表 工作表的名字叫helloWorld
if (sheetName == null || sheetName.length() == 0) {
sheetName = "sheet1";
}
HSSFSheet sheet = workBook.createSheet(sheetName); // 创建单元格,首先设置标题
HSSFFont fontTitle = workBook.createFont();
fontTitle.setBold(true);
HSSFCellStyle titleStyle = workBook.createCellStyle();
titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
titleStyle.setFont(fontTitle);
HSSFRow titleRow = sheet.createRow(0);
for (int i = 0; i < title.size(); i++) {
HSSFCell titleCol = titleRow.createCell(i, CellType.STRING);
titleCol.setCellValue(title.get(i));
titleCol.setCellStyle(titleStyle);
}
sheet.autoSizeColumn(0);
// 创建数据行
HSSFCellStyle dataStyle = workBook.createCellStyle();
dataStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
for (int i = 0; i < listData.size(); i++) {
HSSFRow dataRow = sheet.createRow(i + 1);
List<String> rowData = listData.get(i);
for (int j = 0; j < rowData.size(); j++) {
HSSFCell dataCol = dataRow.createCell(j, CellType.STRING);
dataCol.setCellValue(rowData.get(j));
dataCol.setCellStyle(dataStyle);
}
sheet.autoSizeColumn(i);
} HSSFRow firstRow = sheet.getRow(0);
int lastCellNum = firstRow.getLastCellNum();
//为了美观,把所有的cell扩大1/2
for(int i=0;i<lastCellNum;i++) {
int columnWidth = sheet.getColumnWidth(i);
sheet.setColumnWidth(i, columnWidth+columnWidth*1/2);
} workBook.write(outputStream); workBook.close();// 最后记得关闭工作簿
} /**
* create by Mr.wang 2018/06/14
*
* 生成excel流(带表头)。以xls为后缀的文件,防止有些电脑不支持office07以上的
*
* @param title
* 标题
* @param listData
* 数据内容
* @param outputStream
* 输出的流
* @param sheetName
* 创建的sheet(不是文件)的名称,如果有空,则采用sheet1作用默认的表名称
* @param header
* 表的表头
* @throws IOException
*
*
* example:
*
* List<String> title = Arrays.asList("姓名", "年龄", "生日", "邮箱"); List<List<String>> personInfos = new ArrayList<List<String>>();
List<String> person01 = Arrays.asList("Ben", "26", "1992-02-12", "ben@sina.com");
List<String> person02 = Arrays.asList("Tom", "27", "1993-08-18", "tom@sina.com");
List<String> person03 = Arrays.asList("Jack", "28", "1994-03-28", "jack@sina.com");
List<String> person04 = Arrays.asList("恩索", "29", "1995-01-09", "enso@sina.com");
personInfos.add(person01);
personInfos.add(person02);
personInfos.add(person03);
personInfos.add(person04); File file = new File("D:/demo.xls");
FileOutputStream fos=new FileOutputStream(file); createExcelFileWithHead(title, personInfos, fos, null, "个人信息表");
...
*
*/
@SuppressWarnings("deprecation")
public static void createExcelInStreamWithHead(List<String> title, List<List<String>> listData, OutputStream outputStream,
String sheetName,String header) throws IOException {
// 创建工作簿
HSSFWorkbook workBook = new HSSFWorkbook(); // 创建工作表 工作表的名字叫helloWorld
if (sheetName == null || sheetName.length() == 0) {
sheetName = "sheet1";
}
HSSFSheet sheet = workBook.createSheet(sheetName); //设置表头
//参数说明:1:开始行 2:结束行 3:开始列 4:结束列
//比如我要合并 第二行到第四行的 第六列到第八列 sheet.addMergedRegion(new CellRangeAddress(1,3,5,7));
sheet.addMergedRegion(new CellRangeAddress(0,0,0,title.size()-1));
HSSFRow headerRow = sheet.createRow(0);
HSSFCell headerCell = headerRow.createCell(0); // 创建单元格,首先设置标题
HSSFFont font = workBook.createFont();
short fontHeightInPoints = font.getFontHeightInPoints();
font.setFontHeightInPoints((short)(fontHeightInPoints+2));
font.setBold(true);
HSSFCellStyle cellHeaderStyle = workBook.createCellStyle();
cellHeaderStyle.setFont(font);
cellHeaderStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
headerCell.setCellStyle(cellHeaderStyle);//可表头加粗,居中
headerCell.setCellValue(header); //cellStyle.setAlignment(alignmentEnum);//还原,标题不居中
HSSFFont fontTitle = workBook.createFont();
fontTitle.setBold(true);
HSSFCellStyle titleStyle = workBook.createCellStyle();
titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
titleStyle.setFont(fontTitle);
HSSFRow titleRow = sheet.createRow(1);
for (int i = 0; i < title.size(); i++) {
HSSFCell titleCol = titleRow.createCell(i, CellType.STRING);
titleCol.setCellValue(title.get(i));
titleCol.setCellStyle(titleStyle);
}
sheet.autoSizeColumn(1);
// 创建数据行 HSSFCellStyle dataStyle = workBook.createCellStyle();
dataStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
for (int i = 0; i < listData.size(); i++) {
HSSFRow dataRow = sheet.createRow(i + 2);
List<String> rowData = listData.get(i);
for (int j = 0; j < rowData.size(); j++) {
HSSFCell dataCol = dataRow.createCell(j, CellType.STRING);
dataCol.setCellValue(rowData.get(j));
dataCol.setCellStyle(dataStyle);
}
sheet.autoSizeColumn(i);
} HSSFRow firstRow = sheet.getRow(1);
int lastCellNum = firstRow.getLastCellNum();
//为了美观,把所有的cell扩大1/2
for(int i=0;i<lastCellNum;i++) {
int columnWidth = sheet.getColumnWidth(i);
sheet.setColumnWidth(i, columnWidth+columnWidth*1/2);
} workBook.write(outputStream); workBook.close();// 最后记得关闭工作簿
} }

相关工具方法

/**
* create by Mr.wang 2018/06/14
*
* 将简单的对象(读取不到父类的属性)转化成List<String>
*
* @param o 对象
* @param convertMap 转换器 指定对象属性中某一个属性值如何转化为String。如果不需要,可以设置成null即可
* @param args 指定要输出的属性,一般用于属性选择和排序 ,如果不需要,则不设置.如果要查找父类的属性,则自身及父类的属性全部定义在此处,不再自动搜索自身的属性
* 这里注意如果同样的属性要利用两次,可以使用field&alias的格式来指定转换器
* 例如:code,code&1---->code&1可以设定与之对应的转换器
* @return
* @throws IllegalArgumentException
* @throws IllegalAccessException
* @throws NoSuchFieldException
* @throws SecurityException
*
* example:
* {
* "name":"jack",
* "age":26,
* "birthday":new Date()
* }
* 转成
* ["jack","26","2018-06-14 16:02:20"]
*/
public static List<String> convertSimpleObj2StringList(Object o,Map<String,FieldConvert> convertMap,String... args) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException{
List<String> list=new ArrayList<String>();
Class<? extends Object> objClas = o.getClass();
if(args.length==0) {
Field[] declaredFields = objClas.getDeclaredFields();
for(Field f : declaredFields) {
f.setAccessible(true);
String fileName = f.getName();
Object obj=f.get(o);//对应的属性没值,则设置为“/”
processFieldValue(convertMap, list, fileName, obj);
}
}else {
for(String ag : args) {
String fieldKey=null;
String convertKey=ag;
if(ag.contains("&")) {
String[] split = ag.split("&");
fieldKey=split[0];
}else {
fieldKey=ag;
}
Object fieldValue = getFieldValue(o, fieldKey);
processFieldValue(convertMap, list, convertKey, fieldValue);
}
}
return list;
} private static void processFieldValue(Map<String, FieldConvert> convertMap, List<String> list, String ag, Object fieldValue) {
if(fieldValue==null) {
list.add("/");
return;
}else {
if(convertMap!=null&&convertMap.containsKey(ag)){
FieldConvert filedConvert = convertMap.get(ag);
String s = filedConvert.covertFiledValueToString(fieldValue);
if(s!=null){
list.add(s);
}else{
list.add("/");
}
}else{
list.add(fieldValue.toString());
}
}
} /**
* create by Mr.wang 2018/06/14
* @see #convertSimpleObj2StringList
* @param objs
* @param convertMap
* @param args
* @return
* @throws IllegalArgumentException
* @throws IllegalAccessException
* @throws NoSuchFieldException
* @throws SecurityException
*/
public static <T> List<List<String>> convertSimpleObjList2StringList(List<T> objs,Map<String,FieldConvert> convertMap,String... args) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException{
List<List<String>> list=new ArrayList<List<String>>();
for(T obj : objs) {
list.add(convertSimpleObj2StringList(obj,convertMap,args));
}
return list;
} /**
* create by Mr.wang 2018/06/14
* 通过反射,向上(父类)一直获取对象的属性,如果一直获取不到则抛 NoSuchFieldException 异常
* @param obj 要操作的操作
* @param fieldName 要获取的属性名称
* @return
* @throws NoSuchFieldException
* @throws SecurityException
* @throws IllegalArgumentException
* @throws IllegalAccessException
*/
public static Object getFieldValue(Object obj,String fieldName) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
Class<? extends Object> class1 = obj.getClass();
Field declaredField=null;
try {
declaredField = class1.getDeclaredField(fieldName);
} catch (NoSuchFieldException e) {
declaredField=null;
}
while(declaredField==null) {
class1=class1.getSuperclass();
if(class1==null) {
throw new NoSuchFieldException();
}
try {
declaredField = class1.getDeclaredField(fieldName);
} catch (NoSuchFieldException e) {
declaredField=null;
}
}
declaredField.setAccessible(true);
return declaredField.get(obj);
}

FieldConvert.java

public interface FieldConvert {
String covertFiledValueToString(Object filedValue);
}

java poi excel 生成表格的工具封装的更多相关文章

  1. java POI excel 导出复合样式(一个单元格两个字体)

    前言:java poi 导出 excel 时,需要设置一个单元格有多个字体样式,有点类似于富文本. 想要达到的效果(一个单元格里): 我使用的 poi 版本是 <dependency> & ...

  2. java, poi, excel

    工作需要用java操作Excel,现在网上搜索了一下,决定选取POI包来操作.pom内容如下: <dependency> <groupId>org.apache.poi< ...

  3. java实现excel生成和导出

    1.java生成excel 2.java读取excel内容

  4. java poi excel操作 下拉菜单 及数据有效性

    1 private InputStream updateTemplateStyleHSSF(InputStream inputStream,CsCustCon csCustCon) throws IO ...

  5. Java POI Excel 导入导出

    这个东西很容易懂,不是特别难,难就难在一些复杂的计算和Excel格式的调整上. 近期写了一个小列子,放上来便于以后使用. POI.jar下载地址:http://mirror.bit.edu.cn/ap ...

  6. java POI Excel 单元格样式

    正如Html需要CSS一样,我们的POI生成的Excel同样需要样式才能更完美的表现我们的数据.下面还是从简单的例子出发,学习和了解POI的样式设计. 一.我的位置. 1 package com.my ...

  7. java POi excel 写入大批量数据

    直接贴代码: package jp.co.misumi.mdm.batch.common.jobrunner; import java.io.File; import java.io.FileNotF ...

  8. 关于java poi itext生成pdf文件的例子以及方法

    最近正在做导出pdf文件的功能,所以查了了一些相关资料,发现不是很完善,这里做一些小小的感想,欢迎各位“猿”童鞋批评指正. poi+itext,所需要的jar包有itext-2.1.7.jar,poi ...

  9. java poi excel导入模板设置下拉框

    import org.apache.poi.hssf.usermodel.DVConstraint; import org.apache.poi.hssf.usermodel.HSSFCell; im ...

随机推荐

  1. IOC容器和Bean的配置

     IOC容器和Bean的配置   1        IOC和DI ①IOC(Inversion of Control):反转控制. 在应用程序中的组件需要获取资源时,传统的方式是组件主动的从容器中获取 ...

  2. Centos7重启网卡失败解决方法

    service Network-Manager stop  执行命令解决,如果执行命令还是失败,则是配置文件内容的问题,检查配置文件

  3. 关于前台jsp页面的js取值问题

    在后程序中传一个字符串到前台页面上,后台代码model.addAttribute("ccc", "cccc"); 在页面js上用下面两种方法取值 1. var ...

  4. THUSC2019游记

    Day 0 完全没有明明是最后一次机会的紧张感.大概是滚粗的预兆. 住在西郊.房间好小. 和thupc前一样又有一场cometoj,好像又有小裙子了.upd:改成星空棒棒糖! Day 1 早餐有点棒. ...

  5. JAVA-基础(六) Java.serialization 序列化

    序 列 化 序列化(serialization)是把一个对象的状态写入一个字节流的过程. Serializable接口 只有一个实现Serializable接口的对象可以被序列化工具存储和恢复.Ser ...

  6. Android之高效率截图

    本文来自网易云社区 作者:孙圣翔 在一张Android手机上截图有好多办法,为了能够高效率的截图,我几乎把所有的方法都尝试了一般.走了好多路,也遇到了好多的问题. 只是想记录下这其中的不容易. 下面所 ...

  7. 学习boundingRectWithSize:options:attributes:context:计算文本尺寸

    oundingRectWithSize:options:context: 返回文本绘制所占据的矩形空间. - (CGRect)boundingRectWithSize:(CGSize)size opt ...

  8. 《Nginx高性能Web服务器详解》

    第1章 Nginx初探 第2章 Nginx服务器的安装部署 第3章 Nginx服务器架构初探 第4章 Nginx服务器的高级设置 第5章 Nginx服务器的Gzip压缩 第6章 Nginx服务器的Re ...

  9. VMware Workstation 14 PRO 下安装Ubuntu 16.04 LTS教程

    一.准备好安装的VMware Workstation 14 PRO 1.VMware Workstation 14 PRO下载链接:http://rj.baidu.com/soft/detail/13 ...

  10. Python杂技

    py转exe文件 用 pyinstaller,可以把所有文件打包成一个单独的exe文件 win10X64 =>pip install pyinstaller pyinstaller [参数] [ ...