java导出excel(二):多个sheet

相信在大部分的web项目中都会有导出导入Excel的需求,之前我也写过一篇导出单个sheet工作表的文章,没看过的小伙伴可以去看哈,链接也给大家放出来了: 导出单个sheet

但是在我们日常的工作中,需求往往没这么简单,可能需要将数据按类型分类导出或者数据量过大,需要分多张表导出等等。遇到类似的需求该怎么办呢,别慌,往下看。

一、pom引用

pom文件中,添加以下依赖

查看代码

        <!--Excel工具-->
        <dependency>
            <groupid>org.apache.poi</groupid>
            <artifactid>poi</artifactid>
            <version>5.2.2</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupid>org.apache.poi</groupid>
            <artifactid>poi-ooxml</artifactid>
            <version>5.2.2</version>
            <scope>compile</scope>
        </dependency>

二、工具类util

1.ExportSheetUtil

查看代码

&#xA0;package com.***.excel;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.springframework.http.MediaType;

import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.util.List;

/**
 * @description: excel&#x5BFC;&#x51FA;&#x591A;&#x4E2A;sheet&#x5DE5;&#x5177;&#x7C7B;
 * @author: ***
 * @date: 2022/9/15
 */
public class ExportSheetUtil {

    /**
     * &#x62C6;&#x89E3;&#x5E76;&#x5BFC;&#x51FA;&#x591A;&#x91CD;Excel
     */
    public static void exportManySheetExcel(String fileName, List<excelsheet> mysheets, HttpServletResponse response) {
        //&#x521B;&#x5EFA;&#x5DE5;&#x4F5C;&#x8584;
        HSSFWorkbook wb = new HSSFWorkbook();
        //&#x8868;&#x5934;&#x6837;&#x5F0F;
        HSSFCellStyle style = wb.createCellStyle();
        // &#x5782;&#x76F4;
        style.setVerticalAlignment(VerticalAlignment.CENTER);
        // &#x6C34;&#x5E73;
        style.setAlignment(HorizontalAlignment.CENTER);
        //&#x5B57;&#x4F53;&#x6837;&#x5F0F;
        HSSFFont fontStyle = wb.createFont();
        fontStyle.setFontName("&#x5FAE;&#x8F6F;&#x96C5;&#x9ED1;");
        fontStyle.setFontHeightInPoints((short) 12);
        style.setFont(fontStyle);
        for (ExcelSheet excel : mysheets) {
            //&#x65B0;&#x5EFA;&#x4E00;&#x4E2A;sheet
            //&#x83B7;&#x53D6;&#x8BE5;sheet&#x540D;&#x79F0;
            HSSFSheet sheet = wb.createSheet(excel.getFileName());
            //&#x83B7;&#x53D6;sheet&#x7684;&#x6807;&#x9898;&#x540D;
            String[] handers = excel.getHanders();
            //&#x7B2C;&#x4E00;&#x4E2A;sheet&#x7684;&#x7B2C;&#x4E00;&#x884C;&#x4E3A;&#x6807;&#x9898;
            HSSFRow rowFirst = sheet.createRow(0);
            //&#x5199;&#x6807;&#x9898;
            for (int i = 0; i < handers.length; i++) {
                //&#x83B7;&#x53D6;&#x7B2C;&#x4E00;&#x884C;&#x7684;&#x6BCF;&#x4E2A;&#x5355;&#x5143;&#x683C;
                HSSFCell cell = rowFirst.createCell(i);
                //&#x5F80;&#x5355;&#x5143;&#x683C;&#x91CC;&#x5199;&#x6570;&#x636E;
                cell.setCellValue(handers[i]);
                //&#x52A0;&#x6837;&#x5F0F;
                cell.setCellStyle(style);
                //&#x8BBE;&#x7F6E;&#x6BCF;&#x5217;&#x7684;&#x5217;&#x5BBD;
                sheet.setColumnWidth(i, 4000);
            }
            //&#x5199;&#x6570;&#x636E;&#x96C6;
            List<string[]> dataset = excel.getDataset();
            for (int i = 0; i < dataset.size(); i++) {
                //&#x83B7;&#x53D6;&#x8BE5;&#x5BF9;&#x8C61;
                String[] data = dataset.get(i);
                //&#x521B;&#x5EFA;&#x6570;&#x636E;&#x884C;
                HSSFRow row = sheet.createRow(i + 1);
                for (int j = 0; j < data.length; j++) {
                    //&#x8BBE;&#x7F6E;&#x5BF9;&#x5E94;&#x5355;&#x5143;&#x683C;&#x7684;&#x503C;
                    row.createCell(j).setCellValue(data[j]);
                }
            }
        }

        // &#x4E0B;&#x8F7D;&#x6587;&#x4EF6;&#x8C37;&#x6B4C;&#x6587;&#x4EF6;&#x540D;&#x4F1A;&#x4E71;&#x7801;,&#x7528;IE
        try {
            response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName + ".xlsx", "utf-8"));
            response.setHeader("Cache-Control", "No-cache");
            response.flushBuffer();
            wb.write(response.getOutputStream());
            wb.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}</string[]></excelsheet>

