导出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();
		}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值