EasyPOI(二)模板導出Demo

Maven座標

        <!-- EasyPOI -->
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-base</artifactId>
            <version>3.2.0</version>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-web</artifactId>
            <version>3.2.0</version>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-annotation</artifactId>
            <version>3.2.0</version>
        </dependency>

        <!-- slf4j -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </dependency>

Controller

import com.tsingsoft.modules.report.service.ExportTestService;
import lombok.AllArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;

/**
 * <p> @Title ExportTestController
 * <p> @Description 模板導出測試
 *
 * @author ACGkaka
 * @date 2020/4/19 15:44
 */
@RestController
@AllArgsConstructor
@RequestMapping("/export")
public class ExportController {
    private ExportTestService exportTestService;

    @PostMapping("/by-response")
    public void exportByResponse(HttpServletResponse response) {
        try {
            exportTestService.exportByResponse(response);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @PostMapping("/by-byte")
    public ResponseEntity exportByByte() {
        return exportTestService.exportByByte();
    }
}

Service

import org.springframework.http.ResponseEntity;
import javax.servlet.http.HttpServletResponse;

/**
 * <p> @Title ExportService
 * <p> @Description 導出測試Service
 *
 * @author ACGkaka
 * @date 2020/4/19 15:46
 */
public interface ExportService {

    /**
     * 通過HttpServiceResponse導出文件
     *
     * @param response HttpServletResponse
     */
    void exportByResponse(HttpServletResponse response);

    /**
     * 通過字節流導出文件
     * 
     * @return ResponseEntity
     */
    ResponseEntity exportByByte();
}

ServiceImpl

import cn.afterturn.easypoi.excel.ExcelExportUtil;
import lombok.AllArgsConstructor;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * <p> @Title ExportServiceImpl
 * <p> @Description 導出測試ServiceImpl
 *
 * @author zhj
 * @date 2020/4/19 15:43
 */
@Service
@AllArgsConstructor
public class ExportServiceImpl implements ExportService {

    PowerGeneratePlantRegisterMapper powerGeneratePlantRegisterMapper;

    @Override
    public void exportByResponse(HttpServletResponse response) {
        // 路徑處理
        Path templateFilePath = Paths.get("D://test//template.xlsx");
        if (!templateFilePath.getParent().toFile().exists()) {
            try {
                Files.createDirectories(templateFilePath.getParent());
            } catch (IOException e) {
                throw new RuntimeException(String.format("創建%s路徑失敗。", templateFilePath.getParent()));
            }
        }

        Map<String, Object> map = new HashMap<>();
        List<User> list = userMapper.queryAll();
        map.put("entityList", list);

        // 導出
        TemplateExportParams params = new TemplateExportParams(templateFilePath.toString());
        Workbook workbook = ExcelExportUtil.exportExcel(params, map);
        try {
            ServletOutputStream out = response.getOutputStream();
            workbook.write(out);
        } catch (IOException e) {
            throw new RuntimeException("臨時文件寫入失敗");
        }
    }

    @Override
    public ResponseEntity exportByByte() {
        // 路徑處理
        Path templateFilePath = Paths.get("D://test//template.xlsx");
        if (!templateFilePath.getParent().toFile().exists()) {
            try {
                Files.createDirectories(templateFilePath.getParent());
            } catch (IOException e) {
                throw new RuntimeException(String.format("創建%s路徑失敗。", templateFilePath.getParent()));
            }
        }

        Map<String, Object> map = new HashMap<>();
        List<User> list = userMapper.queryAll();
        map.put("entityList", list);

        TemplateExportParams params = new TemplateExportParams(templateFilePath.toString());
        Workbook workbook = ExcelExportUtil.exportExcel(params, map);
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        try {
            workbook.write(out);
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            headers.setContentDispositionFormData("attachment", URLEncoder.encode("導出文件.xlsx", "utf-8"));
            return new ResponseEntity<>(out.toByteArray(), headers, HttpStatus.CREATED);
        } catch (IOException e) {
            throw new RuntimeException("臨時文件寫入失敗");
        }
    }
}

js

function exportExcel() {

    var url = _ctx + "/export";

    var xhr = new XMLHttpRequest();
    var str = "id=" + row.id;
    xhr.open('POST', url, true);    //也可以使用POST方式,根據接口
    xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    xhr.responseType = "blob";   //返回類型blob
    xhr.onload = function () {
        //定義請求完成的處理函數
        if (this.status === 200) {
            var blob = this.response;
            if(blob.size>0){
                var reader = new FileReader();
                reader.readAsDataURL(blob);   // 轉換爲base64,可以直接放入a標籤href
                reader.onload = function (e) {
                    // 轉換完成,創建一個a標籤用於下載
                    var a = document.createElement('a');
                    a.download = row.id + '用戶數據.xls';
                    a.href = e.target.result;
                    $("body").append(a);    // 修復firefox中無法觸發click
                    a.click();
                    $(a).remove();
                }
            }else{
                window.location.reload();
            }
        }
    };
    xhr.send(str);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章