初識Apache POI框架(講述如何操做Excel文檔)

Apache POI項目官網:http://poi.apache.org/html

參考文檔:java

採用用戶模式解析Excel文件:http://poi.apache.org/spreadsheet/quick-guide.htmlgit

解析大數據量XLSX文件(Apache官方的一個Demo):github

https://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/xssf/eventusermodel/XLSX2CSV.javaapache

解析大數據量XLS文件(也是Apache官方的一個Demo):app

https://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/hssf/eventusermodel/examples/XLS2CSVmra.javaxss

寫入大數據量(僅支持XLSX後綴,Apache官方的一個Demo):ide

https://poi.apache.org/spreadsheet/how-to.html#sxssfsvn

官方更多Demo:函數

http://poi.apache.org/spreadsheet/examples.html

==============================================================

前言&注意

此項目已被打成Jar包上傳到了Maven中央倉庫,若你使用Maven管理項目,那麼你能夠直接引用到你的項目中使用:

<dependency>
    <groupId>com.github.flyinghe</groupId>
    <artifactId>common-utils</artifactId>
    <version>2.3.3-RELEASE</version>
</dependency>

因爲代碼量偏多,有的依賴其餘類的代碼並未貼出,爲節省篇幅只貼出了核心代碼。詳細代碼你能夠參考託管在Github上的代碼。而且你也可使用Maven依賴直接使用這些庫,使用時同大多數開源項目同樣你須要遵循相關開源協議,具體使用哪一種開源協議項目中已闡述

==============================================================

1.引入依賴:

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

 

2.用於讀取小數據量的方式

因爲此方法在讀取Excel文件時會加載整個Excel文檔到內存,因此此方式適用於讀取小數據量的文件。

代碼以下:

package at.flying.tools;

import org.apache.commons.lang.time.DateUtils;
import org.apache.poi.ss.usermodel.*;

import java.io.File;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 本類用於讀取Excel文檔,使用POI(3.14及以上版本)技術解析,使用時需導入相關Jar包。
* 注意:讀取的Excel文件格式爲,第0行(0-based)爲標題行(可做爲列名行列名的解釋說明),
 * 第1行爲列名行(存儲在Map中時做爲key),後面的行稱爲數據行(存儲在Map時的value),
 * Excel文件中每個Sheet的格式均是這樣
 *
 * @author Flying
 */
public class ReadExcelUtils {
    private static String[] pattern =
            new String[]{"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm:ss.S", "yyyy.MM.dd",
                    "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm:ss.S", "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss",
                    "yyyy/MM/dd HH:mm:ss.S",};

    private ReadExcelUtils() {}

    /**
     * 獲取指定單元格的內容。只能是日期(返回java.util.Date),整數值(返回的均是String類型),小數值(返回的均是String類型,並
     * 保留兩位小數),字符串, 布爾類型。 其餘類型返回null。
     *
     * @param type 指定類型(Cell中定義的類型)
     * @param cell 指定單元格
     * @return 返回Cell裏的內容
     */
    public static Object getCellValue(int type, Cell cell) {
        switch (type) {
            case Cell.CELL_TYPE_BOOLEAN:
                return cell.getBooleanCellValue();
            case Cell.CELL_TYPE_NUMERIC:
                if (DateUtil.isCellDateFormatted(cell)) {
                    return DateUtil.getJavaDate(cell.getNumericCellValue());
                } else {
                    BigDecimal bd = new BigDecimal(cell.getNumericCellValue());
                    return bd.toString().contains(".") ? bd.setScale(2, RoundingMode.HALF_UP).toString() :
                            bd.toString();
                }
            case Cell.CELL_TYPE_STRING:
                try {
                    return DateUtils.parseDate(cell.getStringCellValue(), ReadExcelUtils.pattern);
                } catch (Exception e) {
                    return cell.getStringCellValue();
                }
            case Cell.CELL_TYPE_FORMULA:
                if (DateUtil.isCellDateFormatted(cell)) {
                    return cell.getDateCellValue();
                }
                break;
            default:
                break;
        }
        return null;
    }

