java基於POI讀寫excel

MAVEN依賴

        <!--poi-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.12</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.12</version>
        </dependency>

java代碼

package com.songguoliang.springboot.controller;

import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;

/**
 * 讀入2007以上excel的工具類
 */
public class ExcelUtils {

    /**
     * 導出excel
     *
     * @param fos      導出流
     * @param headList excel的標題備註名稱
     * @param dataList excel數據
     */
    public static void createExcel(OutputStream fos, List<String> headList, List<List<String>> dataList) throws Exception {
        // 創建新的Excel 工作簿
        XSSFWorkbook workbook = new XSSFWorkbook();
        // 在Excel工作簿中建一工作表,其名爲缺省值
        XSSFSheet sheet = workbook.createSheet();
        // 在索引0的位置創建行(最頂端的行)
        XSSFRow row = sheet.createRow(0);
        // 設置excel頭(第一行)的頭名稱
        for (int i = 0; i < headList.size(); i++) {

            // 在索引0的位置創建單元格(左上端)
            XSSFCell cell = row.createCell(i);
            // 定義單元格爲字符串類型
            cell.setCellType(XSSFCell.CELL_TYPE_STRING);
            // 在單元格中輸入一些內容
            cell.setCellValue(headList.get(i));
        }
        // ===============================================================
        //添加數據
        for (int n = 0; n < dataList.size(); n++) {
            List<String> rowData = dataList.get(n);
            // 在索引1的位置創建行(最頂端的行)
            XSSFRow row_value = sheet.createRow(n + 1);

            // ===============================================================
            for (int i = 0; i < rowData.size(); i++) {

                // 在索引0的位置創建單元格(左上端)
                XSSFCell cell = row_value.createCell(i);
                // 定義單元格爲字符串類型
                cell.setCellType(XSSFCell.CELL_TYPE_STRING);
                // 在單元格中輸入一些內容
                cell.setCellValue((rowData.get(i)));
            }
            // ===============================================================
        }
        // 新建一輸出文件流
        // 把相應的Excel 工作簿存盤
        workbook.write(fos);
        fos.flush();
        // 操作結束,關閉文件
        fos.close();
    }

    //讀取excel
    public static List<List<String>> readExcelBy(File file) throws Exception {
        ArrayList<List<String>> sheetValue = new ArrayList<>();
        try {
            //創建工作簿
            XSSFWorkbook xssfWorkbook = new XSSFWorkbook(file);
            //讀取第一個工作表
            XSSFSheet sheet = xssfWorkbook.getSheetAt(0);
            //獲取最後一行的num,即總行數。此處從0開始計數
            int maxRow = sheet.getLastRowNum();
            for (int row = 0; row <= maxRow; row++) {
                //獲取最後單元格num,即總單元格數 ***注意:此處從1開始計數***
                int maxRol = sheet.getRow(row).getLastCellNum();
                ArrayList<String> rowValue = new ArrayList<>();
                for (int rol = 0; rol < maxRol; rol++) {
                    String str = sheet.getRow(row).getCell(rol) + "";
                    rowValue.add(str);
                }
                sheetValue.add(rowValue);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return sheetValue;
    }

    public static String encoderFileName(String fileName, HttpServletRequest request) throws UnsupportedEncodingException {
        //處理中文文件名亂碼問題
        // 獲取瀏覽器類型,通過請求頭中的User-Agent來判斷
        String ua = request.getHeader("User-Agent");
        boolean IE_LT11 = ua.contains("MSIE"); // IE11以下版本
        boolean IE11 = ua.contains("rv:11.0) like Gecko"); // IE11
        boolean Edge = ua.contains("Edge"); // win10自帶的Edge瀏覽器
        // 如果是微軟的瀏覽器,直接進行UTF-8編碼
        if (IE_LT11 || IE11 || Edge) {
            fileName = URLEncoder.encode(fileName, "UTF-8");
            // java的編碼方式和瀏覽器有略微的不同:對於空格,java編碼後的結果是加號,
            // 而瀏覽器的編碼結果是%20,因此將+替換成%20, 這樣瀏覽器才能正確解析空格
            fileName = fileName.replace("+", "%20");
        }
        // 標準瀏覽器使用Base64編碼
        else {
            Base64.Encoder encoder = Base64.getEncoder();
            fileName = encoder.encodeToString(fileName.getBytes(StandardCharsets.UTF_8));
            // =?utf-8?B?文件名?= 是告訴瀏覽器以Base64進行解碼
            fileName = "=?utf-8?B?" + fileName + "?=";
        }

        return fileName;
    }

    public static void main(String[] args) throws Exception {
        File file = new File("C:\\Users\\22051\\Desktop\\data\\Excell.xlsx");
        List<List<String>> lists = readExcelBy(file);
        System.out.println(lists);
    }

}

java導出excel到servlet

    @GetMapping("/download")
    private void download( HttpServletRequest request,HttpServletResponse response) throws Exception {
        List<String> row1 = CollUtil.newArrayList("aa", "bb", "cc", "dd");
        List<String> row2 = CollUtil.newArrayList("aa1", "bb1", "cc1", "dd1");
        List<String> row3 = CollUtil.newArrayList("aa2", "bb2", "cc2", "dd2");
        List<String> row4 = CollUtil.newArrayList("aa3", "bb3", "cc3", "dd3");
        List<String> row5 = CollUtil.newArrayList("aa4", "bb4", "cc4", "dd4");
        List<List<String>> rows = CollUtil.newArrayList(row1, row2, row3, row4, row5);
        String fileName = ExcelUtils.encoderFileName("中文名excel.xlsx", request);
        response.setContentType("application/vnd.ms-excel;charset=UTF-8");
        response.setHeader("Content-Disposition", "attachment;filename="+fileName);
        ServletOutputStream out = response.getOutputStream();
        ExcelUtils.createExcel(out, row1, rows);
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章