JAVA使用POI導入與導出Excel

JAVA使用POI導入與導出Excel

文中代碼參考自:https://www.cnblogs.com/Dreamer-1/p/10469430.html
這裏在學習的基礎上進一步簡化,留作自用,侵刪。

1.導入Excel文件裏的數據

1.1所需jar包

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

這裏是在maven項目的配置文件pom.xml導入兩個需要的jar包,因爲這兩個jar包很那找到。

1.2需要建立的類

  1. ExcelReader.java是實現讀取Excel數據功能的類;

  2. ExcelDataVO.java封裝了讀取或寫入時每一“行”的數據;

  3. MainTest.java是示例程序的入口類,其中演示了讀取和寫入Excel數據的整個過程;

  4. 所需文件:test.xml 內容是(頂格寫)

    姓名	年齡	居住地	職責
    張三	20	北京	技術
    

詳細代碼:

1.2.1ExcelDataVO.java
package maintest;

/**
 * Author: Dreamer-1
 * Date: 2019-03-01
 * Time: 11:33
 * Description: 讀取Excel時,封裝讀取的每一行的數據
 */
public class ExcelDataVO {

    /**
     * 姓名
     */
    private String name;

    /**
     * 年齡
     */
    private Integer age;

    /**
     * 居住地
     */
    private String location;

    /**
     * 職業
     */
    private String job;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getLocation() {
        return location;
    }

    public void setLocation(String location) {
        this.location = location;
    }

    public String getJob() {
        return job;
    }

    public void setJob(String job) {
        this.job = job;
    }
}

1.2.2ExcelReader.java
package maintest;

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.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.util.*;
import java.util.logging.Logger;

/**
 * Author: Dreamer-1
 * Date: 2019-03-01
 * Time: 10:21
 * Description: 讀取Excel內容
 */
public class ExcelReader {

    private static Logger logger = Logger.getLogger(ExcelReader.class.getName()); // 日誌打印類

    private static final String XLS = "xls";
    private static final String XLSX = "xlsx";

    /**
     * 根據文件後綴名類型獲取對應的工作簿對象
     * @param inputStream 讀取文件的輸入流
     * @param fileType 文件後綴名類型(xls或xlsx)
     * @return 包含文件數據的工作簿對象
     * @throws IOException
     */
    public static Workbook getWorkbook(InputStream inputStream, String fileType) throws IOException {
        Workbook workbook = null;
        if (fileType.equalsIgnoreCase(XLS)) {
            workbook = new HSSFWorkbook(inputStream);
        } else if (fileType.equalsIgnoreCase(XLSX)) {
            workbook = new XSSFWorkbook(inputStream);
        }
        return workbook;
    }