    /**
     * 獲取指定Sheet頁的列名,列名必須在第1列,0-based
     *
     * @param sheet 指定Sheet頁
     * @return 返回List
     * @throws Exception
     */
    public static List<String> getColumnOfSheet(Sheet sheet) throws Exception {
        // 獲取列名
        Row row = sheet.getRow(1);
        if (row == null) {
            throw new Exception("The Column name is invalid!");
        }
        List<String> columnList = new ArrayList<String>();
        // 遍歷列名並存入List中
        for (int i = 0; i < row.getLastCellNum(); i++) {
            Cell cell = row.getCell(i);
            if (cell != null) {
                columnList.add(cell.getStringCellValue());
            }
        }
        return columnList;
    }

    /**
     * 將指定Sheet頁的數據轉化成beanMap存入List中,列名對應值從第2行開始,0-based
     *
     * @param sheet 指定Sheet頁
     * @return 無結果返回空List
     * @throws Exception
     */
    public static List<Map<String, Object>> handleSheetToMapList(Sheet sheet) throws Exception {
        List<Map<String, Object>> listMap = new ArrayList<>();
        // 獲得Sheet裏的列名
        List<String> columnList = ReadExcelUtils.getColumnOfSheet(sheet);
        for (int i = 2; i < sheet.getLastRowNum() + 1; i++) {
            Map<String, Object> beanMap = new HashMap<>();
            // 獲得行
            Row row = sheet.getRow(i);
            // 遍歷列
            for (int j = 0; j < row.getLastCellNum(); j++) {
                // 獲取單元格
                Cell cell = row.getCell(j);
                if (cell != null) {
                    // 單元格對應列名
                    String key = columnList.get(j);
                    // 單元格對應值
                    Object value = ReadExcelUtils.getCellValue(cell.getCellType(), cell);
                    // key-value pairs 放入map
                    if (value != null) {
                        beanMap.put(key, value);
                    }
                }
            }
            // 將每一個beanMap放入List中
            if (!beanMap.isEmpty()) {
                listMap.add(beanMap);
            }
        }
        return listMap;
    }

    /**
     * 將WorkBook裏的全部Sheet裏的記錄封裝成beanMap放入List中。
     *
     * @param workbook 指定WorkBook
     * @return 無結果返回空List
     * @throws Exception
     */
    public static List<Map<String, Object>> handleWorkBookToMapList(Workbook workbook) throws Exception {
        List<Map<String, Object>> listMap = new ArrayList<>();
        // 遍歷WorkBook全部Sheet
        for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
            // 獲取Sheet
            Sheet sheet = workbook.getSheetAt(i);
            // 將每一個Sheet頁獲取到的beanMap均放入listMap中
            listMap.addAll(ReadExcelUtils.handleSheetToMapList(sheet));
        }

        return listMap;
    }

    /**
     * 指定Excel文件裏的記錄封裝成beanMap返回
     *
     * @param file Excel文件
     * @return 無結果返回空List
     * @throws Exception
     */
    public static List<Map<String, Object>> handleWorkBookToMapList(File file) throws Exception {
        Workbook workbook = WorkbookFactory.create(file);
        List<Map<String, Object>> listMap = ReadExcelUtils.handleWorkBookToMapList(workbook);
        if (workbook != null) {
            workbook.close();
        }
        return listMap;
    }

    /**
     * 將指定WorkBook裏的記錄封裝成指定類型放入List中返回
     *
     * @param clazz    指定封裝類型
     * @param workbook
     * @return 無結果返回空List
     * @throws Exception
     */
    public static <T> List<T> handleWorkBookToBeans(Class<T> clazz, Workbook workbook) throws Exception {
        List<Map<String, Object>> listMap = ReadExcelUtils.handleWorkBookToMapList(workbook);
        List<T> beans = new ArrayList<>();
        for (Map<String, Object> map : listMap) {
            T bean = CommonUtils.toBean(map, clazz);
            if (bean != null) {
                beans.add(bean);
            }
        }

        return beans;
    }

    /**
     * 將指定Excel文件裏的記錄封裝成指定類型放入List中返回
     *
     * @param clazz 指定封裝類型
     * @param file  指定Excel文件
     * @return 無結果返回空List
     * @throws Exception
     */
    public static <T> List<T> handleWorkBookToBeans(Class<T> clazz, File file) throws Exception {
        Workbook workbook = WorkbookFactory.create(file);
        List<T> beans = ReadExcelUtils.handleWorkBookToBeans(clazz, workbook);
        if (workbook != null) {
            workbook.close();
        }
        return beans;
    }
}

