1. 程式人生 > >Apache POI 工具類 [ PoiUtil ]

Apache POI 工具類 [ PoiUtil ]


pom.xml


<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.17</version>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.7</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.20</version>
    <scope>provided</scope>
</dependency>


PoiUtil.java


package com.app.core.util;

import com.app.core.code.Symbol;
import lombok.extern.log4j.Log4j2;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
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 java.io.*;
import java.util.ArrayList;
import java.util.List;

@Log4j2
public class PoiUtil {
    /**
     * 將資料寫入EXCEL
     *
     * @param <T>
     * @param fileName  EXCEL檔名稱
     * @param sheetName EXCEL頁名
     * @param data      待寫入資料
     * @throws Exception
     */
    public static <T> void writeExcel(final String fileName, final String sheetName, final List<T[]> data) {
        OutputStream out = null;
        try {
            // 建立 EXCEL 工作簿
            XSSFWorkbook workBook = new XSSFWorkbook();
            // 建立 EXCEL Sheet 頁
            XSSFSheet sheet = workBook.createSheet(sheetName);
            // 宣告 EXCEL 行
            XSSFRow row;
            // 宣告 EXCEL 單元格
            XSSFCell cell;

            // 迭代設定EXCEL每行資料
            int rowNo = 0; // 行號
            for (T[] objs : data) {
                row = sheet.createRow(rowNo++);
                // 迭代設定EXCEL當前行每個單元格資料
                int cellNo = 0; // 列號
                for (T obj : objs) {
                    cell = row.createCell(cellNo++);
                    cell.setCellValue(String.valueOf(obj));
                }
            }

            // 建立檔案所在目錄
            String filePath = FilenameUtils.getFullPath(fileName);
            File file = new File(filePath);
            if (!file.exists()) {
                file.mkdirs();
            }
            // 設定檔案輸出流,寫入EXCEL資料
            String excelName = StringUtils.join(filePath, FilenameUtils.getBaseName(fileName), Symbol.DOT.getSymbol().concat("xlsx"));

            out = new FileOutputStream(excelName);
            // 寫入檔案流
            workBook.write(out);
            workBook.close();
        } catch (Exception e) {
            log.error("將資料寫入EXCEL出錯", e);
        } finally {
            try {
                if (null != out) {
                    out.flush();
                    out.close();
                }
            } catch (IOException e) {
                log.error("關閉檔案輸出流出錯", e);
            }
        }
    }

    /**
     * 讀取EXCEL中指定下標頁的資料
     *
     * @param fileName
     * @param sheetIndex
     * @return
     */
    public static List<String[]> readExcel(final String fileName, final Integer sheetIndex) {
        List<String[]> list = null;
        InputStream in = null;
        try {
            // 獲取檔案輸入流
            String excelName = StringUtils.join(FilenameUtils.getFullPath(fileName), FilenameUtils.getBaseName(fileName), Symbol.DOT.getSymbol().concat("xlsx"));
            in = new FileInputStream(excelName);
            // 建立 EXCEL 工作簿
            XSSFWorkbook workBook = new XSSFWorkbook(in);
            // 獲取 EXCEL Sheet 頁
            XSSFSheet sheet = workBook.getSheetAt(sheetIndex);

            list = new ArrayList<String[]>();
            String[] strArr = null;
            // 遍歷每行記錄
            for (Row row : sheet) {
                strArr = new String[row.getPhysicalNumberOfCells()];
                // 遍歷每單元格記錄
                for (Cell cell : row) {
                    // 根據單元格的型別獲取不同資料型別的值
                    CellType cellType = cell.getCellTypeEnum();
                    if (CellType.NUMERIC.equals(cellType))
                        strArr[cell.getColumnIndex()] = String.valueOf(cell.getNumericCellValue());
                    else if (CellType.STRING.equals(cellType))
                        strArr[cell.getColumnIndex()] = cell.getStringCellValue();
                }
                // 將資料放入集合
                list.add(strArr);
            }

            workBook.close();
        } catch (Exception e) {
            log.error("讀取EXCEL中指定下標頁的資料出錯", e);
        } finally {
            try {
                if (null != in)
                    in.close();
            } catch (IOException e) {
                log.error("關閉檔案輸入流出錯", e);
            }
        }
        return list;
    }
}


Symbol.java 標點符號列舉


package com.app.core.code;

public enum Symbol {
    /**
     * 逗號
     */
    COMMA(","),
    /**
     * 句號
     */
    DOT("."),
    /**
     * 冒號
     */
    COLON(":"),
    /**
     * 分號
     */
    SEMICOLON(";"),
    /**
     * 斜槓
     */
    SLASH("/"),
    /**
     * 反斜槓
     */
    BACKSLASH("\\"),
    /**
     * 加號
     */
    PLUS("+"),
    /**
     * 減號
     */
    DASH("-"),
    /**
     * 等號
     */
    EQUALS("="),
    /**
     * 下劃線
     */
    UNDERSCORE("_"),
    /**
     * 左方括號
     */
    LEFT_SQUARE_BRACKET("["),
    /**
     * 右方括號
     */
    RIGHT_SQUARE_BRACKET("]"),
    /**
     * 左大括號
     */
    LEFT_CURLY_BRACE("{"),
    /**
     * 右大括號
     */
    RIGHT_CURLY_BRACE("}"),
    /**
     * 與
     */
    AMPERSAND("&"),
    /**
     * 重音符(Tab鍵上面)
     */
    ACCENT("`"),
    /**
     * 換行符
     */
    LINE_BREAK("\r\n");

    private final String symbol;

    Symbol(String symbol) {
        this.symbol = symbol;
    }

    public String getSymbol() {
        return symbol;
    }
}