SpringBoot + POI achieve export Excel files

之前用的easyPoi 导出过程中 一直报错 因为项目比较急 索性就直接不用
**第一步   引用POM文件**
 <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.17</version>
      </dependency>
      <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.17</version>
      </dependency>
**第二步 调用两个工具类**
public class ExcelBean {
    public ExcelBean() {
    }

    public ExcelBean(int sheetNum, String sheetTitle, String[] headers, List<List<String>> data) {
        this.sheetNum = sheetNum;
        this.sheetTitle = sheetTitle;
        this.headers = headers;
        this.data = data;
    }

    private int                sheetNum;

    private String             sheetTitle;

    private String[]           headers;

    private List<List<String>> data;

    public int getSheetNum() {
        return sheetNum;
    }

    public void setSheetNum(int sheetNum) {
        this.sheetNum = sheetNum;
    }

    public String getSheetTitle() {
        return sheetTitle;
    }

    public void setSheetTitle(String sheetTitle) {
        this.sheetTitle = sheetTitle;
    }

    public String[] getHeaders() {
        return headers;
    }

    public void setHeaders(String[] headers) {
        this.headers = headers;
    }

    public List<List<String>> getData() {
        return data;
    }

    public void setData(List<List<String>> data) {
        this.data = data;
    }
}
public class ExportExcelUtils {

    /**
     * 多sheet页导出
     *
     * @param excelBeans
     * @return
     * @throws Exception
     */
    public static HSSFWorkbook exportExcel(List<ExcelBean> excelBeans) {
        HSSFWorkbook workbook = new HSSFWorkbook();
        for (ExcelBean excelBean : excelBeans) {
            exportExcel(workbook, excelBean.getSheetNum(), excelBean.getSheetTitle(), excelBean.getHeaders(),
                    excelBean.getData());
        }
        return workbook;

    }

    /**
     * 单sheet页导出
     *
     * @param bean
     * @return
     * @throws Exception
     */
    public static HSSFWorkbook exportExcel(ExcelBean bean) {
        HSSFWorkbook workbook = new HSSFWorkbook();
        exportExcel(workbook, 0, bean.getSheetTitle(), bean.getHeaders(), bean.getData());
        return workbook;
    }

    /**
     * 单sheet页导出
     *
     * @param workbook
     * @param sheetNum
     * @param sheetTitle
     * @param headers
     * @param result
     * @throws Exception
     */
    public static void exportExcel(HSSFWorkbook workbook, int sheetNum, String sheetTitle, String[] headers,
                                   List<List<String>> result) {
        // 生成一个表格
        HSSFSheet sheet = workbook.createSheet();
        workbook.setSheetName(sheetNum, sheetTitle);
        // 设置表格默认列宽度为20个字节
        sheet.setDefaultColumnWidth((short) 20);

        // 产生表格标题行
        HSSFRow row = sheet.createRow(0);
        for (int i = 0; i < headers.length; i++) {
            HSSFCell cell = row.createCell((short) i);
            HSSFRichTextString text = new HSSFRichTextString(headers[i]);
            cell.setCellValue(text.toString());
        }
        // 遍历集合数据,产生数据行
        if (result != null) {
            int index = 1;
            for (List<String> m : result) {
                row = sheet.createRow(index);
                int cellIndex = 0;
                for (String str : m) {
                    HSSFCell cell = row.createCell((short) cellIndex);
                    cell.setCellValue(str);
                    cellIndex++;
                }
                index++;
            }
        }
    }
}
	然后写方法 直接调用`
	` /**
	   * 图文分析导出
	   *
	   * @param
	   * @param response
	   */
	  @GetMapping("/export")
	  @ResponseBody
	  public void export() {
	    //articleAnalyzeParam.setUserId(AuthHelper.getUserId());
	    //HbnResult<List<ArticleAnalyzeDto>> list = articleRpc.listAllArticlesByParam(articleAnalyzeParam);
	    //模拟从数据库获取需要导出的数据
	    //模拟从数据库获取需要导出的数据
	
	    ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
	    HttpServletRequest request= servletRequestAttributes.getRequest();
	    HttpServletResponse response = servletRequestAttributes.getResponse();
	
	    List<Person> personList = new ArrayList<>();
	    Person person1 = new Person("路飞","1",new Date());
	    Person person2 = new Person("娜美","2", new Date());
	    Person person3 = new Person("索隆","1",new Date());
	    Person person4 = new Person("小狸猫","1",new Date());
	    personList.add(person1);
	    personList.add(person2);
	    personList.add(person3);
	    personList.add(person4);
	
	
	    String[] headers = { "姓名", "性别", "时间"};
	    ExcelBean bean = new ExcelBean();
	    bean.setHeaders(headers);
	    bean.setSheetNum(0);
	    bean.setSheetTitle("海贼王");
	
	    List<List<String>> data = new LinkedList<>();
	    Iterator iterator = personList.iterator();
	    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
	
	    while (iterator.hasNext()) {
	      List<String> temp = new LinkedList<>();
	      Person next = (Person) iterator.next();
	      //temp.add(next.getName()); // 其实这个意义不大的
	      if (next.getName() != null) {
	        temp.add(next.getName().toString());
	      }
	      if (next.getSex() != null) {
	        temp.add(next.getSex().toString());
	      }
	      if (next.getBirthday() != null) {
	        temp.add(next.getBirthday().toString());
	      }
	      data.add(temp);
	    }
	
	    bean.setData(data);
	
	    try {
	      buildExcelDocument(bean.getSheetTitle(), response, bean);
	    } catch (Exception e) {
	      //log.error(e.getMessage());
	      System.out.println("error");
	    }
	  }
/**
     * excel下载
     *
     * @param filename
     * @param response
     * @param bean
     * @throws IOException
     */
    protected void buildExcelDocument(String filename, HttpServletResponse response, ExcelBean bean)
      throws IOException {
      response.setHeader("Content-Disposition",
        "attachment;filename=\"" + new String((filename).getBytes("gb2312"), "ISO8859-1") + ".xls" + "\"");
      HSSFWorkbook hssfWorkbook = ExportExcelUtils.exportExcel(bean);
      hssfWorkbook.write(response.getOutputStream());
    }
返回浏览器下载 






之前传的参数直接是 HttpServletResponse 出现一个问题 好像是和JSP内置对象 冲突 一直报
**java.lang.IllegalStateException: getOutputStream() has already been called for this response**
后来找到解决方法 直接在代码里调用HttpServletResponse  就可以了


很简单的一个SpringBoot+POI 导出实现 可以根据自己的业务逻辑去改一下直接就能用

分享技术 分享生活
Released two original articles · won praise 0 · Views 266

Guess you like

Origin blog.csdn.net/weixin_43682921/article/details/105183711