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());}}@Overridepublic void defineHeaders() {}@Overridepublic 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);}@Overridepublic 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 namePisTProduct 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 blocke1.printStackTrace();}

导出EXCEL常用工具类相关推荐

  1. mykit-excel之——这是我用过的最好用的导出Excel的工具类

    mykit-excel的github链接地址为:https://github.com/sunshinelyz/mykit-excel  欢迎各位Star和Fork源码,也欢迎大家pr你牛逼哄哄的代码. ...

  2. java导出excel报表工具类

    自己写的导出excel报表的公共方法,该公共方法主要用于非横向流动性报表导出 1.创立excel基本初始步骤 XSSFWorkbook wb = new XSSFWorkbook();XSSFCell ...

  3. JFreeChart导出excel图表工具类

    1.maven的pom.xml引入相关依赖 <properties><poi-version>3.17</poi-version></properties&g ...

  4. 由需求而产生的一款db导出excel的工具

    代码地址如下: http://www.demodashi.com/demo/12062.html 程序员最大的毛病可能就是懒,因为懒所以做出了许许多多提高自己工作效率的工具. 起因于我是商业开发,既然 ...

  5. Excel常用工具---在线版V1.5使用说明

    Excel常用在线工具有哪些?Excel常用工具---在线版V1.5使用说明书 本文介绍大部分excel常用工具的使用说明.   Excel常用在线工具软件,方便的解决使用Excel办公中遇到的需要批 ...

  6. 解决导出Excel报COM类工厂错误的办法--修改版

    解决导出Excel报COM类工厂错误的办法 1.问题现象 (1)第一种:销售模板的一些报表(如日报.月报等)导出时提示如下信息 (2)第二种:有些模块的一些报表导出时,没有反应,前后台也没报错 如成本 ...

  7. JAVA常用工具类(实用高效)

    JAVA常用工具类(根据GITHUB代码统计) 从Google你能搜索到大量的关于Struts,Spring,Hibernate,iBatis等比较大的框架的资料,但是很少有人去关注一些小的工具包,但 ...

  8. 【EasyExcel】在SpringBoot+VUE项目中引入EasyExcel实现对数据的导出(封装工具类)

    在SpringBoot+VUE项目中引入EasyExcel实现导入导出 一.引入EasyExcel 通过maven引入,坐标如下: <dependency><groupId>c ...

  9. commons-lang3-3.2.jar中的常用工具类的使用

    这个包中的很多工具类可以简化我们的操作,在这里简单的研究其中的几个工具类的使用. 1.StringUtils工具类 可以判断是否是空串,是否为null,默认值设置等操作: /*** StringUti ...

最新文章

  1. Android 架构组件 - 让天下没有难做的 App
  2. FolderBrowserDialog(文件夹浏览对话框)
  3. 读《大学之路》有感①
  4. TensorFlow实现简单的卷积网络
  5. bs cs架构区别_软件架构设计分层模型和构图思考
  6. Python小笔记——urllib2得到重定向最终链接
  7. 从其他电脑拷mysql到自己电脑_mysql 数据库复制到其他电脑
  8. 安装oracle失败,停止在76%
  9. Maven入门:使用Nexus搭建Maven私服及上传下载jar包
  10. 怎样利用商业智能软件实现业务目标
  11. switchHost管理员身份运行出错问题
  12. Jmeter+badboy
  13. Weblogic安装部署步骤
  14. 匠心独运解读Mybatis源码,纯手工打造开源框架
  15. 计算机启动太慢的原因是,电脑启动慢的原因分析
  16. Acwing-4699. 如此编码
  17. 推特CEO继任者曝光:带着老婆孩子睡公司,钢铁侠20年嫡系,现在掌舵挖洞公司...
  18. linux文件权限记录,linux文件权限学习记录
  19. 如何打开.epub格式的电子书?
  20. 逻辑回归原理梳理_以python为工具 【Python机器学习系列(九)】

热门文章

  1. 2022年上半年最接地气的算法面经,本人面试过18家算法面经,吐血整理
  2. LeetCode[912]排序数组
  3. 简而不凡的“工厂模式”
  4. ZooKeeper基本概念总结
  5. 达尔文之过:人类真的和其他生物平等吗?
  6. matlab汉宁窗长度,汉宁窗的matlab实现.doc
  7. c语言 汉宁窗,常用窗函数的特点
  8. Unity Animator
  9. 电磁阀位、通、开/闭原理精髓
  10. 若依分离版代码生成器修改版