poi导出xlsx(Excel2007),分多个sheet

Excel2007以上版本导出Excel,并分成多个sheet

使用Apache POI导出Excel(.xlsx)
Excel <=2003 数据限制,行(65536)列(256)
Excel =2007 数据限制,行(1048576)
列(16384)


Apache POI官方网站
Apache POI使用详解
package exportexcel;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class BuildXLSX_V2 {

@SuppressWarnings({ "resource", "unchecked" })
public static void main(String[] args) throws IOException {
    LinkedHashMap<String, String> titleMap = new LinkedHashMap<String, String>();
    titleMap.put("rowId", "序号");
    titleMap.put("stuName", "姓名");
    titleMap.put("stuNum", "学号");
    titleMap.put("stuGender", "性别");
    titleMap.put("stuAdmission", "入学日期");
     
    //需要导出的数据
    List<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>();
    /*dataList.add(new String[]{"东邪","17232401001","男","2015年9月"});
    dataList.add(new String[]{"西毒","17232401002","女","2016年9月"});
    dataList.add(new String[]{"南帝","17232401003","男","2017年9月"});
    dataList.add(new String[]{"北丐","17232401004","男","2015年9月"});
    dataList.add(new String[]{"中神通","17232401005","女","2017年9月"});*/
    
    List<StudentBean> dataList2 = new ArrayList<StudentBean>();
    StudentBean student = new StudentBean();
    student.setRowId(1);
    student.setStuName("张三");
    student.setStuNum("17232401001");
    student.setStuGender("男");
    student.setStuAdmission(new Date());
    dataList2.add(student);
    dataList2.add(student);
    dataList2.add(student);
    dataList2.add(student);
    dataList2.add(student);
    buildExcel(dataList2, 3, "学生信息表", "2017届学生信息表", titleMap);
}
/**
 * @param <T>
 * @since
 * @param dataList 数据源
 * @param rowMaxCount 每个sheet最大记录条数
 * @param fileName 文件名
 * @param sheetTitle sheet名
 * @param titleMap 表格头
 */
@SuppressWarnings("resource")
public static <T> void buildExcel(List<T> dataList, int rowMaxCount, String fileName,String sheetTitle,LinkedHashMap<String,String> titleMap){
    try {
        SimpleDateFormat dateFormat = new SimpleDateFormat("YYYYMMDDhhmmss");
        String now = dateFormat.format(new Date());
        //导出文件路径
        String basePath = "C:/";
        //文件名
        String exportFileName = fileName+"_"+now+".xlsx";
        
        // 声明一个工作薄
        XSSFWorkbook workBook = null;
        workBook = new XSSFWorkbook();
        // 获取数据总条数
        int count = dataList.size();
        // 需要分多少个sheet
        int sheetCount = count % rowMaxCount > 1 ? count / rowMaxCount + 1 : count / rowMaxCount;
        // 拆分大的List为多个小的List
        List<List<T>> splitList = null;
        if (dataList != null && !dataList.isEmpty()) {
            splitList = getSplitList(dataList, rowMaxCount, sheetCount);
        } else {
            throw new Exception("源数据不存在");
        }
        //循环dataList 看需要生成几个sheet
        for(int i=0;i<splitList.size();i++){
        // 生成一个表格
        XSSFSheet sheet = workBook.createSheet();
        workBook.setSheetName(i,"学生信息_"+(i+1));
        //最新Excel列索引,从0开始
        int lastRowIndex = sheet.getLastRowNum();
        if (lastRowIndex > 0) {
            lastRowIndex++;
        }
        if(sheetTitle!=null){
            // 合并单元格
            //参数:起始行号,终止行号, 起始列号,终止列号
            //CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol)
            sheet.addMergedRegion(new CellRangeAddress(lastRowIndex, lastRowIndex, 0, titleMap.size()));
            // 产生表格标题行
            XSSFCell cellMerged= sheet.createRow(lastRowIndex).createCell(lastRowIndex);
            cellMerged.setCellValue(new XSSFRichTextString(sheetTitle));
            lastRowIndex++;
        }
        // 创建表格列标题行 
        XSSFRow titleRow = sheet.createRow(lastRowIndex);
        Iterator<String> colIteratorV=titleMap.values().iterator();
        int h = 0;
        while(colIteratorV.hasNext()){
            Object value = colIteratorV.next();
            titleRow.createCell(h).setCellValue(value.toString());
            h++;
        }
        //插入需导出的数据
        Class<? extends Object> clazz = null;
        List<T> subList = new ArrayList<T>();
        subList = splitList.get(i);
        for(int j=0;j<subList.size();j++){
            clazz = subList.get(0).getClass();
            XSSFRow row = sheet.createRow(j+lastRowIndex+1);
            Iterator<String> colIteratorK=titleMap.keySet().iterator();
            int k = 0;
            while(colIteratorK.hasNext()){
                Object key = colIteratorK.next();
                Method method = clazz.getMethod(getMethodName(key.toString()));
                Object obj = method.invoke(subList.get(j));
                row.createCell(k).setCellValue(obj==null?"":obj.toString());
                k++;
            }
        }
            
        }
        File  file = new File(basePath+exportFileName);
        //文件输出流
        FileOutputStream outStream = new FileOutputStream(file);
        workBook.write(outStream);
        outStream.flush();
        outStream.close();
        System.out.println("导出2007文件成功!文件导出路径:--"+basePath+exportFileName);
    } catch (Exception e) {
        e.printStackTrace();
    }
    
    
}

/**
 * 分割list
 * @param dataList  数据源
 * @param rowMaxCount 每个sheet最大记录条数
 * @param sheetCount 需要分多少个sheet
 * @return
 */
public static <T> List<List<T>> getSplitList(List<T> dataList, int rowMaxCount,
        int sheetCount) {
    List<List<T>> subList = new ArrayList<List<T>>();
    for (int i = 1; i <= sheetCount; i++) {
        if (i == 1) {
            // 第一个list
            if(dataList.size()>=rowMaxCount){
                subList.add(dataList.subList(0, rowMaxCount));
            }else{
                subList.add(dataList.subList(0, dataList.size()));
            }
        } else if (i == sheetCount) {
            // 最后一个listn
            subList.add(dataList.subList((sheetCount - 1) * rowMaxCount, dataList.size()));
        } else {
            subList.add(dataList.subList((i - 1) * rowMaxCount , i * rowMaxCount));
        }
    }
    return subList;
}

/**
* 获取方法名
* @param 属性名
* */
private static String getMethodName(String fieldName){
return "get" + fieldName.substring(0,1).toUpperCase() + fieldName.substring(1);
}

}

