cn.hutool.poi.excel を使用して Java で Excel をエクスポートする

 複雑なセルをエクスポートしたり、セルを結合したりする必要がある場合は、チェックを入れてください。 

Java で Excel をエクスポート、セルを結合、簡単に始めることができる_SUMMERENT のブログ - CSDN ブログ

目次

 1. Maven 依存関係を導入する

2.ExportExcelVoを書く

3. xlsx と csv の両方をサポートする ExportUtil データ エクスポート ツールを作成します。

4. ExcelServiceレイヤーを記述してデータを準備する

5. コントローラー層を記述し、インターフェースを呼び出します。

6. テストエクスポート


 1. Maven 依存関係を導入する

        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.3.8</version>
        </dependency>
        <dependency>
            <groupId>cn.jimmyshi</groupId>
            <artifactId>bean-query</artifactId>
            <version>1.1.5</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>

注: 以下のエラーがある場合は、インポートされた Maven の依存関係を確認してください。 

2.ExportExcelVoを書く

@Data
public class ExportExcelVo {

    private String headOne;

    private String headTwoCome;

    private String headTwoOn;

    private String headThreeCome;

    private String headThreeOn;

    private String headFourCome;

    private String headFourOn;

    private String headFiveCome;

    private String headFiveOn;

}

3. xlsx と csv の両方をサポートする ExportUtil データ エクスポート ツールを作成します。

import cn.hutool.core.io.IoUtil;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;
import org.apache.commons.io.FilenameUtils;
import org.springframework.util.CollectionUtils;
import cn.jimmyshi.beanquery.BeanQuery;
import springboot.redis.demo.exception.MyRuntimeException;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.Writer;
import java.nio.charset.StandardCharsets;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * @Description: 导出数据工具,支持xlsx和csv两种
 * @Title: ExportUtil
 */
@Slf4j
public class ExportUtil {
    /**
     *
     * @param dataList 导出数据列表
     * @param fieldMap 导出的数据字段,key为对象字段名称,value为标题名称
     * @param fileName 导出文件名
     * @return void
     * @throws IOException 文件操作失败
     */
    public static <T> void doExport(Collection<T> dataList, Map<String,String> fieldMap,String fileName) throws IOException{
        if (CollectionUtils.isEmpty(dataList)){
            return;
        }
        StringBuilder sb = new StringBuilder(128);
        for (Map.Entry<String,String> e: fieldMap.entrySet()) {
            sb.append(e.getKey()).append(" as ").append(e.getValue()).append(", ");
        }
        //去掉末尾空格
        String fieldString = sb.substring(0,sb.length() - 2);
        //写出数据到excel格式的输出流,BeanQuery 是一个把对象转换为Map的Java工具库
        List<Map<String,Object>> resultList = BeanQuery.select(fieldString).executeFrom(dataList);
         构建HTTP输出流参数
        HttpServletResponse response = ContextUtil.getHttpResponse();
        response.setHeader("content-type", "application/octet-stream");
        response.setContentType("application/octet-stream");
        response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
        if ("xlsx".equals(FilenameUtils.getExtension(fileName))) {
            ServletOutputStream out = response.getOutputStream();
            ExcelWriter writer = ExcelUtil.getWriter(true);
            writer.setRowHeight(-1, 30);
            writer.setColumnWidth(-1, 30);
            writer.setColumnWidth(1, 20);
            writer.write(resultList);
            writer.flush(out);
            writer.close();
            IoUtil.close(out);

        } else if ("csv".equals(FilenameUtils.getExtension(fileName))) {
            Collection<String> headerList = fieldMap.values();
            String[] headerArray = new String[headerList.size()];
            headerList.toArray(headerArray);
            CSVFormat format = CSVFormat.DEFAULT.withHeader(headerArray);
            response.setCharacterEncoding(StandardCharsets.UTF_8.name());
            try (Writer out = response.getWriter(); CSVPrinter printer = new CSVPrinter(out, format)) {
                for (Map<String, Object> o : resultList) {
                    for (Map.Entry<String, Object> entry : o.entrySet()) {
                        printer.print(entry.getValue());
                    }
                    printer.println();
                }
                printer.flush();
            } catch (Exception e) {
                log.error("Failed to call ExportUtil.doExport", e);
            }
        } else {
            throw new MyRuntimeException("导出文件类型不支持!");
        }
    }

}

ContextUtil クラス 

import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletResponse;

public class ContextUtil {
    public static HttpServletResponse getHttpResponse() {
        return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
    }
}

4. ExcelServiceレイヤーを記述してデータを準備する

import java.util.ArrayList;
import java.util.List;

public class ExcelService {
    public static List<ExportExcelVo> getExportData() {
        ExportExcelVo excelVo = new ExportExcelVo();
        List<ExportExcelVo> list = new ArrayList<>();

        for (int i = 0; i < 3; i++) {
            excelVo.setHeadOne("AAA");
            excelVo.setHeadTwoCome("BBB");
            excelVo.setHeadTwoOn("CCC");
            excelVo.setHeadThreeCome("DDD");
            excelVo.setHeadThreeOn("EEE");
            excelVo.setHeadFourCome("FFF");
            excelVo.setHeadFourOn("GGG");
            excelVo.setHeadFiveCome("HHH");
            excelVo.setHeadFiveOn("III");
            list.add(excelVo);
        }
        return  list;
    }
}

5. コントローラー層を記述し、インターフェースを呼び出します。

@RestController
public class alibaba {
  
    @GetMapping("/exportA")
    public void exportA(HttpServletResponse response) throws Exception {
        List<ExportExcelVo> data = ExcelService.getExportData();
        // 构建导出的map
        Map<String,String> headerMap = new LinkedHashMap<>(21);
        headerMap.put("headOne","单元格一");
        headerMap.put("headTwoCome", "单元格二");
        headerMap.put("headTwoOn", "单元格三");
        headerMap.put("headThreeCome", "单元格四");
        headerMap.put("headThreeOn", "单元格五");
        headerMap.put("headFourCome", "单元格六");
        headerMap.put("headFourOn", "单元格七");
        headerMap.put("headFiveCome", "单元格八");
        headerMap.put("headFiveOn", "单元格九");

        ExportUtil.doExport(data,headerMap,"测试.xlsx");
    }
}

6. テストエクスポート

ブラウザのアドレスバーにアクセスします: http://localhost:プロジェクトのポート番号/exportA

複雑なセルをエクスポートしたり、セルを結合したりする必要がある場合は、チェックを入れてください。 

Java で Excel をエクスポート、セルを結合、簡単に始めることができる_SUMMERENT のブログ - CSDN ブログ

おすすめ

転載: blog.csdn.net/SUMMERENT/article/details/126499054
おすすめ