2.ExcelSheet

查看代码

&#xA0;package com.***.excel;

import lombok.Data;

import java.util.List;

/**
 * @description: &#x5BFC;&#x51FA;&#x591A;&#x4E2A;sheet&#x8868;
 * @author: ***
 * @date: 2022/9/15
 */
@Data
public class ExcelSheet {

    /*** sheet&#x7684;&#x540D;&#x79F0;*/
    private String fileName;

    /*** sheet&#x91CC;&#x7684;&#x6807;&#x9898;*/
    private String[] handers;

    /*** sheet&#x91CC;&#x7684;&#x6570;&#x636E;&#x96C6;*/
    private List<string[]> dataset;

    public ExcelSheet(String fileName, String[] handers, List<string[]> dataset) {
        this.fileName = fileName;
        this.handers = handers;
        this.dataset = dataset;
    }

}</string[]></string[]>

三、相关业务代码

1.service层

    /*** &#x5BFC;&#x51FA;&#x5F00;&#x7968;&#x53CA;&#x8FD0;&#x5355;&#x4FE1;&#x606F;*/
    ExportInvoiceAndBillVo exportInvoiceAndBillInfo(InvoiceReviewListDto dto);

2.impl实现类

实现类里的代码,需要各位根据自己的业务场景进行改动,无非就是将需要导出的数据先查出来,带入模板中,调用工具类的方法导出。

查看代码

&#xA0;package com.***.vo.invoicereview;

import lombok.Data;

import java.io.Serializable;
import java.util.List;

/**
 * @description: &#x5BFC;&#x51FA;&#x5F00;&#x7968;&#x548C;&#x8FD0;&#x5355;&#x4FE1;&#x606F;Vo
 * @author: ***
 * @date: 2022/9/19
 */
@Data
public class ExportInvoiceAndBillVo implements Serializable {

    /*** &#x5F00;&#x7968;&#x4FE1;&#x606F;*/
    private List<string[]> invoiceList;

    /*** &#x8FD0;&#x5355;&#x4FE1;&#x606F;*/
    private List<string[]> billList;

}</string[]></string[]>

查看代码

&#xA0;    @Override
    public ExportInvoiceAndBillVo exportInvoiceAndBillInfo(InvoiceReviewListDto dto) {
        ExportInvoiceAndBillVo invoiceAndBill = new ExportInvoiceAndBillVo();
        // &#x67E5;&#x8BE2;&#x9700;&#x8981;&#x5BFC;&#x51FA;&#x7684;&#x5F00;&#x7968;&#x4FE1;&#x606F;
        PageInfo<invoicereviewlistvo> pageInfo = queryInvoiceReviewList(dto);
        List<invoicereviewlistvo> invoiceList = pageInfo.getList();
        if (invoiceList.size() > 10000) {
            throw new ServiceException("&#x5F00;&#x7968;&#x6570;&#x636E;&#x8FC7;&#x591A;,&#x8BF7;&#x5206;&#x6279;&#x6B21;&#x5BFC;&#x51FA;");
        }
        // &#x67E5;&#x8BE2;&#x9700;&#x8981;&#x5BFC;&#x51FA;&#x7684;&#x8F66;&#x8FD0;&#x8FD0;&#x5355;&#x4FE1;&#x606F;
        List<long> invoiceIdList = invoiceList.stream().map(InvoiceReviewListVo::getInvoiceId).collect(Collectors.toList());
        List<exportbillvo> billList = getBillInfo(invoiceIdList);
        if (billList.size() > 10000) {
            throw new ServiceException("&#x8FD0;&#x5355;&#x6570;&#x636E;&#x8FC7;&#x591A;,&#x8BF7;&#x5206;&#x6279;&#x6B21;&#x5BFC;&#x51FA;");
        }
        // &#x5C06;&#x8868;1 &#x8868;2&#x7684;&#x6570;&#x636E; &#x653E;&#x5165;&#x5B9A;&#x4E49;&#x7684;&#x5BF9;&#x8C61;Vo&#x4E2D;
        invoiceAndBill.setInvoiceList(getInvoiceDataList(invoiceList));
        invoiceAndBill.setBillList(getBillDataList(billList));
        return invoiceAndBill;
    }</exportbillvo></long></invoicereviewlistvo></invoicereviewlistvo>