StudentBean 文件

package exportexcel;

import java.util.Date;

public class StudentBean {
/**学号*/
private int rowId;
/**姓名*/
private String stuName;
/**学号*/
private String stuNum;
/**性别*/
private String stuGender;
/**入学日期*/
private Date stuAdmission;
/**总成绩*/
private int stuCountScore;
/**备注*/
String remark;

public int getRowId() {
    return rowId;
}
public void setRowId(int rowId) {
    this.rowId = rowId;
}
public String getStuName() {
    return stuName;
}
public void setStuName(String stuName) {
    this.stuName = stuName;
}
public String getStuNum() {
    return stuNum;
}
public void setStuNum(String stuNum) {
    this.stuNum = stuNum;
}
public String getStuGender() {
    return stuGender;
}
public void setStuGender(String stuGender) {
    this.stuGender = stuGender;
}
public Date getStuAdmission() {
    return stuAdmission;
}
public void setStuAdmission(Date stuAdmission) {
    this.stuAdmission = stuAdmission;
}
public int getStuCountScore() {
    return stuCountScore;
}
public void setStuCountScore(int stuCountScore) {
    this.stuCountScore = stuCountScore;
}
public String getRemark() {
    return remark;
}
public void setRemark(String remark) {
    this.remark = remark;
}

}

需要的jar包
poi-3.15.jar
poi-ooxml-3.15.jar
poi-ooxml-schemas-3.15.jar
commons-collections4-4.1.jar
xmlbeans-2.3.0.jar

转载于:https://www.cnblogs.com/Bouger/p/7148884.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值