3.向Excel文件中寫入數據,數據量不大的狀況

此種操做Excel文件的方式與上面一種相同,會在內存中吧數據所有寫入Excel的WorkBook對象中,再把WorkBook寫入硬盤文件中。因此適用於小數據量的狀況。代碼以下:

package at.flying.tools;

import org.apache.commons.beanutils.PropertyUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 本類用於將JavaBean寫入Excel文檔中,採用POI(3.14及以上版本)技術,使用時需導入相關Jar包。
 * Created by Flying on 2016/5/28.
 */
public class WriteExcelUtils {
    public final static int XLSX = 1;
    public final static int XLS = 2;
    //默認日期格式
    private static SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

    private WriteExcelUtils() {}

    /**
     * 給一個Cell賦值,若爲空則視爲"",若不爲基本類型及其包裝類(日期類型除外),則其值經過toString()獲取
     *
     * @param cell       一個單元格
     * @param value      值
     * @param dateFormat 日期格式
     * @return 返回傳入的Cell
     */
    public static Cell setCellValue(Cell cell, Object value, String dateFormat) {
        if (dateFormat != null && !dateFormat.isEmpty()) {
            format.applyPattern(dateFormat);
        }
        if (value == null) {
            cell.setCellValue("");
        } else if (value instanceof String) {
            cell.setCellValue((String) value);
        } else if (value instanceof Integer) {
            cell.setCellValue((Integer) value);
        } else if (value instanceof Date) {
            cell.setCellValue(format.format(value));
        } else if (value instanceof Calendar) {
            cell.setCellValue(format.format(value));
        } else if (value instanceof Boolean) {
            cell.setCellValue((Boolean) value);
        } else if (value instanceof Float) {
            cell.setCellValue((Float) value);
        } else if (value instanceof Double) {
            cell.setCellValue((Double) value);
        } else {
            cell.setCellValue(value.toString());
        }
        return cell;
    }


    /**
     * 將一個Bean寫入某一行中,bean的屬性由properties決定
     *
     * @param row        指定行
     * @param bean       指定Bean
     * @param properties 指定寫入的屬性
     * @param dateFormat 日期格式
     * @param cellStyle  每個單元格的樣式
     * @return 返回傳入的Row
     */
    public static <T> Row writePerRow(Row row, T bean, List<String> properties, String dateFormat,
                                      CellStyle cellStyle) {
        Map<String, Object> mapBean = CommonUtils.toMap(bean);
        if (mapBean == null) {
            return row;
        }
        for (int i = 0; i < properties.size(); i++) {
            if (mapBean.containsKey(properties.get(i))) {
                Cell cell = row.createCell(i);
                cell.setCellStyle(cellStyle);
                WriteExcelUtils.setCellValue(cell, mapBean.get(properties.get(i)), dateFormat);
            }

        }
        return row;
    }

    /**
     * 向某一Sheet中寫入多個Bean
     *
     * @param sheet      指定Sheet
     * @param _titleRow  指定寫入的標題在第幾行,0-based
     * @param begin      指定寫入的Bean從第幾個開始,包含該下標,0-based
     * @param end        指定寫入的Bean從第幾個結束,不包含該下標,0-based
     * @param beans      指定寫入的Beans
     * @param properties 指定寫入的bean的屬性
     * @param titles     指定寫入的標題
     * @param dateFormat 日期格式
     * @return 返回傳入的Sheet
     */
    public static <T> Sheet writePerSheet(Sheet sheet, int _titleRow, int begin, int end, List<T> beans,
                                          List<String> properties, List<String> titles, String dateFormat) {
        Row titleRow = sheet.createRow(_titleRow);
        CellStyle cellStyle = sheet.getWorkbook().createCellStyle();
        Font font = sheet.getWorkbook().createFont();
        font.setBold(true);
        font.setFontHeightInPoints((short) 16);
        cellStyle.setFont(font);
        cellStyle.setAlignment(CellStyle.ALIGN_CENTER);
        cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
        sheet.setDefaultColumnWidth(16);
        for (int i = 0; i < titles.size(); i++) {
            Cell cell = titleRow.createCell(i);
            cell.setCellValue(titles.get(i));
            cell.setCellStyle(cellStyle);
        }
        //單元格樣式
        CellStyle _cellStyle = sheet.getWorkbook().createCellStyle();
        _cellStyle.setAlignment(CellStyle.ALIGN_CENTER);
        _cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
        int counter = _titleRow + 1;
        for (int i = begin; i < (end < beans.size() ? end : beans.size()); i++) {
            Row row = sheet.createRow(counter++);
            WriteExcelUtils.writePerRow(row, beans.get(i), properties, dateFormat, _cellStyle);
        }
        return sheet;
    }