3.controller层

controller层的代码需要注意的是:

1.因为导出Excel一般都是通过浏览器进行下载的,所以入参中需要加入 HttpServletResponse

2.调用封装的工具类 ExportSheetUtil中的 exportManySheetExcel方法就可以了

3.表头和表名需要各位根据自身的业务场景修改哈

查看代码

&#xA0;    /**
     * &#x5BFC;&#x51FA;&#x5F00;&#x7968;&#x548C;&#x8FD0;&#x5355;&#x4FE1;&#x606F;
     */
    @Log
    @PostMapping("/exportInvoiceAndBillInfo")
    public void exportInvoiceAndBillInfo(@RequestBody InvoiceReviewListDto dto, HttpServletResponse response) {
        ExportInvoiceAndBillVo invoiceAndBillVo = invoiceFacadeService.exportInvoiceAndBillInfo(dto);
        //&#x8BBE;&#x7F6E;sheet&#x7684;&#x8868;&#x5934;&#x4E0E;&#x8868;&#x540D;
        String[] invoiceSheetHead = {"&#x5F00;&#x7968;&#x7F16;&#x53F7;", "&#x7968;&#x53F7;", "&#x516C;&#x53F8;&#x540D;&#x79F0;", "&#x6536;&#x7968;&#x65B9;&#x540D;&#x79F0;", "&#x7ED3;&#x7B97;&#x7C7B;&#x578B;", "&#x7EB3;&#x7A0E;&#x8BC6;&#x522B;&#x7801;", "&#x6536;&#x7968;&#x8054;&#x7CFB;&#x4EBA;", "&#x8054;&#x7CFB;&#x4EBA;&#x7535;&#x8BDD;", "&#x8FD0;&#x5355;&#x603B;&#x91D1;&#x989D;(&#x5143;)", "&#x542B;&#x7A0E;&#x603B;&#x91D1;&#x989D;(&#x5143;)", "&#x5F00;&#x7968;&#x72B6;&#x6001;", "&#x63D0;&#x4EA4;&#x5F00;&#x7968;&#x65F6;&#x95F4;", "&#x8FD0;&#x8425;&#x5BA1;&#x6838;&#x65F6;&#x95F4;", "&#x8FD0;&#x8425;&#x5BA1;&#x6838;&#x4EBA;", "&#x8D22;&#x52A1;&#x5BA1;&#x6838;&#x65F6;&#x95F4;", "&#x8D22;&#x52A1;&#x5BA1;&#x6838;&#x4EBA;", "&#x5F00;&#x7968;&#x5B8C;&#x6210;&#x65F6;&#x95F4;", "&#x51B2;&#x9500;&#x64CD;&#x4F5C;&#x4EBA;", "&#x51B2;&#x9500;&#x65F6;&#x95F4;"};
        String[] billSheetHead = {"&#x5F00;&#x7968;&#x7F16;&#x53F7;", "&#x8FD0;&#x5355;&#x53F7;", "&#x53D1;&#x8D27;&#x5730;", "&#x6536;&#x8D27;&#x5730;", "&#x53F8;&#x673A;", "&#x53F8;&#x673A;&#x7535;&#x8BDD;", "&#x8D27;&#x7269;&#x540D;&#x79F0;", "&#x8D27;&#x7269;&#x6570;&#x91CF;", "&#x5355;&#x4F4D;", "&#x8D27;&#x7269;&#x91CD;&#x91CF;(&#x5428;)", "&#x8FD0;&#x5355;&#x72B6;&#x6001;", "&#x8FD0;&#x5355;&#x91D1;&#x989D;(&#x5143;)", "&#x542B;&#x7A0E;&#x91D1;&#x989D;(&#x5143;)"};
        ExcelSheet invoiceExcel = new ExcelSheet("&#x5F00;&#x7968;&#x4FE1;&#x606F;", invoiceSheetHead, invoiceAndBillVo.getInvoiceList());
        ExcelSheet billExcel = new ExcelSheet("&#x8FD0;&#x5355;&#x4FE1;&#x606F;", billSheetHead, invoiceAndBillVo.getBillList());
        List<excelsheet> mysheet = new ArrayList<>();
        mysheet.add(invoiceExcel);
        mysheet.add(billExcel);
        ExportSheetUtil.exportManySheetExcel("&#x5F00;&#x7968;&#x53CA;&#x8FD0;&#x5355;&#x4FE1;&#x606F;", mysheet, response);
    }</excelsheet>

最终导出的Excel文件:

java导出excel(二):多个sheet

java导出excel(二):多个sheet

Original: https://www.cnblogs.com/wyj-java/p/16747297.html
Author: Javaの甘乃迪
Title: java导出excel(二):多个sheet

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/801586/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球