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(); }