`
紫_色
  • 浏览: 144293 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java 使用POI操作Excel(2)----使用模板操作Excel

    博客分类:
  • J2EE
阅读更多

       上一节,介绍了基于Apache的POI对Excel基本读写操作.一般情况下使用我们使用CellStyle来修改样式,但是那样的话会显得等别麻烦.所有我们可以先自定义模板,然后从模板中读取样式即可.

下面是对模板操作的封装:

 

package gd.hz.poi.util;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.RichTextString;
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.usermodel.WorkbookFactory;

/**
 * 用于处理Excel写操作
 * @author lfd
 * 2013-11-25
 */
public class ExcelTemplate {
	//开始位置
	public final static String TEMPLATE_NAME = "datastart" ;
	//样式,用于要标志自定义的样式的列.
	public final static String STYLE = "style" ;
	//默认样式
	public final static String DEFALULT_STYLE = "defaultStyle" ;
	//序号,确定Excel是否需要样式.
	public final static String SERNUMS = "sernums" ;
	private int initRowIndxe ; //初始行
	private int initColIndex ; //初始列
	private int curRowIndex ;  //当前行
	private int curColIndex ;  //当前列
	private int lastRowInex ;  //最后一行
	private float defaultHeight ; // 默认行高
	private int serColIndex ; //序号行.
	private Workbook workbook = null ;
	private Sheet sheet = null ;
	private Row curRow = null ; //当前行
	//样式
	private Map<Integer,CellStyle> styles = null ;
	//默认样式
	private CellStyle defaultStyle = null ;
	//使用单例
	private static ExcelTemplate excel = new ExcelTemplate() ;
	
	private ExcelTemplate() {}
	public static ExcelTemplate getInstance() {
		return excel ;
	}
	
	/**
	 * 读取模板(从classpath中)
	 * @param path 模板路径
	 * @return ExcelTemplate
	 */
	public ExcelTemplate readTemplateClassPath(String calsspath) {
		try {
			workbook = WorkbookFactory.create(ExcelTemplate.class.getResourceAsStream(calsspath)) ;
			initTemplate() ;
		} catch (InvalidFormatException e) {
			e.printStackTrace();
			throw new RuntimeException("读取模板格式有错!请检查.") ;
		} catch (IOException e) {
			e.printStackTrace();
			throw new RuntimeException("读取模板文件不存在!请检查.") ;
		}
		return this ; 
	}
	
	/**
	 * 读取模板(从指定路径)
	 * @param path 模板路径
	 * @return ExcelTemplate
	 */
	public ExcelTemplate readTemplatePath(String path) {
		try {
			workbook = WorkbookFactory.create(new File(path)) ;
			initTemplate() ;
		} catch (InvalidFormatException e) {
			e.printStackTrace();
			throw new RuntimeException("读取模板格式有错!请检查.") ;
		} catch (IOException e) {
			e.printStackTrace();
			throw new RuntimeException("读取模板文件不存在!请检查.") ;
		}
		return this ; 
	}
	
	/**
	 * 创建新的一行
	 */
	public void creatNewRow() {
		//curRowIndex != initRowIndxe : 当前行本身是存在的,所以下移多余.
		if(lastRowInex > curRowIndex && curRowIndex != initRowIndxe) {
			sheet.shiftRows(curRowIndex, lastRowInex, 1, true, true) ;  //有的模板最后可能是日期或者姓名之类的非数据.所以要移动行.
			lastRowInex ++ ;
		}
		curRow = sheet.createRow(curRowIndex) ;
		curRow.setHeightInPoints(defaultHeight) ;
		curRowIndex ++ ;
		curColIndex = initColIndex ;
	}
	
	public void createNewCol(String value) {
		Cell cell = curRow.createCell(curColIndex) ;
		setStyle(cell) ;
		cell.setCellValue(value) ;
		curColIndex ++ ;
	}
	
	public void createNewCol(double value) {
		Cell cell = curRow.createCell(curColIndex) ;
		setStyle(cell) ;
		cell.setCellValue(value) ;
		curColIndex ++ ;
	}
	
	public void createNewCol(boolean value) {
		Cell cell = curRow.createCell(curColIndex) ;
		setStyle(cell) ;
		cell.setCellValue(value) ;
		curColIndex ++ ;
	}
	
	public void createNewCol(Date value) {
		Cell cell = curRow.createCell(curColIndex) ;
		setStyle(cell) ;
		cell.setCellValue(value) ;
		curColIndex ++ ;
	}
	
	public void createNewCol(Calendar value) {
		Cell cell = curRow.createCell(curColIndex) ;
		setStyle(cell) ;
		cell.setCellValue(value) ;
		curColIndex ++ ;
	}
	
	public void createNewCol(RichTextString value) {
		Cell cell = curRow.createCell(curColIndex) ;
		setStyle(cell) ;
		cell.setCellValue(value) ;
		curColIndex ++ ;
	}
	
	/**
	 * 根据#xxx替换模板中的其它样式.
	 * @param datas 要替换的数据
	 */
	public void replaceFind(Map<String, String> datas) {
		if(datas == null) return ;
		for(Row row : sheet) {
			for(Cell cell : row) {
				if(cell.getCellType() != Cell.CELL_TYPE_STRING) continue ;
				String value = cell.getStringCellValue().trim() ;
				if(value.startsWith("#")) {
					if(datas.containsKey(value.substring(1))) {
						cell.setCellValue(datas.get(value.substring(1))) ;
					}
				}
			}
		}
	}
	
	/**
	 * 插入序号
	 */
	public void insertSer() {
		int index = 1 ;
		Row row = null ;
		Cell cell = null ;
		for(int i = initRowIndxe; i < curRowIndex; i++) {
			row = sheet.getRow(i) ;
			cell = row.createCell(serColIndex) ;
			setStyle(cell) ;
			cell.setCellValue(index++) ;
		}
	}
	
	/**
	 * 输出文件,根据路径
	 * @param path 路径
	 */
	public void writeToFile(String path) {
		FileOutputStream fos = null;
		try {
			fos = new FileOutputStream(path) ;
			workbook.write(fos) ;
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			throw new RuntimeException("找不到文件!请检查.") ;
		} catch (IOException e) {
			e.printStackTrace();
			throw new RuntimeException("文件输出异常!请检查.") ;
		} finally {
			try {
				if(fos != null) {
					fos.close() ;
					fos = null ;
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * 输出文件,根据流输出
	 * @param stream OutputStream
	 */
	public void writeToStream(OutputStream stream) {
		try {
			workbook.write(stream) ;
		} catch (IOException e) {
			e.printStackTrace();
			throw new RuntimeException("文件输出异常!请检查.") ;
		} finally {
			try {
				if(stream != null) {
					stream.close() ;
					stream = null ;
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * 初始化模板
	 */
	private void initTemplate() {
		sheet = workbook.getSheetAt(0) ;
		styles = new HashMap<Integer, CellStyle>() ;
		initConfigData() ;
		lastRowInex = sheet.getLastRowNum() ;
	}
	
	/**
	 * defaultStyles:获得默认样式(如果默认样式没有则使用开始样式)
	 * styles:获取自定义样式
	 * 
	 */
	private void initConfigData() {
		for(Row row : sheet) {
			for(Cell cell : row) {
				if(cell.getCellType() != Cell.CELL_TYPE_STRING) continue ;
				String value = cell.getStringCellValue().trim() ;
				//获取开始位置,初始化数据
				if(TEMPLATE_NAME.equals(value)) {
					initRowIndxe = cell.getRowIndex() ;
					initColIndex = cell.getColumnIndex() ;
					curRowIndex = initRowIndxe ;
					curColIndex = initColIndex ;
					defaultHeight = row.getHeightInPoints() ;
					if(defaultStyle == null) defaultStyle = cell.getCellStyle() ;
				}
				
				//获取defaultStyles,无论如何,当有设置defaultStyles都设置为defaultStyles
				if(DEFALULT_STYLE.equals(value)) defaultStyle = cell.getCellStyle() ;
				
				//获取自定义样式的列
				if(STYLE.equals(value)) {
					styles.put(cell.getColumnIndex(), cell.getCellStyle()) ;
				}
				
				//获取样式所在的列
				if(SERNUMS.equals(value)) serColIndex = cell.getColumnIndex() ;
			}
		}
	} 
	
	/**
	 * 设置样式
	 * @param cell Cell
	 */
	private void setStyle(Cell cell) {
		
		//当前列存在自定义样式时使用自定义样式,否则使用默认样式.
		if(styles.containsKey(curColIndex)) {
			cell.setCellStyle(styles.get(curColIndex)) ;
		} else {
			cell.setCellStyle(defaultStyle) ;
		}		
	}
}

 

基本原理是获取模板样式,记录自定义样式所在列的列号和样式,然后根据列号输出样式.

样式例子:

@Test
	public void testExcel() {
		ExcelTemplate excel = ExcelTemplate.getInstance().readTemplatePath("D:/Project/MAVEN_ANT/Poi_Template/excel/lilys.xls") ;
		excel.creatNewRow() ;
		excel.createNewCol("aaa") ;
		excel.createNewCol("111") ;
		excel.createNewCol("111") ;
		excel.createNewCol("111") ;
		excel.creatNewRow() ;
		excel.createNewCol("bbb") ;
		excel.createNewCol("222") ;
		excel.createNewCol("222") ;
		excel.createNewCol("222") ;
		excel.creatNewRow() ;
		excel.createNewCol("ccc") ;
		excel.createNewCol("333") ;
		excel.createNewCol("333") ;
		excel.createNewCol("333") ;
		excel.creatNewRow() ;
		excel.createNewCol("ddd") ;
		excel.createNewCol("444") ;
		excel.createNewCol("444") ;
		excel.createNewCol("444") ;
		excel.creatNewRow() ;
		excel.createNewCol("eee") ;
		excel.createNewCol("555") ;
		excel.createNewCol("555") ;
		excel.createNewCol("555") ;
		Map<String, String> datas = new HashMap<String, String>() ;
		datas.put("title", "拉斯维加斯") ;
		datas.put("date", new Date().toString()) ;
		datas.put("department", "百合科技人事部") ;
		excel.replaceFind(datas) ;
		excel.insertSer() ;
		excel.writeToFile("D:/poi.xls") ;
	}

 

下面是例子的源代码(Maven项目):

http://www.kuaipan.cn/file/id_129263676497613793.htm

分享到:
评论

相关推荐

    poi 操作excel模板

    通过以上步骤,你可以使用Apache POI有效地操作Excel模板,并将数据填充到新生成的文件中。这在报表生成、数据分析、批量导出等方面非常实用。记得在实际项目中,还要处理异常、优化性能,比如使用缓冲流、避免频繁...

    java的poi生成excel图表demo

    Java的Apache POI库是一个强大的工具,用于读取、创建和修改Microsoft Office格式的文件,尤其是Excel(.xlsx)文档。在本示例中,我们将深入探讨如何利用POI库来生成Excel中的图表曲线,这对于数据可视化和报告生成...

    Java使用POI实现excel模板

    本篇文章将深入探讨如何使用Java和Apache POI来实现Excel模板的功能,覆盖了单个传值、单行循环、块循环以及快循环嵌套单行循环等操作。 首先,我们需要导入Apache POI的相关依赖库,如`poi-ooxml`和`poi-ooxml-...

    java使用POI操作excel (支持excel2007)

    Java 使用Apache POI库操作Excel 2007文件详解 在Java开发中,处理Excel文件是一项常见的任务,特别是对于数据分析、数据导入导出或报表生成等场景。Apache POI是一个流行的开源库,它允许开发者读写Microsoft ...

    java生成excel文件(poi).rar_POI java_java excel_poi EXCEL模板_poi-3.8-

    在“POI java_java excel_poi EXCEL模板”这一标签中,我们可以推测这个项目可能包含了一些使用POI创建Excel模板的方法,这些模板可以用于填充动态数据并生成定制化的报表。 在具体使用POI时,主要涉及以下几个关键...

    使用POI向Excel模板动态添加内容

    2. **创建工作簿对象**:使用`WorkbookFactory.create()`方法加载Excel模板文件,创建一个`Workbook`对象,它是Excel文档的顶级容器。 3. **获取工作表**:通过`Workbook`对象的`getSheetAt()`或`getSheet()`方法...

    java基于poi通过excel模板导出

    2. **读取模板**:在Java代码中,你需要使用POI的XSSFWorkbook类打开模板文件。通过`OPCPackage.openExisting()`方法读取模板文件,然后使用`WorkbookFactory.create()`方法创建一个Workbook对象。 3. **数据准备**...

    java基于poi使用excel模板导出

    创建Excel模板时,可以使用Microsoft Excel本身,设置好样式、公式、图表等。模板中的占位符通常用特定的字符串或者特定单元格的特定值表示,比如“${name}”或“${list}”。 2. **添加Apache POI依赖**: 在项目...

    POI使用Excel模板文件循环输出行并导出Excel

    在这个特定的例子中,我们将讨论如何使用POI库基于一个Excel模板文件循环输出数据行,并将结果导出为新的Excel文件。 首先,我们需要理解POI库的基本概念。POI提供了HSSF(Horizontally SpreadSheet Format)和XSSF...

    Java通过POI读取Excel遍历数据,批量生成word文档

    本教程将重点讲解如何使用Apache POI库来读取Excel数据,并基于这些数据批量生成Word文档。Apache POI是一个开源项目,它允许Java开发者处理Microsoft Office格式的文件,如Excel(.xlsx或.xls)和Word(.docx)。 ...

    java使用 POI Excel模板导出数据

    这篇博客"java使用POI Excel模板导出数据"探讨了如何利用POI库在Java中创建Excel模板并填充数据。下面将详细介绍这个过程以及相关知识点。 首先,我们需要理解Apache POI的基本概念。POI是Apache软件基金会的一个...

    poi的所有jar包,poi, poi-ooxml,poi-ooxml-schemas的各个版本jar

    通过这些jar包,开发者可以方便地读取Excel数据,将其与数据库交互,或者根据需求动态生成复杂的Excel模板。 在使用Apache POI时,有几点需要注意: - 由于POI处理的是二进制或XML格式的文件,因此在处理大量数据时...

    java poi 根据excel模板生成excel文件

    在本文中,我们将深入探讨如何使用Java POI库根据已有的Excel模板生成新的Excel文件。 首先,理解“模板”在Excel中的概念非常重要。模板通常包含预设的格式、样式、公式和数据结构,可以作为创建新文件的基础。在...

    Java POI下载Excel模板 Excel带有下拉框的模板

    Java POI下载Excel模板 Excel带有下拉框的模板,并有详细注释,生成exlcel的下拉框,必填项标红,数字栏位防止科学计数法,并设置Excel标题样式

    java使用poi操作.doc word模板替换,循环插入表格

    在Java编程中,Apache POI库是一个非常实用的工具,它允许开发者读写Microsoft Office格式的文件,如Word(.doc或.docx)、Excel(.xls或.xlsx)和PowerPoint(.ppt或.pptx)。本篇文章将深入探讨如何利用POI库在...

    个人java工具集,含poi-excel的模板导出

    个人java工具集,含有String list map等,basedao(jdbc的基础操作),excel-poi的模板工具(在模板excel中打标机${key}或 ${list.key}) 直接替换指定标记,保留字体格式,内有excel模板使用说明

    poi excel 模板读取并导出带公式的excel文档

    ### POI Excel 模板读取并导出带公式的Excel文档 #### 一、概述 ...综上所述,通过使用Apache POI库结合Excel模板文件,可以高效地实现批量数据的导入导出,并保持原有的公式计算能力,大大提高了工作效率。

    Java POI根据模板生成Excel(xlsx)文件

    这个过程涉及到对Excel模板的理解、读取、修改以及最终的保存。 首先,理解模板文件是关键。一个.xlsx模板文件实际上是由一系列XML文件组成,存储在ZIP压缩包内,这也就是.xslx文件的本质。模板中的单元格、公式、...

    java poi操作excel批量导入导出项目需要的jar包

    以下是关于使用Java POI进行Excel操作的关键知识点: 1. **Apache POI介绍**: Apache POI是一个开源项目,它提供了API来处理Microsoft的文件格式,如Word(.doc),PowerPoint(.ppt)和Excel(.xls或.xlsx)。在...

    Java操作Excel之Poi模板导入导出

    在"Java操作Excel之Poi模板导入导出"这个主题中,我们将深入探讨如何使用POI库来处理Excel模板,并进行数据的导入和导出。 首先,了解Excel模板的基本概念。模板通常包含预定义的样式、格式和计算,开发人员可以...

Global site tag (gtag.js) - Google Analytics