    /**
     * 讀取Excel文件內容
     * @param fileName 要讀取的Excel文件所在路徑
     * @return 讀取結果列表,讀取失敗時返回null
     */
    public static List<ExcelDataVO> readExcel(String fileName) {

        Workbook workbook = null;
        FileInputStream inputStream = null;

        try {
            // 獲取Excel後綴名
            String fileType = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length());
            
            // 獲取Excel文件
            File excelFile = new File(fileName);
            if (!excelFile.exists()) {
                logger.warning("指定的Excel文件不存在!");
                return null;
            }

            // 獲取Excel工作簿
            inputStream = new FileInputStream(excelFile);
            workbook = getWorkbook(inputStream, fileType);

            // 讀取excel中的數據
            List<ExcelDataVO> resultDataList = parseExcel(workbook);
            System.out.println("讀取成功");
            return resultDataList;
        } catch (Exception e) {
            logger.warning("解析Excel失敗01,文件名:" + fileName + " 錯誤信息:" + e.getMessage());
            return null;
        } finally {
            try {
                if (null != workbook) {
                    workbook.close();
                }
                if (null != inputStream) {
                    inputStream.close();
                }
            } catch (Exception e) {
                logger.warning("關閉數據流出錯!錯誤信息:" + e.getMessage());
                return null;
            }
        }
    }
    /**
     * 解析Excel數據
     * @param workbook Excel工作簿對象
     * @return 解析結果
     */
    private static List<ExcelDataVO> parseExcel(Workbook workbook) {
       List<ExcelDataVO> resultDataList = new ArrayList<ExcelDataVO>();
        // 解析sheet
        for (int sheetNum = 0; sheetNum < workbook.getNumberOfSheets(); sheetNum++) {
            Sheet sheet = workbook.getSheetAt(sheetNum);

            // 校驗sheet是否合法
            if (sheet == null) {
                continue;
            }

            // 獲取第一行數據
            int firstRowNum = sheet.getFirstRowNum();
            Row firstRow = sheet.getRow(firstRowNum);
            if (null == firstRow) {
                logger.warning("解析Excel失敗,在第一行沒有讀取到任何數據!");
            }

            // 解析每一行的數據,構造數據對象
            int rowStart = firstRowNum + 1;
            int rowEnd = sheet.getPhysicalNumberOfRows();
            for (int rowNum = rowStart; rowNum < rowEnd; rowNum++) {
                Row row = sheet.getRow(rowNum);

                if (null == row) {
                    continue;
                }

                ExcelDataVO resultData = convertRowToData(row);
                if (null == resultData) {
                    logger.warning("第 " + row.getRowNum() + "行數據不合法,已忽略!");
                    continue;
                }
                resultDataList.add(resultData);
            }
        }

        return resultDataList;
    }

    /**
     * 將單元格內容轉換爲字符串
     * @param cell
     * @return
     */
    private static String convertCellValueToString(Cell cell) {
        if(cell==null){
            return null;
        }
        String returnValue = null;
        switch (cell.getCellType()) {
            case NUMERIC:   //數字
                Double doubleValue = cell.getNumericCellValue();

                // 格式化科學計數法,取一位整數
                DecimalFormat df = new DecimalFormat("0");
                returnValue = df.format(doubleValue);
                break;
            case STRING:    //字符串
                returnValue = cell.getStringCellValue();
                break;
            case BOOLEAN:   //布爾
                Boolean booleanValue = cell.getBooleanCellValue();
                returnValue = booleanValue.toString();
                break;
            case BLANK:     // 空值
                break;
            case FORMULA:   // 公式
                returnValue = cell.getCellFormula();
                break;
            case ERROR:     // 故障
                break;
            default:
                break;
        }
        return returnValue;
    }

    /**
     * 提取每一行中需要的數據,構造成爲一個結果數據對象
     *
     * 當該行中有單元格的數據爲空或不合法時,忽略該行的數據
     *
     * @param row 行數據
     * @return 解析後的行數據對象,行數據錯誤時返回null
     */
    private static ExcelDataVO convertRowToData(Row row) {
        ExcelDataVO resultData = new ExcelDataVO();

        Cell cell;
        int cellNum = 0;
        // 獲取姓名
        cell = row.getCell(cellNum++);
        String name = convertCellValueToString(cell);
        resultData.setName(name);
        // 獲取年齡
        cell = row.getCell(cellNum++);
        String ageStr = convertCellValueToString(cell);
        if (null == ageStr || "".equals(ageStr)) {
            // 年齡爲空
            resultData.setAge(null);
        } else {
            resultData.setAge(Integer.parseInt(ageStr));
        }
        // 獲取居住地
        cell = row.getCell(cellNum++);
        String location = convertCellValueToString(cell);
        resultData.setLocation(location);
        // 獲取職業
        cell = row.getCell(cellNum++);
        String job = convertCellValueToString(cell);
        resultData.setJob(job);

        return resultData;
    }

}

1.2.3MainTest.java
package maintest;

import org.apache.poi.ss.usermodel.Workbook;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

/**
 * Author: Dreamer-1
 * Date: 2019-03-01
 * Time: 10:13
 * Description: 示例程序入口類
 */
public class MainTest {

    private static Logger logger = Logger.getLogger(MainTest.class.getName());

