Apache POI 工具類 [ PoiUtil ]
阿新 • • 發佈:2019-01-04
<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>
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; } }
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; } }