`
gegewuqin9
  • 浏览: 29163 次
  • 性别: 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
分享到:
评论

相关推荐

    [net毕业设计]ASP.NET基于BS结构的实验室预约模型系统(源代码+论文).zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    中医诊所系统,WPF.zip

    中医诊所系统,WPF.zip

    [net毕业设计]ASP.NET淘宝店主交易管理系统的设计与实现(源代码+论文).zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    1-全国各省、297个地级市公路里程面板数据1999-2021年-社科数据.zip

    全国各省、297个地级市公路里程面板数据1999-2021年涵盖了中国各地区公路建设的详细情况,是衡量地区基础设施水平的重要指标。这些数据不仅包括了全国31个省份的公路里程,还深入到了297个地级市的层面,提供了从1999年至2021年的连续年份数据。这些数据来源于各省统计年鉴、经济社会发展统计数据库、地级市统计年鉴以及地级市发展统计公报,确保了数据的准确性和权威性。通过这些数据,可以观察到中国公路交通建设的发展不平衡性,沿海地区和长江中下游地区公路交通密度较高,而西部地区相对较低。这些面板数据为研究中国城市化进程、区域经济发展以及交通基础设施建设提供了宝贵的信息资源。

    技术处工作事项延期完成申请单.docx

    技术处工作事项延期完成申请单.docx

    数据库详细设计说明书中文最新版本

    本文为图书馆管理课程设计SQL Server功能规范说明书。本说明书将: 描述数据库设计的目的; 说明数据库设计中的主要组成部分; 说明数据库设计中各功能的实现。 本文档主要内容包括对数据库设计结构的总体描述,对数据库中各种对象的描述(包括对象的名称、对象的属性、对象和其他对象直接的关系);在数据库主要对象之外,本文还将描述数据库安全性设置、数据库属性设置和数据库备份策略,为数据库管理员维护数据库安全稳定地运行提供参考;有需要的朋友可以下载看看

    WebSocketError(解决方案).md

    项目中常见的问题,记录一下解决方案

    octopart(样本).csv

    octopart数据格式样例

    [net毕业设计]ASP.NET通用作业批改系统设计(源代码+论文).zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    Oracle11gRAC安装与配置forLinux中文最新版本

    本文档主要讲述的是Oracle 11g RAC安装与配置for Linux;希望对大家的学习会有帮助 文档结构 第一部分:Oracle Grid Infrastructure安装 第二部分:Oracle Clusterware与Oracle Real Application Clusters安装前准备规程 第三部分:安装Oracle Clusterware与Oracle Real Application Clusters 第四部分:Oracle Real Application Clusters环境配置 第五部分:Oracle Clusterware与Oracle Real Application Clusters参考资料

    python教程.txt

    python教程.txt

    脸部痤疮检测数据集VOC+YOLO格式3763张7类别.zip

    文件太大放服务器下请务必到资源详情查看后然后下载 样本图:blog.csdn.net/2403_88102872/article/details/143979016 重要说明:数据集为小目标检测,训练map精度偏低属于正常现象,只要能检测出来即可。如果map低于0.5请勿奇怪,因为小目标检测是业界公认难检测的研究方向之一。 数据集格式:Pascal VOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):3763 标注数量(xml文件个数):3763 标注数量(txt文件个数):3763 标注类别数:7 标注类别名称:["blackheads","cyst","fore","nodule","papule","pustule","whiteheads"]

    ASP+ACCESS基于WEB社区论坛设计与实现(源代码+论文)(源代码+论文+说明文档).zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    1-全国各地级市固定资产投资统计数据(附省、区县、行业)1996-2020年-社科数据.zip

    全国各地级市固定资产投资统计数据集覆盖了1996至2020年的时间跨度,提供了详尽的年度固定资产投资金额,单位为百万人民币。这些数据不仅包括了地级市级别的投资情况,还涵盖了省、区县以及行业等多个维度,为研究区域经济增长、投资结构和发展趋势提供了宝贵的数据支持。固定资产投资作为衡量一个地区经济发展活力和潜力的重要指标,反映了社会固定资产在生产、投资额的规模和速度。通过这些数据,研究人员可以深入分析不同地区、不同行业的投资特点,以及随时间变化的趋势,进而为政策制定和经济预测提供科学依据。

    training_plan_db.sql

    training_plan_db.sql

    [net毕业设计]ASP.NET多语种网络硬盘系统的设计(源代码+论文).zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    5.html

    5

    1-全国各省地区城乡收入差距、泰尔指数、城镇农村居民可支配收入统计数据1990-2021年-社科数据.zip

    全国各省地区城乡收入差距、泰尔指数、城镇农村居民可支配收入统计数据集提供了1990至2021年间的详细数据,覆盖全国31个省份。该数据集不仅包括城镇居民和农村居民的人均可支配收入,还涵盖了乡村人口、全体居民人均可支配收入、城镇人口以及年末常住人口等关键指标。泰尔指数作为衡量收入不平等的重要工具,通过计算城镇收入与农村收入之比,为研究者提供了一个量化城乡收入差距的科学方法。这些数据不仅有助于分析中国城乡之间的经济差异,还能为政策制定者提供决策支持,以缩小城乡差距、促进区域均衡发展。数据集的丰富性使其成为社会科学领域研究城乡发展、收入分配不平等等问题的宝贵资源。

    FileName.zip

    FileName.zip

    java面向对象 - 类与对象代码.zip

    java面向对象 - 类与对象java面向对象 - 类与对象代码.zip

Global site tag (gtag.js) - Google Analytics