    public static void main(String[] args) {

        /************** 讀取Excel流程 ******************/
        // 設定Excel文件所在路徑
        String excelFileName = "C:\\Users\\ldl\\Desktop\\test.xls";
        // 讀取Excel文件內容
        List<ExcelDataVO> readResult = ExcelReader.readExcel(excelFileName);

        // todo 進行業務操作
        for (ExcelDataVO excelDataVO : readResult) {
			System.out.println(excelDataVO.getName());
		}
        
}
}

2.導出數據到Excel文件

2.1所需jar包

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

這裏是在maven項目的配置文件pom.xml導入兩個需要的jar包,因爲這兩個jar包很那找到。

2.2需要建立的類

  1. ExcelWriter.java是創建新的Excel並向其中寫入數據的類;
  2. ExcelDataVO.java封裝了讀取或寫入時每一“行”的數據;
  3. MainTest.java是示例程序的入口類,其中演示了讀取和寫入Excel數據的整個過程;
2.2.1ExcelWriter.java
package maintest;


import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * Author: Dreamer-1
 * Date: 2019-03-01
 * Time: 11:09
 * Description: 生成Excel並寫入數據
 */
public class ExcelWriter {

    private static List<String> CELL_HEADS; //列頭

    static{
        // 類裝載時就載入指定好的列頭信息,如有需要,可以考慮做成動態生成的列頭
        CELL_HEADS = new ArrayList<String>();
        CELL_HEADS.add("姓名");
        CELL_HEADS.add("年齡");
        CELL_HEADS.add("居住城市");
        CELL_HEADS.add("職業");
    }

    /**
     * 生成Excel並寫入數據信息
     * @param dataList 數據列表
     * @return 寫入數據後的工作簿對象
     */
    public static Workbook exportData(List<ExcelDataVO> dataList){
        // 生成xlsx的Excel
        Workbook workbook = new SXSSFWorkbook();

        // 如需生成xls的Excel,請使用下面的工作簿對象,注意後續輸出時文件後綴名也需更改爲xls
        //Workbook workbook = new HSSFWorkbook();

        // 生成Sheet表,寫入第一行的列頭
        Sheet sheet = buildDataSheet(workbook);
        //構建每行的數據內容
        int rowNum = 1;
        for (Iterator<ExcelDataVO> it = dataList.iterator(); it.hasNext(); ) {
            ExcelDataVO data = it.next();
            if (data == null) {
                continue;
            }
            //輸出行數據
            Row row = sheet.createRow(rowNum++);
            convertDataToRow(data, row);
        }
        return workbook;
    }

    /**
     * 生成sheet表,並寫入第一行數據(列頭)
     * @param workbook 工作簿對象
     * @return 已經寫入列頭的Sheet
     */
    private static Sheet buildDataSheet(Workbook workbook) {
        Sheet sheet = workbook.createSheet();
        // 設置列頭寬度
        for (int i=0; i<CELL_HEADS.size(); i++) {
            sheet.setColumnWidth(i, 4000);
        }
        // 設置默認行高
        sheet.setDefaultRowHeight((short) 400);
        // 構建頭單元格樣式
        CellStyle cellStyle = buildHeadCellStyle(sheet.getWorkbook());
        // 寫入第一行各列的數據
        Row head = sheet.createRow(0);
        for (int i = 0; i < CELL_HEADS.size(); i++) {
            Cell cell = head.createCell(i);
            cell.setCellValue(CELL_HEADS.get(i));
            cell.setCellStyle(cellStyle);
        }
        return sheet;
    }

    /**
     * 設置第一行列頭的樣式
     * @param workbook 工作簿對象
     * @return 單元格樣式對象
     */
    private static CellStyle buildHeadCellStyle(Workbook workbook) {
        CellStyle style = workbook.createCellStyle();
        //對齊方式設置
        style.setAlignment(HorizontalAlignment.CENTER);
        //邊框顏色和寬度設置
        style.setBorderBottom(BorderStyle.THIN);
        style.setBottomBorderColor(IndexedColors.BLACK.getIndex()); // 下邊框
        style.setBorderLeft(BorderStyle.THIN);
        style.setLeftBorderColor(IndexedColors.BLACK.getIndex()); // 左邊框
        style.setBorderRight(BorderStyle.THIN);
        style.setRightBorderColor(IndexedColors.BLACK.getIndex()); // 右邊框
        style.setBorderTop(BorderStyle.THIN);
        style.setTopBorderColor(IndexedColors.BLACK.getIndex()); // 上邊框
        //設置背景顏色
        style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        //粗體字設置
        Font font = workbook.createFont();
        font.setBold(true);
        style.setFont(font);
        return style;
    }

