`

导出EXCEL常用工具类

 
阅读更多

1、接口

 

package com.yihaodian.pis.common.util.export;

import java.io.OutputStream;
import java.util.List;

public interface ExcelExporter {

	void defineHeaders();
	
	void drawCellFormat();
	
	void addDataRow(List<String> dataRow);
	
	void writeTo(OutputStream output) throws Exception;
}

 2、ExportFactory。java

package com.yihaodian.pis.common.util.export;

import java.io.File;
import java.io.OutputStream;
import java.util.List;

/**
 * 
 * @author Tom
 *
 */
public class ExportFactory {
	
	private ExportFactory() {
	}
	
	public static void exportExcelOnTemplate(String templatePath,
			List<List<String>> dataRowList, OutputStream outputStream) throws Exception {
		ExcelExporter exporter = new TemplateExcelExporter(templatePath);
		exporter.defineHeaders();
		exporter.drawCellFormat();
		for (List<String> dataRow : dataRowList) {
			exporter.addDataRow(dataRow);
		}
		exporter.writeTo(outputStream);
	}
	
}

 3、导出工具类实现类

package com.yihaodian.pis.common.util.export;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
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;

public class TemplateExcelExporter implements ExcelExporter {

	private static final int INDEX_COPIED_ROW = 1;

	private Log log = LogFactory.getLog(this.getClass());

	private Workbook outputWorkbook;
	
	private List<CellStyle> cellFormats = new ArrayList<CellStyle>();
	
	private List<Integer> cellTypes = new ArrayList<Integer>();

	private List<List<String>> dataRowList = new ArrayList<List<String>>();

	public TemplateExcelExporter(String templatePath) {
		File template = new File(templatePath);
		if (!template.isFile()) {
			throw new IllegalArgumentException("The template file is invalid. " + templatePath);
		}

		try {
			outputWorkbook = WorkbookFactory.create(new BufferedInputStream(new FileInputStream(templatePath)));
		} catch (Exception e) {
			log.error("Failed to parse this template", e.getCause());
		}
	}

	@Override
	public void defineHeaders() {
	}

	@Override
	public void drawCellFormat() {
		Sheet sheet = outputWorkbook.getSheetAt(0);
		
		Row formatRow = sheet.getRow(INDEX_COPIED_ROW);
		Iterator<Cell> it = formatRow.iterator();
		while (it.hasNext()) {
			Cell cell = it.next();
			cellFormats.add(cell.getCellStyle());
			cellTypes.add(cell.getCellType());
		}
	}
	
	@Override 
	public void addDataRow(List<String> dataRow) {
		if (dataRow.size() > cellFormats.size()) {
			throw new IllegalArgumentException("The size of dataRow cannot be greater than the template's.");
		}
		dataRowList.add(dataRow);
	}
	
	@Override
	public void writeTo(OutputStream output) throws Exception {
	Sheet sheet = outputWorkbook.getSheetAt(0);
		
		for (int i = 0; i < dataRowList.size(); i++) {
			List<String> dataRow = dataRowList.get(i);
			int rowIndex = i + 1;
			Row row;
			if (rowIndex == INDEX_COPIED_ROW) {
				row = sheet.getRow(rowIndex);
			} else {
				row = sheet.createRow(rowIndex);
			}
			for (int j = 0; j < dataRow.size(); j++) {
				Cell cell;
				if (rowIndex == INDEX_COPIED_ROW) {
					cell = row.getCell(j);
				} else {
					cell = row.createCell(j);
				}
				
				cell.setCellStyle(cellFormats.get(j));
				cell.setCellType(cellTypes.get(j));
				cell.setCellValue(dataRow.get(j));
			}
		}
		outputWorkbook.write(output);
	}
	
}

 4、具体实现

List<List<String>> colAll = new ArrayList<List<String>>();
		for (int i = 0; i < listOppon.size(); i++) {

			OpponInfoListVO opponInfoListVO = listOppon.get(i);
			List<String> col = new ArrayList<String>();
			// oppon site name
			PisTProduct oppProduct = opponInfoListVO.getPisTProduct();
			if (null == oppProduct) {
				continue;
			}
			col.add(siteMap.get(oppProduct.getSiteId()));

			// 1到4级的分类
			final int totalLevel = 4; // 当前设定共4层目录
			Long leafCategoryId = oppProduct.getCategoryId();
			List<String> categoryNameList = new ArrayList<String>();
			try {

				int level = 0;
				// (从叶子节点开始,逆向获取父节点Name)
				while (level < (totalLevel - 1)) {
					PisTCategory pisTCatagory = pisTCategoryService
							.getPisTCategoryById(leafCategoryId);
					if (null != pisTCatagory) {
						categoryNameList.add(pisTCatagory.getCategoryName());
						leafCategoryId = pisTCatagory.getParentId();
					} else {
						categoryNameList.add("");
					}
					level++;

				}
			} catch (ServiceException e) {
				e.printStackTrace();
			}
			for (int k = categoryNameList.size() - 1; k >= 0; k--) {
				col.add(categoryNameList.get(k));
			}
			if (categoryNameList.size() < totalLevel) {
				col.add("");
			}
			String[] oppStatArr = opponInfoListVO.getPisTProductStats().split(",");
			if (null == oppStatArr) {
				continue;
			}
			// 品牌
			col.add(oppProduct.getBrandName());
			// 竞争对手商品名称
			col.add(oppProduct.getProductName());
			// 链接
			col.add(oppProduct.getProductUrl());

			if (-1 != oppStatArr[1].indexOf("有货")) {
				// 当前价格
				col.add(Float.toString(oppProduct.getPrice()));
			} else {
				col.add("");
			}
            /**对手商品状态信息*/
			// 评论数
			col.add(oppStatArr[0]);
			// 库存状态
			col.add(oppStatArr[1]);
			// 抓取时间
			col.add(oppStatArr[2]);
			
			/**yhd产品信息*/
			// 一号店商品编码
			YhdBackProduct yhdBackProduct = opponInfoListVO.getYhdBackProduct();
			if (null != yhdBackProduct) {
				col.add(yhdBackProduct.getProductCode());
				col.add(yhdBackProduct.getProductName());
				// 一号店品牌(目前yhd数据库无此信息)
				col.add("");
				col.add(yhdBackProduct.getCategoryLvName2());
				col.add(yhdBackProduct.getCategoryLvName3());
				col.add(yhdBackProduct.getCategoryLvName4());
				col.add(yhdBackProduct.getPrice() == null ? null : Float
						.toString(yhdBackProduct.getPrice()));
				// 库存状态
				// col.add(yhdBackProduct.getStock() <= 0 ? "缺货" : "有货");
				if (yhdBackProduct.getStock() <= 0) {
					col.add("缺货");
				} else {
					col.add("有货");
				}
				col.add("http://www.yihaodian.com/product/detail.do?productID="
						+ yhdBackProduct.getProductId() + "&merchantID=1");
			} else if (null == yhdBackProduct && 0 == i) {
				for (int j = 0; j < 9; j++) {
					col.add("");
				}
			}
			if (opponInfoListVO.getResultMatchDto() != null) {
				SimpleDateFormat df = new SimpleDateFormat("yy/MM/dd HH:mm");
				col.add(null == opponInfoListVO.getResultMatchDto()
						.getCreateTime() ? "" : df.format(opponInfoListVO
						.getResultMatchDto().getCreateTime()));
				col.add(1 == opponInfoListVO.getResultMatchDto().getIsManual() ? "人工匹配"
						: "自动匹配");
			} else if (null == opponInfoListVO.getResultMatchDto() && 0 == i) {
				for (int j = 0; j < 2; j++) {
					col.add("");
				}
			}
			colAll.add(col);
		}
		HttpServletResponse response = ServletActionContext.getResponse();
		response.setContentType("application/octet-stream");
		/*response.setHeader("Content-Disposition",
				"attachment;filename=exceltext.xls");*/
		String destFileName = "PIS-竞争对手商品清单-";
		destFileName +=siteMap.get(listOppon.get(0).getPisTProduct().getSiteId());
		SimpleDateFormat sd = new SimpleDateFormat("yyyy.MM.dd");
		destFileName += "-" + sd.format(new Date()) +".xlsx" ;
		
		try {
			destFileName = URLEncoder.encode(destFileName, "UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		//response.setCharacterEncoding("gbk");
		response.setHeader("Content-Disposition",
				"attachment;filename=" + destFileName);
		
		OutputStream output;
		
		String relPath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
		relPath = relPath.replaceAll("classes/", "");
		String filePath = relPath + File.separator + "exceldepository" + File.separator +"opponentProduct.xlsx";
		try {
			output = response.getOutputStream();
			ExportFactory.exportExcelOnTemplate(filePath, colAll, output);
		} catch (Exception e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
 
分享到:
评论

相关推荐

    导出 Excel 实用工具类

    简洁的导出 Excel 工具类 封装好的 poi 导出Util 实用类

    Excel导出工具类

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

    导入导出excel工具类

    这里我们讨论的“导入导出excel工具类”是一个专门处理这些任务的Java代码库,它可能包含一系列预定义的方法和逻辑,帮助开发者高效地与Excel文件进行交互。下面将详细阐述相关的知识点: 1. **Java API for Excel...

    导出Excel工具类

    在Java编程中,"导出Excel工具类"是一种常见的需求,尤其在数据分析、报表生成或者数据导出场景中。这个工具类通常包含了处理Excel文件、创建工作簿、工作表、单元格等一系列操作的方法,以便于程序员能快速便捷地将...

    excel 注解方式导入导出(包含常用工具类)

    综上所述,"excel注解方式导入导出(包含常用工具类)"这个主题涵盖了解析和生成Excel文件的编程技巧,以及在处理数据过程中常用的辅助工具类的运用。通过熟练掌握这些知识点,开发者能够更高效地处理Excel数据,...

    Excel导入导出工具类

    在Web应用程序中,有时我们需要提供功能让用户导入或导出Excel文件,这时就需要用到专门的Excel导入导出工具类。本文将详细讲解Excel导入导出工具类在Java Web开发中的实现原理、常用库以及实际应用。 首先,导入...

    C#工具类库类库 包含所有的常用工具类

    标题中的"C#工具类库类库 包含所有的常用工具类"暗示了这是一个集合,包含了多种实用工具类,能够极大地提升开发效率。这些工具类涵盖了从文件操作到网络通信的多个领域。 首先,FTP操作类是用于与FTP服务器进行...

    条件导出Excel 工具类.zip

    在给定的"条件导出Excel 工具类.zip"中,我们可以推断这是一个用于处理Excel文件的工具类库,可能包含了多种针对Excel数据导出的条件逻辑。下面将详细讨论与这个主题相关的知识点。 1. **Apache POI库**: 在Java中...

    在线导出Excel教程

    在PHP中,要在线导出Excel,最常用的是PHPExcel库或者更现代的Spout库。PHPExcel库提供了丰富的API,可以创建、读取和编辑Excel文件,但它的内存消耗较大。相比之下,Spout库则以较低的内存占用为特点,适合处理大量...

    EXCEL导出工具

    "EXCEL导出工具"是一款专门设计用于将数据从数据库(如ORACLE和SQL SERVER)导出到EXCEL的工作软件。这款工具的一大亮点是它能够处理多条查询语句,并将结果分别导出到不同的EXCEL工作表(SHEET)中,方便用户进行...

    C# excel 操作类 支持excel的各种导出

    总之,C#的Excel操作类为开发者提供了强大的工具,使他们能够轻松地处理Excel文件,实现数据的导入导出、格式设置等复杂任务,大大提升了工作效率。对于处理大量Excel数据的企业级应用来说,这样的类库是不可或缺的...

    java导出excle工具类

    Java导出Excel工具类是Java开发中常用的一种技术,它使得在Web应用或者服务中能够方便地生成Excel表格,提供数据导出的功能。在给定的"java jsp 导出 excle"标签中,我们可以推断这个工具类主要用于Java Web环境,...

    C#.net常用工具类

    标题 "C#.net常用工具类" 涉及的核心知识点主要围绕.NET框架、NPOI库以及Excel数据的导入与导出。以下是对这些技术的详细介绍: .NET框架是由微软开发的一种面向对象的编程模型,它提供了丰富的类库,用于构建各种...

    NPOI导入导出Excel

    7. **DataLabelAttribute** 类:这是一个自定义属性,可能用于装饰数据模型的属性,以便在导出Excel时为特定字段添加标签或格式。例如,可以定义一个属性来指示某个字段是标题、日期、数字还是备注。 综上所述,这...

    ASP.Net常用工具类《很全面》

    Cache、CSV文件转换、DEncrypt、FTP操作类、JS、Json、Mime、PDF、Properties、ResourceManager、XML操作类、弹出消息类、导出Excel、分词辅助类、汉字转拼音、配置文件操作类、日历、上传下载、时间操作类、视频...

    C#导出Excel和图形.zip

    在.NET开发环境中,C#是一种常用的编程语言,它提供了丰富的库和工具来处理各种任务,包括数据导出和图表创建。本压缩包“C#导出Excel和图形.zip”很可能包含一系列示例代码或教程,旨在帮助开发者学习如何在C#应用...

    Excel导出数据(根据Excel模板定义)

    在IT行业中,Excel作为一种强大的电子表格工具,常用于数据分析、报告制作和数据交换。"Excel导出数据(根据Excel模板定义)...使用Apache POI库,我们可以实现根据预设模板动态生成和导出Excel文件,满足各种业务需求。

    java实现导出excel、word、 pdf

    在Java编程中,导出Excel、Word和PDF是常见的数据呈现和报告生成需求。这些文件格式广泛用于数据存储、报表生成、文档分享等场景。以下将详细介绍如何使用Java实现这三种文件类型的导出。 首先,让我们关注Excel的...

    从VS2010导出Excel类的方法

    在.NET开发环境中,Visual Studio(VS)2010是一个常用工具,用于创建各种类型的应用程序,包括与Microsoft Office交互的项目。本文将详细介绍如何在VS2010中导出一个可以操作Excel的类,以及两种不同的实现方法。这...

    java开发常用工具类

    本文将详细解析"java开发常用工具类"中的关键知识点,包括日历、时间处理、Excel导出、网络请求、流操作、数据处理、数值计算以及XML和Web工具类。 1. **日历和时间处理**: Java中`java.util.Calendar`和`java....

Global site tag (gtag.js) - Google Analytics