您好,登錄后才能下訂單哦!
Java中的Excel文件怎么利用利用POI進行讀寫操作?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
具體內容如下
package com.test.app.utils; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import org.apache.poi.hssf.usermodel.HSSFDateUtil; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.CollectionUtils; /** * @Description: Excel讀寫工具類 * @Author: hunger.zhu * @CreateDate: 2019/4/10 13:21 */ public class ExcelUtils { private static final Logger logger = LoggerFactory.getLogger(ExcelUtils.class); /** * 讀取Excel內容 * @param file 需要被讀的文件對象 * @param startRow 從哪一行開始讀 (rowIndex從0開始的) * @param isExcel2003 是否是excel2003還是更高的版本 * @param sheetIndex 讀取哪一個sheet (sheetIndex也是從0開始) * @return List<List<String>> * @throws Exception */ public static List<List<String>> readExcel(File file, int startRow, boolean isExcel2003, int sheetIndex) throws Exception { List<List<String>> dataLst; InputStream is = null; try { /** 創建讀取文件的輸入流 */ is = new FileInputStream(file); /** 根據版本選擇創建Workbook的方式 */ Workbook wb; if (isExcel2003) { wb = new HSSFWorkbook(is); } else { wb = new XSSFWorkbook(is); } /** 調用本類的讀取方法讀取excel數據 */ dataLst = read(wb, startRow, sheetIndex); } catch (Exception ex) { logger.error("讀取excel文件異常!", ex); ex.printStackTrace(); throw ex; } finally { if (is != null) { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } } /** 返回最后讀取的結果 */ return dataLst; } private static List<List<String>> read(Workbook wb, int startRow, int sheetIndex) { /** 總列數 */ int totalCells = 0; /** 創建集合存儲讀取的數據 */ List<List<String>> dataLst = new ArrayList<List<String>>(); /** 得到第一個shell */ Sheet sheet = wb.getSheetAt(sheetIndex); /** 得到Excel的行數 */ int totalRows = sheet.getPhysicalNumberOfRows(); /** 得到Excel的列數 */ if (totalRows >= 1 && sheet.getRow(0) != null) { totalCells = sheet.getRow(0).getPhysicalNumberOfCells(); } /** 循環Excel的行 */ for (int r = startRow; ; r++) { Row row = sheet.getRow(r); if (row == null) { break; } List<String> rowLst = new ArrayList<String>(); /** 循環Excel的列 */ for (int c = 0; c < totalCells; c++) { Cell cell = row.getCell(c); String cellValue = ""; if (null != cell) { // 以下是判斷數據的類型 switch (cell.getCellTypeEnum()) { case NUMERIC: // 數字 // 判斷是不是日期格式 if (HSSFDateUtil.isCellDateFormatted(cell)) { cellValue = cell.getDateCellValue() + ""; }else { cellValue = cell.getNumericCellValue() + ""; } break; case STRING: // 字符串 cellValue = cell.getStringCellValue(); break; case BOOLEAN: // Boolean cellValue = cell.getBooleanCellValue() + ""; break; case FORMULA: // 公式 cellValue = cell.getCellFormula() + ""; break; case BLANK: // 空值 cellValue = ""; break; case ERROR: // 故障 cellValue = "非法字符"; break; default: cellValue = "未知類型"; break; } } rowLst.add(cellValue); } /** 保存第r行的第c列 */ boolean isEmptyRow = true; if (rowLst != null) { for (String s : rowLst) { if (s != null && !s.isEmpty()) { isEmptyRow = false; } } } if (!isEmptyRow) { dataLst.add(rowLst); } } return dataLst; } /** * 讀取Excel內容 * @param filePath 被讀取文件的絕對路徑 * @param startRow * @param isExcel2003 * @param sheetIndex * @return List<List<String>> * @throws Exception */ public static List<List<String>> readExcel(String filePath, int startRow, boolean isExcel2003, int sheetIndex) throws Exception { return readExcel(new File(filePath) , startRow, isExcel2003, sheetIndex); } /** * 將數據寫入Excel工作簿 * @param header 表格的標題 * @param dataList 所需寫入的數據 List<List<String>> * @param isExcel2003 是否是excel2003還是更高的版本 * @param sheetName 生成的excel中sheet的名字 * @return Workbook 之后直接寫出即可,如workbook.write(new FileOutputStream("E://test/20190410_test.xlsx")); */ public static Workbook getWorkbookFromList(List<String> header, List<List<String>> dataList, boolean isExcel2003, String sheetName) { Workbook wb; // 創建Workbook對象(excel的文檔對象) if (isExcel2003) { wb = new HSSFWorkbook(); } else { wb = new XSSFWorkbook(); } // 建立新的sheet對象(excel的表單) Sheet sheet = wb.createSheet(sheetName); // 在sheet里創建第一行,參數為行索引(excel的行),可以是0~65535之間的任何一個 int rowNum = 0; Row row0 = sheet.createRow(rowNum); if (!CollectionUtils.isEmpty(header)) { // 設置表頭 for (int i = 0; i < header.size(); i++) { Cell cell = row0.createCell(i); // 設置單元格樣式 cell.setCellStyle(POIUtils.getCellStyle(wb, "Calibri", (short) 12)); // 設置列寬 sheet.setColumnWidth(i, 256 * 20); cell.setCellValue(header.get(i)); } rowNum++; } if (!CollectionUtils.isEmpty(dataList)) { // 填充數據 for (List<String> cellList : dataList) { Row row = sheet.createRow(rowNum); for (int i = 0; i < cellList.size(); i++) { Cell cell = row.createCell(i); cell.setCellStyle(POIUtils.getCellStyle(wb, "Calibri", (short) 12)); if (CollectionUtils.isEmpty(header)) { sheet.setColumnWidth(i, 256 * 20); } cell.setCellValue(cellList.get(i)); } rowNum++; } } return wb; } /** * 將數據寫入Excel工作簿 * @param header 表格的標題 * @param dataList 所需寫入的數據 List<Object> * @param isExcel2003 是否是excel2003還是更高的版本 * @param sheetName 生成的excel中sheet的名字 * @return Workbook對象,之后直接寫出即可,如workbook.write(new FileOutputStream("E://test/20190410_test.xlsx")); * @throws Exception */ public static Workbook getWorkbookFromObj(List<String> header, List<?> dataList, boolean isExcel2003, String sheetName) throws Exception { Workbook wb; // 創建Workbook對象(excel的文檔對象) if (isExcel2003) { wb = new HSSFWorkbook(); } else { wb = new XSSFWorkbook(); } // 建立新的sheet對象(excel的表單) Sheet sheet = wb.createSheet(sheetName); // 在sheet里創建第一行,參數為行索引(excel的行),可以是0~65535之間的任何一個 int rowNum = 0; Row row0 = sheet.createRow(rowNum); if (!CollectionUtils.isEmpty(header)) { // 設置表頭 for (int i = 0; i < header.size(); i++) { Cell cell = row0.createCell(i); // 設置單元格樣式 cell.setCellStyle(POIUtils.getCellStyle(wb, "Calibri", (short) 12)); sheet.setColumnWidth(i, 256 * 20); cell.setCellValue(header.get(i)); } rowNum++; } if (!CollectionUtils.isEmpty(dataList)) { // 填充數據 Class<? extends Object> objClass = dataList.get(0).getClass(); Field[] fields = objClass.getDeclaredFields(); for (int i = 0; i < dataList.size(); i++) { // 創建row對象 Row row = sheet.createRow(rowNum); // 遍歷獲取每一個字段的值 for (int j = 0; j < fields.length; j++) { String fieldVal = ""; Method[] methods = objClass.getDeclaredMethods(); for (Method method : methods) { if (method.getName().equalsIgnoreCase("get" + fields[j].getName())) { String property = (String) method.invoke(dataList.get(i), null); fieldVal = property == null ? "" : property; break; } } Cell cell = row.createCell(j); cell.setCellStyle(POIUtils.getCellStyle(wb, "Calibri", (short) 12)); if (CollectionUtils.isEmpty(header)) { sheet.setColumnWidth(j, 256 * 20); } cell.setCellValue(fieldVal); } rowNum++; } } return wb; } public static boolean validateExcel(String filePath) { /** 檢查文件名是否為空或者是否是Excel格式的文件 */ if (filePath == null || !(isExcel2003(filePath) || isExcel2007(filePath))) { // "文件名不是excel格式"; return false; } /** 檢查文件是否存在 */ File file = new File(filePath); if (file == null || !file.exists()) { // "文件不存在"; return false; } return true; } public static boolean isExcel2003(String filePath) { return filePath.matches("^.+\\.(?i)(xls)$"); } public static boolean isExcel2007(String filePath) { return filePath.matches("^.+\\.(?i)(xlsx)$"); } }
以下為POIUtils.java:
package com.test.app.utils; import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.usermodel.Font; import org.apache.poi.xssf.usermodel.XSSFCellStyle; import org.apache.poi.xssf.usermodel.XSSFColor; import org.apache.poi.xssf.usermodel.XSSFFont; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.awt.*; import java.awt.Color; /** * @Description: Excel的單元格樣式 * @Author: hunger.zhu * @CreateDate: 2019/4/10 13:05 */ public class POIUtils { /** * 設置單元格的邊框(細)且為黑色,字體水平垂直居中,自動換行 * @param workbook * @param fontName * @param fontSize * @return */ public static CellStyle getCellStyle(Workbook workbook, String fontName, short fontSize){ CellStyle style = workbook.createCellStyle(); Font font = workbook.createFont(); // 設置上下左右四個邊框寬度 style.setBorderTop(BorderStyle.THIN); style.setBorderBottom(BorderStyle.THIN); style.setBorderLeft(BorderStyle.THIN); style.setBorderRight(BorderStyle.THIN); // 設置上下左右四個邊框顏色 style.setTopBorderColor(IndexedColors.BLACK.getIndex()); style.setBottomBorderColor(IndexedColors.BLACK.getIndex()); style.setLeftBorderColor(IndexedColors.BLACK.getIndex()); style.setRightBorderColor(IndexedColors.BLACK.getIndex()); // 水平居中,垂直居中,自動換行 style.setAlignment(HorizontalAlignment.CENTER); style.setVerticalAlignment(VerticalAlignment.CENTER); style.setWrapText(false); // 設置字體樣式及大小 font.setFontName(fontName); font.setFontHeightInPoints(fontSize); style.setFont(font); return style; } }
關于Java中的Excel文件怎么利用利用POI進行讀寫操作問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。