最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java利用POI讀寫Excel文件工具類

 更新時(shí)間:2020年12月31日 10:41:24   作者:Lieforlove  
這篇文章主要為大家詳細(xì)介紹了Java利用POI讀寫Excel文件的工具類,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了Java讀寫Excel文件工具類的具體代碼,供大家參考,具體內(nèi)容如下

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內(nèi)容
   * @param file 需要被讀的文件對(duì)象
   * @param startRow 從哪一行開始讀 (rowIndex從0開始的)
   * @param isExcel2003  是否是excel2003還是更高的版本
   * @param sheetIndex  讀取哪一個(gè)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 {
      /** 創(chuàng)建讀取文件的輸入流 */
      is = new FileInputStream(file);
      /** 根據(jù)版本選擇創(chuàng)建Workbook的方式 */
      Workbook wb;
      if (isExcel2003) {
        wb = new HSSFWorkbook(is);
      } else {
        wb = new XSSFWorkbook(is);
      }
      /** 調(diào)用本類的讀取方法讀取excel數(shù)據(jù) */
      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();
        }
      }
    }
    /** 返回最后讀取的結(jié)果 */
    return dataLst;
  }
 
  private static List<List<String>> read(Workbook wb, int startRow, int sheetIndex) {
    /** 總列數(shù) */
    int totalCells = 0;
   /** 創(chuàng)建集合存儲(chǔ)讀取的數(shù)據(jù) */
    List<List<String>> dataLst = new ArrayList<List<String>>();
    /** 得到第一個(gè)shell */
    Sheet sheet = wb.getSheetAt(sheetIndex);
    /** 得到Excel的行數(shù) */
    int totalRows = sheet.getPhysicalNumberOfRows();
    /** 得到Excel的列數(shù) */
    if (totalRows >= 1 && sheet.getRow(0) != null) {
      totalCells = sheet.getRow(0).getPhysicalNumberOfCells();
    }
    /** 循環(huán)Excel的行 */
    for (int r = startRow; ; r++) {
      Row row = sheet.getRow(r);
      if (row == null) {
        break;
      }
      List<String> rowLst = new ArrayList<String>();
      /** 循環(huán)Excel的列 */
      for (int c = 0; c < totalCells; c++) {
        Cell cell = row.getCell(c);
        String cellValue = "";
        if (null != cell) {
          // 以下是判斷數(shù)據(jù)的類型
          switch (cell.getCellTypeEnum()) {
          case NUMERIC: // 數(shù)字
           // 判斷是不是日期格式
           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內(nèi)容
   * @param filePath 被讀取文件的絕對(duì)路徑
   * @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);
  }
 
  /**
   * 將數(shù)據(jù)寫入Excel工作簿
   * @param header  表格的標(biāo)題
   * @param dataList 所需寫入的數(shù)據(jù) 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;
    // 創(chuàng)建Workbook對(duì)象(excel的文檔對(duì)象)
    if (isExcel2003) {
      wb = new HSSFWorkbook();
    } else {
      wb = new XSSFWorkbook();
    }
    // 建立新的sheet對(duì)象(excel的表單)
    Sheet sheet = wb.createSheet(sheetName);
    // 在sheet里創(chuàng)建第一行,參數(shù)為行索引(excel的行),可以是0~65535之間的任何一個(gè)
    int rowNum = 0;
    Row row0 = sheet.createRow(rowNum);
    if (!CollectionUtils.isEmpty(header)) {
      // 設(shè)置表頭
      for (int i = 0; i < header.size(); i++) {
        Cell cell = row0.createCell(i);
        // 設(shè)置單元格樣式
        cell.setCellStyle(POIUtils.getCellStyle(wb, "Calibri", (short) 12));
        // 設(shè)置列寬
        sheet.setColumnWidth(i, 256 * 20);
        cell.setCellValue(header.get(i));
      }
      rowNum++;
    }
    if (!CollectionUtils.isEmpty(dataList)) {
      // 填充數(shù)據(jù)
      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;
  }
 
  /**
   * 將數(shù)據(jù)寫入Excel工作簿
   * @param header  表格的標(biāo)題
   * @param dataList 所需寫入的數(shù)據(jù) List<Object>
   * @param isExcel2003  是否是excel2003還是更高的版本
   * @param sheetName   生成的excel中sheet的名字
   * @return Workbook對(duì)象,之后直接寫出即可,如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;
    // 創(chuàng)建Workbook對(duì)象(excel的文檔對(duì)象)
    if (isExcel2003) {
      wb = new HSSFWorkbook();
    } else {
      wb = new XSSFWorkbook();
    }
    // 建立新的sheet對(duì)象(excel的表單)
    Sheet sheet = wb.createSheet(sheetName);
    // 在sheet里創(chuàng)建第一行,參數(shù)為行索引(excel的行),可以是0~65535之間的任何一個(gè)
    int rowNum = 0;
    Row row0 = sheet.createRow(rowNum);
    if (!CollectionUtils.isEmpty(header)) {
      // 設(shè)置表頭
      for (int i = 0; i < header.size(); i++) {
        Cell cell = row0.createCell(i);
        // 設(shè)置單元格樣式
        cell.setCellStyle(POIUtils.getCellStyle(wb, "Calibri", (short) 12));
        sheet.setColumnWidth(i, 256 * 20);
        cell.setCellValue(header.get(i));
      }
      rowNum++;
    }
    if (!CollectionUtils.isEmpty(dataList)) {
      // 填充數(shù)據(jù)
      Class<? extends Object> objClass = dataList.get(0).getClass();
      Field[] fields = objClass.getDeclaredFields();
      for (int i = 0; i < dataList.size(); i++) {
        // 創(chuàng)建row對(duì)象
        Row row = sheet.createRow(rowNum);
        // 遍歷獲取每一個(gè)字段的值
        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 {
 
 /**
 * 設(shè)置單元格的邊框(細(xì))且為黑色,字體水平垂直居中,自動(dòng)換行
 * @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();
     // 設(shè)置上下左右四個(gè)邊框?qū)挾?
     style.setBorderTop(BorderStyle.THIN);
     style.setBorderBottom(BorderStyle.THIN);
     style.setBorderLeft(BorderStyle.THIN);
     style.setBorderRight(BorderStyle.THIN);
     // 設(shè)置上下左右四個(gè)邊框顏色
     style.setTopBorderColor(IndexedColors.BLACK.getIndex());
     style.setBottomBorderColor(IndexedColors.BLACK.getIndex());
     style.setLeftBorderColor(IndexedColors.BLACK.getIndex());
     style.setRightBorderColor(IndexedColors.BLACK.getIndex());
     // 水平居中,垂直居中,自動(dòng)換行
     style.setAlignment(HorizontalAlignment.CENTER);
     style.setVerticalAlignment(VerticalAlignment.CENTER);
     style.setWrapText(false);
     // 設(shè)置字體樣式及大小
     font.setFontName(fontName);
     font.setFontHeightInPoints(fontSize);
     
     style.setFont(font);
     
     return style;
  }
 
 
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于Java并發(fā)容器ConcurrentHashMap#put方法解析

    基于Java并發(fā)容器ConcurrentHashMap#put方法解析

    下面小編就為大家?guī)硪黄贘ava并發(fā)容器ConcurrentHashMap#put方法解析。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • Java foreach循環(huán)的使用方法詳解

    Java foreach循環(huán)的使用方法詳解

    Java SE5引入了一種更加簡(jiǎn)潔的for語法用于數(shù)組和容器,即foreach語法,表示不必創(chuàng)建int變量去對(duì)由訪問項(xiàng)構(gòu)成的序列進(jìn)行計(jì)數(shù),foreach將自動(dòng)產(chǎn)生每一項(xiàng),這種循環(huán)方式在我們后來遍歷集合時(shí)很常用,所以也有必要來學(xué)習(xí)一下,需要的朋友可以參考下
    2023-05-05
  • Java中的LinkedHashSet源碼解讀

    Java中的LinkedHashSet源碼解讀

    這篇文章主要介紹了Java中的LinkedHashSet源碼解讀,LinkedHashSet?是?Java?中的一個(gè)集合類,它是?HashSet?的子類,并實(shí)現(xiàn)了?Set?接口,與?HashSet?不同的是,LinkedHashSet?保留了元素插入的順序,并且具有?HashSet?的快速查找特性,需要的朋友可以參考下
    2023-09-09
  • Spring?Boot?集成?Swagger2構(gòu)建?API文檔

    Spring?Boot?集成?Swagger2構(gòu)建?API文檔

    這篇文章主要介紹了Spring?Boot?集成?Swagger2構(gòu)建?API文檔,通過使用?Swagger,我們只需要按照它所給定的一系列規(guī)范去定義接口以及接口的相關(guān)信息,然后它就能幫我們自動(dòng)生成各種格式的接口文檔,方便前后端開發(fā)者進(jìn)行前后端聯(lián)調(diào),下文需要的朋友可以參考一下
    2022-03-03
  • Java Hibernate中的查詢策略和抓取策略

    Java Hibernate中的查詢策略和抓取策略

    Hibernate是一種Java對(duì)象關(guān)系映射框架,提供了多種查詢和抓取策略,用于優(yōu)化數(shù)據(jù)庫訪問性能。查詢策略包括延遲加載、立即加載、查詢緩存等,抓取策略包括join抓取、子查詢抓取、批量抓取等。這些策略可以根據(jù)實(shí)際應(yīng)用場(chǎng)景進(jìn)行選擇和配置,提高數(shù)據(jù)訪問的效率和穩(wěn)定性
    2023-04-04
  • Java HashSet集合存儲(chǔ)遍歷學(xué)生對(duì)象代碼實(shí)例

    Java HashSet集合存儲(chǔ)遍歷學(xué)生對(duì)象代碼實(shí)例

    這篇文章主要介紹了Java HashSet集合存儲(chǔ)遍歷學(xué)生對(duì)象代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Go Java算法之外觀數(shù)列實(shí)現(xiàn)方法示例詳解

    Go Java算法之外觀數(shù)列實(shí)現(xiàn)方法示例詳解

    這篇文章主要為大家介紹了Go Java算法外觀數(shù)列實(shí)現(xiàn)的方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 基于SpringBoot集成測(cè)試遠(yuǎn)程連接Redis服務(wù)的教程詳解

    基于SpringBoot集成測(cè)試遠(yuǎn)程連接Redis服務(wù)的教程詳解

    這篇文章主要介紹了基于SpringBoot集成測(cè)試遠(yuǎn)程連接的Redis服務(wù)的相關(guān)知識(shí),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Java文件快速copy復(fù)制實(shí)例代碼

    Java文件快速copy復(fù)制實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于Java文件快速copy復(fù)制的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • JDK8?中Arrays.sort()?排序方法詳解

    JDK8?中Arrays.sort()?排序方法詳解

    這篇文章主要介紹了JDK8?中Arrays.sort()?排序方法解讀,本文先行介紹Arrays.sort()中影響排序方式的幾個(gè)因素,影響因素主要為數(shù)組類型、數(shù)組大小,結(jié)合閾值對(duì)排序方式進(jìn)行選擇,需要的朋友可以參考下
    2023-05-05

最新評(píng)論

东源县| 璧山县| 紫阳县| 南汇区| 巧家县| 靖州| 房产| 岐山县| 大名县| 茌平县| 普宁市| 东辽县| 扬中市| 武安市| 蒲城县| 调兵山市| 偏关县| 江达县| 塔河县| 石泉县| 枣庄市| 犍为县| 喀喇沁旗| 马山县| 甘孜县| 哈密市| 民权县| 碌曲县| 南充市| 高尔夫| 灵寿县| 台南市| 衡山县| 海宁市| 通渭县| 中西区| 宣汉县| 峡江县| 林西县| 水富县| 塔河县|