    /**
     * 將數據轉換成行
     * @param data 源數據
     * @param row 行對象
     * @return
     */
    private static void convertDataToRow(ExcelDataVO data, Row row){
        int cellNum = 0;
        Cell cell;
        // 姓名
        cell = row.createCell(cellNum++);
        cell.setCellValue(null == data.getName() ? "" : data.getName());
        // 年齡
        cell = row.createCell(cellNum++);
        if (null != data.getAge()) {
            cell.setCellValue(data.getAge());
        } else {
            cell.setCellValue("");
        }
        // 所在城市
        cell = row.createCell(cellNum++);
        cell.setCellValue(null == data.getLocation() ? "" : data.getLocation());
        // 職業
        cell = row.createCell(cellNum++);
        cell.setCellValue(null == data.getJob() ? "" : data.getJob());
    }
}

2.2.2ExcelDataVO.java
package maintest;

/**
 * Author: Dreamer-1
 * Date: 2019-03-01
 * Time: 11:33
 * Description: 讀取Excel時,封裝讀取的每一行的數據
 */
public class ExcelDataVO {

    /**
     * 姓名
     */
    private String name;

    /**
     * 年齡
     */
    private Integer age;

    /**
     * 居住地
     */
    private String location;

    /**
     * 職業
     */
    private String job;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getLocation() {
        return location;
    }

    public void setLocation(String location) {
        this.location = location;
    }

    public String getJob() {
        return job;
    }

    public void setJob(String job) {
        this.job = job;
    }
}

2.2.3MainTest.java
package maintest;

import org.apache.poi.ss.usermodel.Workbook;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

/**
 * Author: Dreamer-1
 * Date: 2019-03-01
 * Time: 10:13
 * Description: 示例程序入口類
 */
public class MainTest {

    private static Logger logger = Logger.getLogger(MainTest.class.getName());

    public static void main(String[] args) {

        /************** 寫入Excel流程 ******************/
        // 創建需要寫入的數據列表
        List<ExcelDataVO> dataVOList = new ArrayList<ExcelDataVO>(2);
        ExcelDataVO dataVO = new ExcelDataVO();
        dataVO.setName("小明");
        dataVO.setAge(18);
        dataVO.setLocation("廣州");
        dataVO.setJob("大學生");
        ExcelDataVO dataVO2 = new ExcelDataVO();
        dataVO2.setName("小花");
        dataVO2.setAge(19);
        dataVO2.setLocation("深圳");
        dataVO2.setJob("大學生");
        dataVOList.add(dataVO);
        dataVOList.add(dataVO2);

        // 寫入數據到工作簿對象內
        Workbook workbook = ExcelWriter.exportData(dataVOList);

        // 以文件的形式輸出工作簿對象
        FileOutputStream fileOut = null;
        try {
            String exportFilePath = "C:\\Users\\ldl\\Desktop\\test03.xls";
            File exportFile = new File(exportFilePath);
            if (!exportFile.exists()) {
                exportFile.createNewFile();
            }

            fileOut = new FileOutputStream(exportFilePath);
            workbook.write(fileOut);
            fileOut.flush();
        } catch (Exception e) {
            logger.warning("輸出Excel時發生錯誤,錯誤原因:" + e.getMessage());
        } finally {
            try {
                if (null != fileOut) {
                    fileOut.close();
                }
                if (null != workbook) {
                    workbook.close();
                }
            } catch (IOException e) {
                logger.warning("關閉輸出流時發生錯誤,錯誤原因:" + e.getMessage());
            }
        }

    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章