`

Excel生成工具类

    博客分类:
  • J2SE
 
阅读更多
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.beanutils.BeanMap;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.lang.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
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.Cell;
import org.apache.poi.ss.usermodel.FormulaEvaluator;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.NumberToTextConverter;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/**
 * @author songfeng
 *
 */
public final class ExcelUtil {
	
	private static int SHEET_SPLIT_NUM = 20000;

	public static void main(String[] args) {
		List<Map> list = new ArrayList<Map>();
		for(int i=0 ; i < 20000; i++)
		{
			Map map = new HashMap<>();
			map.put("a", "111");
			map.put("b", "222");
			map.put("c", "333");
			map.put("d", "444");
			map.put("e", "555");
			map.put("f", "666");
			map.put("g", "777");
			map.put("h", "888");
			map.put("i", "999");
			map.put("j", "000");
			map.put("k", "!!!");
			map.put("l", "@@@");
			map.put("m", "###");
			map.put("n", "$$$");
			list.add(map);
		}
		String[] title = "A,B,C,D,E,F,G,H,I,J,K,L,M,N".split(",");
		String[] column = "a,b,c,d,e,f,g,h,i,j,k,l,m,n".split(",");
		try {
			OutputStream os = new FileOutputStream("D:\\test.xlsx");
			Long startTime = System.currentTimeMillis();
			ExcelUtil.write(os, title, column, list,new CellStyleInterface(){
				@Override
				public void dealWithCell(Cell cell, CellStyle cellStyle, DataFormat dataFormat, String name, String value) {
					if("skuExpireTime".equals(name))
					{
			            //set date format
			            //cellStyle.setDataFormat(dataFormat.getFormat("yyyy-mm-dd"));
						
						//设置单元格格式为"文本"
						cellStyle.setDataFormat(dataFormat.getFormat("@"));
						cell.setCellStyle(cellStyle);
						cell.setCellType(HSSFCell.CELL_TYPE_STRING);
					}
				}

				@Override
				public void dealWithSheet(Sheet sheet,CellStyle cellStyle, DataFormat dataFormat) {
					cellStyle.setDataFormat(dataFormat.getFormat("@"));
					sheet.setDefaultColumnStyle(3, cellStyle);
				}
			});
			System.out.println("共使用"+(System.currentTimeMillis() - startTime)+"ms");
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public static void write(OutputStream outputStream, String[] title, String[] column, List data, CellStyleInterface cellStyleInterface) {
		if (data.size() > 10000) {
			getOutputBigFile(outputStream, title, column, data,cellStyleInterface);
		} else {
			getOutputFile(outputStream, title, column, data,cellStyleInterface);
		}
	}

	private static void getOutputFile(OutputStream outputStream, String[] title, String[] column, List data, CellStyleInterface cellStyleInterface) {
		HSSFWorkbook wwb = null;
		try {
			wwb = new HSSFWorkbook();
			HSSFSheet ws = null;
			HSSFRow row = null;
			HSSFCell cell = null;
			Iterator it = data.iterator();
			int i = 0;

			ws = wwb.createSheet("Sheet0");
			if(cellStyleInterface != null)
			{
				cellStyleInterface.dealWithSheet(ws, wwb.createCellStyle(), wwb.createDataFormat());
			}
			
			row = ws.createRow(0);

			for (int m = 0; m < title.length; m++) {
				cell = row.createCell((short) m);
				cell.setCellValue(new HSSFRichTextString(title[m]));
			}
			int k = 0;

			while (it.hasNext()) {
				if (i / SHEET_SPLIT_NUM > k) {
					k = i / SHEET_SPLIT_NUM;
					ws = wwb.createSheet("Sheet" + k);
					row = ws.createRow(0);

					for (int l = 0; l < title.length; l++) {
						cell = row.createCell((short) l);
						cell.setCellValue(new HSSFRichTextString(title[l]));
					}
				}
				Object obj = it.next();
				Map dataMap = new HashMap();
				if(obj instanceof Map) {
					dataMap = (Map)obj;
				}
				else
				{
					dataMap = new BeanMap(obj);
				}
				row = ws.createRow(i - SHEET_SPLIT_NUM * k + 1);

				for (int j = 0; j < column.length; j++) {
					cell = row.createCell((short) j);

					String columnName = column[j];
					cell.setCellValue(new HSSFRichTextString(getValue(dataMap, columnName)));
					if(cellStyleInterface != null)
					{
						cellStyleInterface.dealWithCell(cell, wwb.createCellStyle(), wwb.createDataFormat(), columnName, getValue(dataMap, columnName));
					}
				}
				i++;
			}

			for (int j = 0; j < column.length; j++) {
				ws.autoSizeColumn(j);
			}
			
			wwb.write(outputStream);
		} catch (Exception e) {
			e.printStackTrace();
			try {
				outputStream.close();
			} catch (Exception e1) {
				e1.printStackTrace();
			}
		} finally {
			try {
				outputStream.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	private static void getOutputBigFile(OutputStream outputStream, String[] title, String[] column, List data, CellStyleInterface cellStyleInterface) {
		try {
			SXSSFWorkbook wb = new SXSSFWorkbook(5000);
			Sheet ws = null;
			Row row = null;
			Cell cell = null;
			Iterator it = data.iterator();
			int i = 0;

			ws = wb.createSheet("Sheet0");
			if(cellStyleInterface != null)
			{
				cellStyleInterface.dealWithSheet(ws, wb.createCellStyle(), wb.createDataFormat());
			}
			
			row = ws.createRow(0);

			for (int m = 0; m < title.length; m++) {
				cell = row.createCell((short) m);
				cell.setCellValue(new HSSFRichTextString(title[m]));
			}
			int k = 0;

			while (it.hasNext()) {
				if (i / SHEET_SPLIT_NUM > k) {
					k = i / SHEET_SPLIT_NUM;
					ws = wb.createSheet("Sheet" + k);
					row = ws.createRow(0);

					for (int l = 0; l < title.length; l++) {
						cell = row.createCell((short) l);
						cell.setCellValue(new HSSFRichTextString(title[l]));
					}
				}
				Object obj = it.next();
				Map dataMap = new HashMap();
				if(obj instanceof Map) {
					dataMap = (Map)obj;
				}
				else
				{
					dataMap = new BeanMap(obj);
				}
				row = ws.createRow(i - SHEET_SPLIT_NUM * k + 1);

				for (int j = 0; j < column.length; j++) {
					cell = row.createCell((short) j);

					String columnName = column[j];
					cell.setCellValue(new HSSFRichTextString(getValue(dataMap, columnName)));
					if(cellStyleInterface != null)
					{
						cellStyleInterface.dealWithCell(cell, wb.createCellStyle(), wb.createDataFormat(), columnName, getValue(dataMap, columnName));
					}
				}
				i++;
			}
			
			for (int j = 0; j < column.length; j++) {
				ws.autoSizeColumn(j);
			}
			
			wb.write(outputStream);
		} catch (Exception e) {
			e.printStackTrace();
			try {
				outputStream.close();
			} catch (Exception e1) {
				e1.printStackTrace();
			}
		} finally {
			try {
				outputStream.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	private static String getValue(Map dataMap, String columnName) {
		return (dataMap.get(columnName) == null) || (String.valueOf(dataMap.get(columnName)).equalsIgnoreCase("null"))
				? "" : String.valueOf(dataMap.get(columnName)).trim();
	}
	
	
	
	/**
	 * 根据文件路径和行数读取文件内容,并返回Map集合对象
	 * @param fileItem FileItem
	 * @param cellNumber 每行单元格数量
	 * @param sheetNumer sheet编号,从0开始
	 * @param start 第几行开始读取数据
	 * @return
	 */
	public static List<Map<Integer, Object>> readObjFromXls(FileItem fileItem, int cellNumber, int sheetNumer,int start) {

		Workbook wb = null;   
		List<Map<Integer, Object>> listMap = new ArrayList<Map<Integer, Object>>();
		try {
			if (isExcel2003(fileItem.getName()))  
	        { 
				wb = new HSSFWorkbook(fileItem.getInputStream());
	        }
			else
			{
				wb = new XSSFWorkbook(fileItem.getInputStream());
			}
			// 循环工作表Sheet
			Sheet sheet = wb.getSheetAt(sheetNumer); // 默认取第一个模板
			if (null == sheet) {// 如果sheet为null则模板不匹配
				throw new Exception("导入模板与所选的导入方案不匹配");
			}
			// HSSFRow titleRow = hssfSheet.getRow(0); // 第一行,表头
			FormulaEvaluator eval = wb.getCreationHelper().createFormulaEvaluator();
			 
			Map<Integer, Object> map = null;

			for (int rowNum = start; rowNum <= sheet.getLastRowNum(); rowNum++) {
				map = new HashMap<Integer, Object>();

				Row row = sheet.getRow(rowNum);
				if (row == null) {
					continue;
				}
				// 开始读行
				for (int cellNum = 0; cellNum < cellNumber; cellNum++) {
					Cell cell = row.getCell(cellNum);
					if (cell == null) {
						map.put(cellNum, ""); // 存放第多少列的值
						continue;
					}
					// 具体读取单元格的值
					String value = getValue(cell,eval); // 当前行的第(cellNum+1)个单元格里面的值
					if (!StringUtils.isEmpty(value) && value.endsWith(".0")) {
						// 判断是否以.0结尾
						value = value.substring(0, value.lastIndexOf(".0"));
					}
					map.put(cellNum, value); // 存放第多少列的值
				}
				listMap.add(map);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				fileItem.getInputStream().close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return listMap;
	}

	/**
	 * 获取单元格里面的值
	 * 
	 * @param cell
	 * @return
	 */
	private static String getValue(Cell cell,FormulaEvaluator eval) {
		String value = "";
		switch (eval.evaluateInCell(cell).getCellType()) {
		case Cell.CELL_TYPE_STRING:// excel数据是字符串类型
			value = cell.getStringCellValue();
			break;
		case Cell.CELL_TYPE_FORMULA:// excel数据是公式生成的
			 value = cell.getCellFormula();
//			 eval.evaluateFormulaCell(hssfCell);
//			 CellValue cell = eval.evaluate(hssfCell);
//			 value = cell.getStringValue();
			break;
		case Cell.CELL_TYPE_NUMERIC:// excel数据是数字类型
			value = NumberToTextConverter.toText(cell.getNumericCellValue());
			break;
		case Cell.CELL_TYPE_BLANK:// excel数据是空值
			value = "";
			break;
		case Cell.CELL_TYPE_ERROR:// excel数据类型读取出错
			value = "";
			break;
		}
		return value;
	}
	
	/**
	 * 是否是excel2003
	 * @param filePath
	 * @return
	 */
	public static boolean isExcel2003(String filePath)  
    {  
        return filePath.matches("^.+\\.(?i)(xls)$");  
    }  
	
	/**
	 * 是否是excel2007
	 * @param filePath
	 * @return
	 */
    public static boolean isExcel2007(String filePath)  
    {  
        return filePath.matches("^.+\\.(?i)(xlsx)$");  
    }   
}

 

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.Sheet;

public interface CellStyleInterface {
	void dealWithCell(Cell cell, CellStyle cellStyle, DataFormat dataFormat,String name, String value);
	
	void dealWithSheet(Sheet sheet, CellStyle cellStyle, DataFormat dataFormat);
}

 

0
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics