zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    LC.225. Implement Stack using Queues(using two queues)
    LC.232. Implement Queue using Stacks(use two stacks)
    sort numbers with two stacks(many duplicates)
    LC.154. Find Minimum in Rotated Sorted Array II
    LC.81. Search in Rotated Sorted Array II
    LC.35.Search Insert Position
    前后端分离:(一)
    Redis基本使用(一)
    GIT篇章(二)
    GIT篇章(一)
  • 原文地址:https://www.cnblogs.com/Bouger/p/7148884.html
Copyright © 2011-2022 走看看