    /**
     * 向某一WorkBook中寫入多個Bean
     *
     * @param workbook   指定工做簿
     * @param _titleRow  指定寫入的標題在第幾行,0-based
     * @param count      指定每一個Sheet寫入幾個bean
     * @param beans      指定寫入的Beans
     * @param properties 指定寫入的bean的屬性
     * @param titles     指定寫入的標題
     * @param dateFormat 日期格式
     * @return 返回傳入的WorkBook
     */
    public static <T> Workbook writeWorkBook(Workbook workbook, int _titleRow, int count, List<T> beans,
                                             List<String> properties, List<String> titles, String dateFormat) {
        int sheetNum = beans.size() % count == 0 ? beans.size() / count : (beans.size() / count + 1);
        for (int i = 0; i < sheetNum; i++) {
            WriteExcelUtils
                    .writePerSheet(workbook.createSheet(), _titleRow, i * count, i * count + count, beans, properties,
                            titles, dateFormat);
        }
        return workbook;
    }

    /**
     * 向工做簿中寫入beans,標題默認從第0行開始,0-based
     *
     * @param workbook   指定工做簿
     * @param count      指定每個Sheet寫入幾個Bean
     * @param beans      指定寫入的Beans
     * @param properties 指定寫入的bean的屬性
     * @param titles     指定寫入的標題
     * @param dateFormat 日期格式
     * @return 返回傳入的WorkBook
     */
    public static <T> Workbook writeWorkBook(Workbook workbook, int count, List<T> beans, List<String> properties,
                                             List<String> titles, String dateFormat) {
        return WriteExcelUtils.writeWorkBook(workbook, 0, count, beans, properties, titles, dateFormat);
    }

    /**
     * 向工做簿中寫入beans,全部bean寫在一個Sheet中,標題寫在第0行,0-based
     *
     * @param workbook   指定工做簿
     * @param beans      指定寫入的Beans
     * @param properties 指定寫入的bean的屬性
     * @param titles     指定寫入的標題
     * @param dateFormat 日期格式
     * @return 返回傳入的WorkBook
     */
    public static <T> Workbook writeWorkBook(Workbook workbook, List<T> beans, List<String> properties,
                                             List<String> titles, String dateFormat) {
        return WriteExcelUtils.writeWorkBook(workbook, beans.size(), beans, properties, titles, dateFormat);
    }

    /**
     * 向工做簿中寫入beans,全部bean寫在一個Sheet中,標題寫在第0行,0-based。並輸出到指定file中
     *
     * @param file       指定Excel輸出文件
     * @param excelType  輸出Excel文件類型{@link #XLSX}或者{@link #XLS},此類型必須與file文件名後綴匹配
     * @param beans      指定寫入的Beans
     * @param properties 指定寫入的bean的屬性
     * @param titles     指定寫入的標題
     * @param dateFormat 日期格式
     * @return 返回傳入的WorkBook
     * @throws Exception
     */
    public static <T> void writeWorkBook(File file, int excelType, List<T> beans, List<String> properties,
                                         List<String> titles, String dateFormat) throws Exception {
        Workbook workbook = null;
        if (XLSX == excelType) {
            workbook = new XSSFWorkbook();
        } else if (XLS == excelType) {
            workbook = new HSSFWorkbook();
        } else {
            throw new Exception("excelType參數錯誤");
        }
        WriteExcelUtils.writeWorkBook(workbook, beans.size(), beans, properties, titles, dateFormat);
        OutputStream os = null;
        try {
            os = new FileOutputStream(file);
            WriteExcelUtils.writeWorkBookToExcel(workbook, os);
        } catch (Exception e) {
            throw e;
        } finally {
            CommonUtils.closeIOStream(null, os);
        }
    }

