`
gegewuqin9
  • 浏览: 29164 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

使用poi导文档的简单模板

阅读更多
经常接到好多导出excel文件的需求,各式各样。
之前一直用原生的poi来进行操作,每次都要写很多重复的代码,基于此,所以就想简单的封装一下,不至于每次都需要重复定义很多XSSFWorkbook,XSSFSheet之类的变量
本人菜鸟,命名基本是乱来的,囧。
由于我用到的导出通常都是一个List<Map>导成列表,所以做的比较简单,适用性不广。

基本抽象模板类:




import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.Map;

import org.apache.commons.io.FileExistsException;
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.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public abstract class ExportModel {
	
	private String[] tital;
	private String[] content;
	private Integer[] wides;
	private String xlsname;
	private String sheetname;
	private String dirname;
	private Workbook book;
	
	public ExportModel() {
		setTital();
		setContent();
		setWides();
	}
	
	/**
	 * 设置文档首行标题名称
	 */
	public abstract void setTital();
	
	/**
	 * 设置文档内容所对应的Map中的key值
	 */
	public abstract void setContent();
	
	/**
	 * 设置文档每一列的宽度
	 */
	public abstract void setWides();
	
	public String[] getTital() {
		return tital;
	}
	public String[] getContent() {
		return content;
	}
	public Integer[] getWides() {
		return wides;
	}
	public void setTital(String[] tital) {
		this.tital = tital;
	}
	public void setContent(String[] content) {
		this.content = content;
	}
	public void setWides(Integer[] wides) {
		this.wides = wides;
	}
	public String getXlsname() {
		return xlsname;
	}
	public void setXlsname(String xlsname) {
		this.xlsname = xlsname;
	}
	public String getSheetname() {
		return sheetname;
	}
	public void setSheetname(String sheetname) {
		this.sheetname = sheetname;
	}
	public String getDirname() {
		return dirname;
	}
	public void setDirname(String dirname) {
		this.dirname = dirname;
	}
	
	/**
	 * 获取导出文件地址
	 * @param type 文件类型
	 * @return 文件名称
	 * @throws IOException 
	 */
	private String getExportFile(int type) throws IOException {
		assertNotNull(dirname, "导出文件出错,未指定导出文件夹!出现此错误可能是您没有使用setDirname的方法导致.");
		assertNotNull(xlsname, "导出文件出错,未指定xls文件名称!出现此错误可能是您没有使用setXlsname的方法导致.");
		if(type == EXPORT_XLSX && !xlsname.endsWith(".xlsx")) {
			xlsname += ".xlsx";
		} else if(type == EXPORT_XLS && !xlsname.endsWith(".xls")) {
			xlsname += ".xls";
		}
		String rootPath = getRootPath();
		String dirpath = rootPath + BASE_EXPORT_PATH + File.separator + dirname + File.separator;
		File dir = new File(dirpath);
		if(!dir.isDirectory())
			if(!dir.mkdir()) {
				throw new IOException("创建目录失败:"+dir.getAbsolutePath());
			}
		String path = rootPath + BASE_EXPORT_PATH + File.separator + dirname + File.separator + xlsname;
		//path = "D:\\"+xlsname;
		return path;
	}
	
	/**
	 * 检查基本的内容设置是否正确
	 */
	public void checkContent() {
		assertNotNull(tital, "导出文件出错,标题不能为空!出现此错误可能是您没有使用setTital的方法导致.");
		assertNotNull(content, "导出文件出错,内容不能为空!出现此错误可能是您没有使用setContent的方法导致.");
		if(sheetname == null) {
			sheetname = "sheet1";
		}
	}
	
	/**
	 * 按excel2007格式生成一个sheet
	 * @param array 需要导出的内容
	 */
	public void generateSheetXSSF(List<Map<String, Object>> array) {
		checkContent();
		if(book == null)
			book = new XSSFWorkbook();
		if(!(book instanceof XSSFWorkbook))
			throw new IllegalArgumentException("错误的导出模式。");
		XSSFSheet sheet = (XSSFSheet)book.createSheet(sheetname);
		XSSFRow curRow = null;
		int titalLen = tital.length;
		int contentLen = content.length;
		int size = array.size();
		int loop = 0;
		curRow = sheet.createRow(loop++);
		CellStyle titalStyle = generateTitalStyle();
		for(int i = 0; i < titalLen; i++) {
			String val = tital[i];
			curRow.createCell(i).setCellValue(val);
			curRow.getCell(i).setCellStyle(titalStyle);
		}
		if(wides != null) {
			int wlen = wides.length;
			for(int i = 0; i < wlen; i++) {
				sheet.setColumnWidth(i, wides[i].shortValue());
			}
		}
		for(int i = 0; i < size; i++) {
			Map<String, Object> map = array.get(i);
			curRow = sheet.createRow(loop++);
			for(int j = 0; j < contentLen; j++) {
				curRow.createCell(j).setCellValue(convertStr(map.get(content[j])));
			}
		}
	}
	
	/**
	 * 按excel2003格式生成一个sheet
	 * @param array 需要导出的内容
	 */
	public void generateSheetHSSF(List<Map<String, Object>> array) {
		checkContent();
		if(book == null)
			book = new HSSFWorkbook();
		if(!(book instanceof HSSFWorkbook))
			throw new IllegalArgumentException("错误的导出模式。");
		HSSFSheet sheet = (HSSFSheet)book.createSheet(sheetname);
		HSSFRow curRow = null;
		int titalLen = tital.length;
		int contentLen = content.length;
		int size = array.size();
		int loop = 0;
		curRow = sheet.createRow(loop++);
		CellStyle titalStyle = generateTitalStyle();
		for(int i = 0; i < titalLen; i++) {
			String val = tital[i];
			curRow.createCell(i).setCellValue(val);
			// 设置字体为粗体
			curRow.getCell(i).setCellStyle(titalStyle);
		}
		if(wides != null) {
			int wlen = wides.length;
			for(int i = 0; i < wlen; i++) {
				sheet.setColumnWidth(i, wides[i].shortValue());
			}
		}
		for(int i = 0; i < size; i++) {
			Map<String, Object> map = array.get(i);
			curRow = sheet.createRow(loop++);
			for(int j = 0; j < contentLen; j++) {
				curRow.createCell(j).setCellValue(convertStr(map.get(content[j])));
			}
		}
	}
	
	/**
	 * 使用默认导出类型(如果文件已存在则删除)将文件持久化至硬盘
	 * @throws IOException
	 */
	public void exportToFile() throws IOException {
		exportToFile(EXPORT_UPDATE);
	}
	
	/**
	 * 将文件持久化至硬盘
	 * @param export_type 导出类型
	 * @throws IOException
	 */
	public void exportToFile(int export_type) throws IOException {
		assertNotNull(book, "导出失败,原因:内容为空。");
		String filename = getExportFile(export_type);
		File exportFile = new File(filename);
		if(exportFile.exists())
			if(export_type == EXPORT_RETURN) {
				throw new FileExistsException(exportFile);
			} else if(export_type == EXPORT_UPDATE) {
				if(!exportFile.delete()) {
					throw new FileExistsException(exportFile);
				}
			}
		exportFile.createNewFile();
		FileOutputStream out = new FileOutputStream(exportFile);
		out.flush();
		book.write(out);
		out.close();
	}
	
	/**
	 * Object 转 String 型
	 * @param target
	 */
	private static String convertStr(Object target) {
		if(target == null)
			return "";
		return target + "";
	}
	
	/**
	 * 判断变量是否为空
	 * @param target 目标变量
	 * @param message 如果为空则抛出异常的内容
	 * @throws IllegalArgumentException
	 */
	private static void assertNotNull(Object target, String message) {
		if(target == null)
			throw new IllegalArgumentException(message);
	}
	
	/**
	 * 获取导出文件的根目录,这里我选的根目录为/WebRoot/
	 */
	private static String getRootPath() {
		String path = ExportModel.class.getClassLoader().getResource("").getPath();
		return path.substring(0, path.indexOf("WEB-INF"));
	}
	
	/**
	 * 使用默认的导出方式(文件存在则删除原文件)导出至excel2003
	 * @param array 需要导出的数据
	 * @return 文件名
	 * @throws IOException
	 */
	public String exportToXls(List<Map<String, Object>> array) throws IOException {
		exportToXls(array, EXPORT_UPDATE);
		return xlsname;
	}
	
	/**
	 * 导出至excel2003
	 * @param array 需要导出的数据
	 * @param export_type 导出方式
	 * @return 文件名
	 * @throws IOException
	 */
	public String exportToXls(List<Map<String, Object>> array, int export_type) throws IOException {
		generateSheetHSSF(array);
		exportToFile(export_type);
		return xlsname; 
	}
	
	/**
	 * 使用默认的导出方式(文件存在则删除原文件)导出至excel2007
	 * @param array 需要导出的数据
	 * @return 文件名
	 * @throws IOException
	 */
	public String exportToXlsx(List<Map<String, Object>> array) throws IOException {
		exportToXlsx(array, EXPORT_UPDATE);
		return xlsname;
	}
	
	/**
	 * 导出至excel2007
	 * @param array 需要导出的数据
	 * @param export_type 导出方式
	 * @return 文件名
	 * @throws IOException
	 */
	public String exportToXlsx(List<Map<String, Object>> array, int export_type) throws IOException {
		generateSheetXSSF(array);
		exportToFile(export_type);
		return xlsname; 
	}
	
	/**
	 * 获取标题格式
	 */
	private CellStyle generateTitalStyle() {
		CellStyle style = book.createCellStyle();
		Font font = book.createFont();
		font.setBoldweight(Font.BOLDWEIGHT_BOLD);
		style.setFont(font); // 设置粗体
		style.setAlignment(CellStyle.ALIGN_CENTER);// 设置居中
		return style;
	}
	
	// 导出的文件夹的根目录:WebRoot/export/
	private static final String BASE_EXPORT_PATH = "export";
	
	/**
	 * 如果文件存在,则删除原文件,重新生成
	 */
	public static final int EXPORT_UPDATE = 0;
	
	/**
	 * 如果文件存在,则不生成
	 */
	public static final int EXPORT_RETURN = 1;
	
	/**
	 * 导出为excel2007文件(.xlsx)
	 */
	private static final int EXPORT_XLSX = 2;
	
	/**
	 * 导出为excel2003文件(.xls)
	 */
	private static final int EXPORT_XLS = 3;
}






使用时可以创建一个模板类继承抽象模板类,并设置标题,内容,以及每行的宽度等,如:

public class DefaultExportModel extends ExportModel{

	public DefaultExportModel() {
		super();
		this.setDirname("default");
	}
	
	@Override
	public void setTital() {
		// 设置标题
//		String tital[] = {"tital1", "tital2", "tital3"};
//		setTital(tital);
	}

	@Override
	public void setContent() {
		// 设置内容
//		String content[] = {"content1", "content2", "content3"};
//		setContent(content);
	}

	@Override
	public void setWides() {
		Integer wides[] = {3500,3500,3500};
		setWides(wides);
	}

}




下面是测试:

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


public class ExportTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String tital[] = {"tital1", "tital2", "tital3"};
		String content[] = {"content1", "content2", "content3"};
		List<Map<String, Object>> array = new ArrayList<Map<String,Object>>();
		for(int i=1;i<10;i++){
			Map<String, Object> data = new HashMap<String, Object>();
			for(String value : content) {
				data.put(value, value + "-" + i);
			}
			array.add(data);
		}
		ExportModel model = new DefaultExportModel();
		model.setTital(tital);// setTital可以在DefaultExportModel中设置
		model.setContent(content);// setContent可以在DefaultExportModel中设置
		model.setXlsname(System.currentTimeMillis()/1000+".xls");
		try {
			String xlsname = model.exportToXls(array);
			System.out.println(xlsname);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

0
3
分享到:
评论

相关推荐

    java poi 通过模板生成word文档

    在这个场景中,我们关注的是使用POI来通过模板生成Word文档。这个过程通常涉及到读取一个预先设计好的Word模板,然后在运行时替换模板中的特定占位符或变量,生成个性化的文档。 首先,让我们了解如何准备模板。一...

    word文档模板-使用poi技术替换文档中的变量

    ### 使用POI技术替换Word文档中的变量 #### 一、概述 在日常工作中,我们经常需要根据不同的数据生成大量的Word文档,例如学生的成绩单、报告等。为了提高效率,可以利用Java语言结合Apache POI库来自动批量生成...

    使用poi-3.9通过模板实现对word写入内容的demo

    在本示例中,我们将重点讨论如何使用POI 3.9版本通过模板来实现对Word文档内容的写入操作。 1. **Apache POI简介** Apache POI提供了一套API,使得开发者可以使用Java编程语言与Microsoft Office文件进行交互。它...

    Java Poi流根据Word模板插入相应的文本、表格和图片,并生成新的Word报告。

    在这个场景中,我们关注的是如何利用Java POI库通过Word模板生成包含特定文本、表格和图片的报告。 首先,我们需要了解Java POI中的XWPFDocument类,它是用来处理.docx文件的。XWPFDocument可以读取、修改和创建...

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

    在IT行业中,Apache POI是一个广泛使用的库,它允许开发者在Java环境中创建、修改和读取Microsoft Office格式的文件,尤其是Excel文档。本教程将详细讲解如何利用Apache POI库来实现“使用POI向Excel模板动态添加...

    Java使用POI导出Word文档

    下面是一个简单的代码示例,展示了如何使用POI创建一个包含标题和内容的Word文档: ```java import org.apache.poi.xwpf.usermodel.*; public class WordExporter { public static void main(String[] args) ...

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

    在这个例子中,我们将探讨如何使用POI库来处理Word文档,特别是利用模板文件循环输出表格行并导出新的Word文档。这个过程在数据分析、报告生成或自动化文档制作等场景中非常有用。 首先,我们需要理解Word文档的...

    poi 操作excel模板

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

    Java使用poi-tl生成word文档

    Apache POI是一个广泛使用的开源库,它允许Java开发者读写Microsoft Office格式的文件,而POI-TL(Template-based Reporting Library)是POI的一个扩展,专门用于创建Word文档模板并填充数据。 首先,我们需要理解...

    使用poi根据模版生成word文档并转换成PDF文件

    通过以上步骤,你可以利用Apache POI根据模板生成Word文档,并使用PDFBox或其他转换工具将其转换为PDF。这种方法在自动化报告生成、批量文档处理等方面非常有用。不过,实际应用中,还需要根据具体需求进行调整和...

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

    本篇文章将深入探讨如何利用POI库在Word文档中进行模板替换以及循环插入表格的操作。 首先,我们需要理解Apache POI的工作原理。POI提供了HWPFOI(用于处理老版的.doc文件)和XWPF(用于处理新版的.docx文件)两个...

    使用java Apache poi 根据word模板生成word报表例子

    使用java Apache poi 根据word模板生成word报表 仅支持docx格式的word文件,大概是word2010及以后版本,doc格式不支持。 使用说明:https://blog.csdn.net/u012775558/article/details/79678701

    Java Poi流 根据Word模板插入相应的文本、表格和图片,生成新的Word报告

    在本主题中,我们将深入探讨如何使用Java POI流处理Word模板,插入文本、表格和图片,以及生成新的Word报告。 1. **Java POI流处理Word模板**: - POI API提供了`XWPFDocument`类来处理`.docx`文件,这是Word 2007...

    poi3.15,word模板以及代码

    1. 加载模板文件:使用POI的`XWPFDocument`类打开模板文档。 2. 数据绑定:找到模板中需要替换的占位符,如文本框、表格单元格等,通过`XWPFParagraph`、`XWPFTable`等对象的API进行操作。 3. 内容替换:遍历数据源...

    POI替换word模板中的关键字

    在本场景中,我们关注的是如何使用POI来处理Word文档(.docx格式),特别是替换其中的关键字以及动态追加表格。以下是对这个主题的详细解释: 1. **POI库介绍**: Apache POI提供了HWPFOI和XWPFPOI两个子项目,...

    POI-TL合并多个Word文档

    6. **处理模板**:如果使用POI-TL,你还可以预先定义好一个模板文档,包含占位符,然后用数据动态替换这些占位符,实现批量生成具有相似结构但内容不同的文档。 在压缩包中的"39.word"文件可能是示例中的一个输入...

    java Apache poi word模板 表格模板 word报表.zip

    以下是一个简单的例子,展示如何使用Apache POI替换Word模板中的文本: ```java XWPFDocument document = new XWPFDocument(OPCPackage.open("template.docx")); for (XWPFParagraph paragraph : document....

    poi文档和poi包

    POI文档通常指的是使用Apache POI库创建或处理的Microsoft Office文档。这些文档可以是电子表格(XLS或XLSX)、文字处理文档(DOC或DOCX)或演示文稿(PPT或PPTX)。POI提供了高级API,使开发者能够以编程方式操作...

    poi操作word模板

    在"poi操作word模板"的场景中,我们主要关注如何使用Apache POI库来自动化填充Word文档模板,这在批量生成报告、合同或其他需要标准化格式但需个性化数据的文档时非常有用。 首先,理解Apache POI的基本概念是必要...

Global site tag (gtag.js) - Google Analytics