`

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
分享到:
评论

相关推荐

    java生成excel工具类和demo

    本示例涉及的“java生成excel工具类和demo”是关于如何在Java环境中使用Apache POI库来创建和导出Excel文件的一个实践案例。Apache POI是一个流行的开源库,它允许开发者读写Microsoft Office格式的文件,包括Excel...

    excel生成图表工具类.zip

    本项目提供了一个名为"excel生成图表工具类"的Java类库,帮助开发者通过编程方式自动化创建Excel图表,包括柱状图、折线图和饼状图。以下将详细解析这个工具类库的主要知识点: 1. **Java编程基础**:首先,你需要...

    Excel POI 工具类

    本篇将深入探讨"Excel POI 工具类",这个工具类旨在简化日常的Excel操作,提升开发效率。 Apache POI 提供了HSSF(Horizontally Stored Sheets Format)和XSSF(XML Spreadsheet Format)两个主要的API,分别用于...

    Excel导出工具类

    在IT行业中,Excel导出工具类是经常被用于数据处理和报表生成的模块。这个工具类通常是为了简化从应用程序中批量导出数据到Excel文件的过程,使得开发者可以更高效地处理大量的结构化信息。以下是对"Excel导出工具类...

    一键生成excel,封装生成excel表格的工具类

    在IT行业中,生成Excel表格是一项常见的任务,尤其在数据分析、报表制作或数据交换时。针对这一需求,开发者经常需要编写自定义的代码来处理。...如果你需要处理Excel生成任务,这个工具类无疑是一个值得考虑的选择。

    util_ExcelUtils工具类_

    在Java编程中,`util_ExcelUtils`工具类是一个用于操作Excel文件的实用程序类,它可以帮助开发者方便地读取Excel文件中的数据以及生成新的Excel文件。Excel文件通常被广泛用于数据存储、报告生成和数据分析等领域,...

    接口开发时,利用Excel快速生成实体类

    例如,你可以使用一些开源的代码生成工具,如MyGeneration或T4模板,它们支持读取Excel数据并生成代码。也可以编写自定义的VBA宏,或者使用Excel插件如ExcelToCode,来实现这一功能。这些工具或宏会根据预设的模板,...

    一款很有用的Excel读写工具类

    本文将深入探讨一款专为非MFC(Microsoft Foundation Classes)环境设计的Excel读写工具类,该工具类能够高效地帮助开发者进行Excel文件的操作。 首先,我们来了解非MFC环境。MFC是微软提供的一套面向对象的C++库,...

    excel导出工具类

    在IT行业中,Excel导出工具类是一个非常实用的组件,特别是在数据分析、报表生成以及数据交换等领域。这个工具类主要是为了简化编程过程中处理Excel文件的工作,尤其是考虑到数据类型的多样性,使得开发者能够快速、...

    java使用POI导出 Excel工具类

    java使用POI导出 Excel+图片工具类 ,里面含有poi jar包,只调用接口即可直接保存Excel。使用的时候需先把数据封装,具体包装需根据实际导出数据进行处理。文件demo中只提供包装格式。

    C#通用Excel导入导出工具类

    本篇文章将深入探讨“C#通用Excel导入导出工具类”的实现原理及应用,主要涉及的技术点包括反射、特性以及如何创建一个高效的Excel导入导出解决方案。 首先,我们要理解反射在C#中的作用。反射是一种强大的机制,它...

    Excel创建工具类

    "Excel创建工具类"是用于简化Excel文件操作的一种方法,它允许开发者通过编程方式快速生成和修改Excel工作簿。本篇将详细介绍如何创建这样一个工具类,以及如何利用Apache POI库(版本3.12)来实现。 Apache POI是...

    java操作excel工具类

    Java操作Excel工具类是开发过程中常见的一种需求,尤其是在数据导入导出、数据分析或者报表生成的场景下。在Java中,我们可以使用多种库来处理Excel文件,例如Apache POI、JExcelAPI、OpenCSV等。本篇文章将重点介绍...

    Excel工具类.zip

    在IT行业中,Excel工具类是常见的一种实用程序,特别是在数据处理和分析的场景下。SpringBoot框架结合Excel工具类,可以方便地实现从数据库中获取数据并导出为Excel文件,便于用户查看、分析或者进一步处理。这个...

    java poi导出excel含工具类以及示例

    String outputFile = "D:\\excel\\excel.xlsx"; OutputStream outputStream = new FileOutputStream(outputFile); UtilExcel utilExcel = new UtilExcel(); String titles = "所属区域,所属车间,当前处理人,描述...

    java导出excel文档通用工具类

    "java导出excel文档通用工具类"正是这样一个工具,它允许我们灵活地生成包含表头的Excel文件,提高开发效率。 Java中导出Excel主要依赖于Apache POI库,这是一个用于读写Microsoft Office格式档案的Java API。...

    Excel Java工具类

    Excel工具类,支持生成自定义Excel,支持浏览器下载Excel

    导出Excel工具类

    在IT行业中,导出Excel工具类是经常被用于数据处理和报告生成的场景。这个工具类通常包含了多种方法,能够方便地将程序中的数据结构转换为Excel格式的文件,便于用户下载、查看或进一步分析。这里我们将深入探讨导出...

    java-excel(工具类).zip

    Java Excel工具类主要涉及到在Java应用中处理Microsoft Excel文件的操作,包括数据的导入和导出。这个zip文件包含了两个核心的Java源代码文件:ExcelUtils.java和ExcelController.java,它们分别对应于工具类和控制...

    Java对Excel数据导入导出工具类(含Exel单元格样式设置)

    本资源提供了一个使用Java语言结合jxl库实现的工具类,它简化了Excel文件的读写操作,并且允许对单元格样式进行自定义设置。下面我们将详细探讨相关的知识点。 1. **Java与Excel交互**: - Java通过第三方库如...

Global site tag (gtag.js) - Google Analytics