    /**
     * 向工做簿中寫入beans,全部bean寫在一個Sheet中,默認以bean中的全部屬性做爲標題且寫入第0行,0-based。並輸出到指定file中
     *
     * @param file       指定Excel輸出文件
     * @param excelType  輸出Excel文件類型{@link #XLSX}或者{@link #XLS},此類型必須與file文件名後綴匹配
     * @param beans      指定寫入的Beans
     * @param dateFormat 日期格式
     * @return 返回傳入的WorkBook
     * @throws Exception
     */
    public static <T> void writeWorkBook(File file, int excelType, List<T> beans, String dateFormat) throws Exception {
        if (beans == null || beans.isEmpty()) {
            throw new Exception("beans參數不能爲空");
        }
        Map<String, Object> map = CommonUtils.toMap(beans.get(0));
        if (map == null) {
            throw new Exception("獲取bean屬性失敗");
        }
        List<String> properties = new ArrayList<>();
        properties.addAll(map.keySet());
        WriteExcelUtils.writeWorkBook(file, excelType, beans, properties, properties, dateFormat);
    }

    /**
     * 向工做簿中寫入beans,全部bean寫在一個Sheet中,默認以bean中的全部屬性做爲標題且寫入第0行,0-based。
     * 日期格式採用默認類型。並輸出到指定file中
     *
     * @param file      指定Excel輸出文件
     * @param excelType 輸出Excel文件類型{@link #XLSX}或者{@link #XLS},此類型必須與file文件名後綴匹配
     * @param beans     指定寫入的Beans
     * @return 返回傳入的WorkBook
     * @throws Exception
     */
    public static <T> void writeWorkBook(File file, int excelType, List<T> beans) throws Exception {
        WriteExcelUtils.writeWorkBook(file, excelType, beans, null);
    }

    /**
     * 將Beans寫入WorkBook中,默認以bean中的全部屬性做爲標題且寫入第0行,0-based
     *
     * @param workbook   指定工做簿
     * @param beans      指定寫入的Beans
     * @param dateFormat 日期格式
     * @return 返回傳入的WorkBook
     */
    public static <T> Workbook writeWorkBook(Workbook workbook, List<T> beans, String dateFormat) {
        if (beans == null || beans.isEmpty()) {
            return workbook;
        }
        Map<String, Object> map = CommonUtils.toMap(beans.get(0));
        if (map == null) {
            return workbook;
        }
        List<String> properties = new ArrayList<>();
        properties.addAll(map.keySet());
        return WriteExcelUtils.writeWorkBook(workbook, beans, properties, properties, dateFormat);
    }

    /**
     * 將Beans寫入WorkBook中,默認以bean中的全部屬性做爲標題且寫入第0行,0-based
     *
     * @param workbook 指定工做簿
     * @param beans    指定寫入的Beans
     * @return 返回傳入的WorkBook
     */
    public static <T> Workbook writeWorkBook(Workbook workbook, List<T> beans) {
        return WriteExcelUtils.writeWorkBook(workbook, beans, null);
    }

    /**
     * 將指定WorkBook寫入指定文件中
     *
     * @param workbook 指定工做簿
     * @param os       指定輸出流,須要手動關閉
     * @throws IOException 出現I/O異常拋出
     */
    public static void writeWorkBookToExcel(Workbook workbook, OutputStream os) throws IOException {
        workbook.write(os);
    }

}

4.讀取大數據量的Excel文檔(XLSX格式)

此種方式是經過Stream流讀方式讀取Excel文檔,故能夠讀取幾百萬行數據的Excel文檔,每讀指定的行數均可以調用回調函數來作相應處理,爲了更好的進行數據格式的轉換,修改了某些依賴類的源碼。

參考代碼:

https://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/xssf/eventusermodel/XLSX2CSV.java

代碼以下:

被修改的org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler類

(重寫爲XSSFSheetXMLHandlerPlus文件,在使用時須要引入此修改類,代碼篇幅太長,能夠查看Github上的代碼):

爲節省篇幅,請轉看我託管在github上的代碼,裏面有詳細註釋。

類名爲:com.github.flyinghe.tools.XLSXReader

回調函數接口(4,5回調函數均使用此接口):

ExcelHandler.java:

package at.flying.depdcy;

import java.io.File;
import java.util.List;
import java.util.Map;

/**
 * Created by FlyingHe on 2017/8/9.
 * 此接口爲{@link at.flying.tools.XLSReader}和{@link at.flying.tools.XLSXReader}提供回調函數
 */
public interface ExcelHandler {
    /**
     * 此函數做爲{@link at.flying.tools.XLSReader}和{@link at.flying.tools.XLSXReader}讀取Excel文件工具類的回調函數
     *
     * @param currentRowInSheet   調用此函數時的當前sheet的當前行座標,0-based
     * @param currentSheetInExcel 調用此函數時的當前sheet座標,0-based
     * @param realRowInSheet      調用此函數時的當前sheet已經解析的數據的非空行數(即不包括第0行和第一行等標題行以及全部空行)
     * @param realRowInExcel      調用此函數時整個Excel文檔已經解析的數據的非空行數(即不包括全部sheet的第0行和第一行等標題行以及全部空行)
     * @param allSheetInExcel     調用此函數時整個Excel文檔已經解析的sheet數(包含正在解析的Sheet)
     * @param titles              標題,即第0行數據,0-based
     * @param columns             列名,即第1行數據,0-based
     * @param datas               datas被清空前調用此函數時的數據行數據,
     *                            在limit>0的狀況下datas.size()通常等於limit
     *                            (在datas未達到指定限制而文件數據已經徹底讀取完畢的狀況下datas.size()會小於limit),
     *                            注意:若沒有設置limit(即limit<=0的狀況下),不會調用回調函數,
     *                            此時你應該使用相似於{@link at.flying.tools.XLSXReader#readExcelToMapList(File)}等等
     *                            不須要提供回調函數的靜態函數來作處理
     * @see at.flying.tools.XLSReader#readExcelToMapList(File)
     * @see at.flying.tools.XLSReader#readExcelToMapList(File, Integer)
     * @see at.flying.tools.XLSReader#readExcel(File)
     * @see at.flying.tools.XLSReader#readExcel(File, Integer)
     */
    public void callback(int currentRowInSheet, int currentSheetInExcel, int realRowInSheet, int realRowInExcel,
                         int allSheetInExcel, List<String> titles, List<String> columns,
                         List<Map<String, Object>> datas) throws Exception;
}

5.讀取大數據量的Excel文檔(XLS格式)

此種方式同上種方式,也是經過流讀方式。

參考代碼:

https://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/hssf/eventusermodel/examples/XLS2CSVmra.java

代碼以下:

被修改的org.apache.poi.hssf.eventusermodel.FormatTrackingHSSFListener類

(重寫爲FormatTrackingHSSFListenerPlus文件,在使用時須要引入此修改類,代碼篇幅太長,能夠查看Github上的代碼)。

爲節省篇幅,請轉看我託管在github上的代碼,裏面有詳細註釋。

類名爲:com.github.flyinghe.tools.XLSReader

 

6.向Excel文檔中寫入大量數據

向Excel文檔中寫入大量數據,查閱官方文檔貌似僅支持XLSX後綴的。

參考官方文檔:https://poi.apache.org/spreadsheet/how-to.html#sxssf

爲節省篇幅,請轉看我託管在github上的代碼,裏面有詳細註釋。

類名爲:com.github.flyinghe.tools.XLSXWriter

注意:

此Jar包也已經上傳到Maven中央倉庫,你可使用Maven依賴直接引用:
 

<dependency>
    <groupId>com.github.flyinghe</groupId>
    <artifactId>common-utils</artifactId>
    <version>2.3.3-RELEASE</version>
</dependency>

讀取Excel文件時對文件格式有必定要求,特別是讀取以後將數據封裝到Map或者JavaBean中時,Excel中每個Sheet的格式以下:

相關文章
相關標籤/搜索