【2016-08-10】{[POI],[java处理excel]}

本文介绍使用Apache POI库处理Excel文件的方法,通过具体实例演示如何读取Excel数据,并将其存储到自定义对象中,便于进一步的数据校验和处理。

java处理excel有很多第三方的包,我今天使用org.apcahe.poi 做实验。

主要包含的对象:(本次试验主要用到红色表示几个类)

  HSSFWorkbook        excel的文档对象

  HSSFSheet               excel的表单

  HSSFRow                 excel的行

  HSSFCell                  excel的单元格

  HSSFFont                 excel的字体

  HSSFName               execl名称

  HSSFDataFormat      excel日期格式


实验目的:从一个给定的已经存在的excel文件中读取数据并解析,然后校验,最终存入一个excel对象中。

完成情况:已经完成数据读取解析,存入excel对象。现在还未做校验。

实验表格如下:

手机号身份证银行卡邮箱QQ设备IDIP地址
       


源码如下:

ExcelTest_4.java
package LinkAnalysis;

import java.io.IOException;

/**
 * Created by carrot on 16/8/10.
 */
public class ExcelTest_4 {

    private static final String filePath = "/Users/carrot/Documents/ExcelTest_3.xls";

    public static void main(String[] args) throws IOException {
        ExcelDataDO excelDataDO = AnalysisExcel.AnalysisExcel(filePath);
    }
}


ExcelDataDO.java
package LinkAnalysis;

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

/**
 * Created by carrot on 16/8/10.
 */
public class ExcelDataDO implements Serializable {

    // file name for excel
    private String                    fileName;

    // tab name in the file
    private String                    tabName;

    // tab index in the file
    private int                       tabIndex;

    // amount of row
    private int                       amountRow;

    // effectively number of row
    private int                       effNumRow;

    // amount of cel
    private int                       amountCel;

    // effectively number of cel
    private int                       effNumCel;

    // form data for tab
    private Map<String, List<String>> excelData;

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public String getTabName() {
        return tabName;
    }

    public void setTabName(String tabName) {
        this.tabName = tabName;
    }

    public int getTabIndex() {
        return tabIndex;
    }

    public void setTabIndex(int tabIndex) {
        this.tabIndex = tabIndex;
    }

    public int getAmountRow() {
        return amountRow;
    }

    public void setAmountRow(int amountRow) {
        this.amountRow = amountRow;
    }

    public int getEffNumRow() {
        return effNumRow;
    }

    public void setEffNumRow(int effNumRow) {
        this.effNumRow = effNumRow;
    }

    public int getAmountCel() {
        return amountCel;
    }

    public void setAmountCel(int amountCel) {
        this.amountCel = amountCel;
    }

    public int getEffNumCel() {
        return effNumCel;
    }

    public void setEffNumCel(int effNumCel) {
        this.effNumCel = effNumCel;
    }

    public Map<String, List<String>> getExcelData() {
        return excelData;
    }

    public void setExcelData(Map<String, List<String>> excelData) {
        this.excelData = excelData;
    }
}


AnalysisExcel.java
package LinkAnalysis;

import com.google.common.collect.Maps;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * Created by carrot on 16/8/10.
 */
public class AnalysisExcel {

    private static HSSFWorkbook              hssfWorkbook;                   // excel 文档对象
    private static HSSFSheet                 hssfSheet;                      // excel 表单
    private static HSSFRow                   hssfRow;                        // excel 行
    private static HSSFCell                  hssfCell;                       // excel 格子单元

    /**
     * 存储excel解析出的数据 key: String类型值,存储Field字段 value: List<String>类型,存储某一列的相同Field的值
     */
    private static Map<String, List<String>> map         = Maps.newHashMap();
    private static List<String>              list;

    // Excel数据对象
    private static ExcelDataDO               excelDataDO = new ExcelDataDO();

    public static ExcelDataDO AnalysisExcel(String filename) throws IOException {

        FileInputStream fileInputStream = null;
        try {
            fileInputStream = new FileInputStream(filename); // 打开文件流
            if (null == fileInputStream) {
                return null;
            }

        } catch (IOException e) {
            throw new IOException("文件不存在/打开失败");
        }

        hssfWorkbook = new HSSFWorkbook(fileInputStream); // 用文件流创建excel对象

        /**
         * 获取excel对象中表单tab的数量,分别对每一个tab进行单独处理
         */
        for (int i = 0; i < hssfWorkbook.getNumberOfSheets(); ++i) {
            hssfSheet = hssfWorkbook.getSheetAt(i); // 获取一个表单
            if (null == hssfSheet) { // 当表单不存在,直接结束处理
                return null;
            }
            AnalysisTab(hssfSheet); // 处理一个表单
        }

        fileInputStream.close(); // 关闭文件流
        excelDataDO.setExcelData(map); // 为excel数据对象设置数据
        return excelDataDO;
    }

    private static void AnalysisTab(HSSFSheet hssfSheet) {

        int amountRow = hssfSheet.getLastRowNum() - hssfSheet.getFirstRowNum(); // 获取行数
        int amountCel = 0;

        for (int i = 1; i <= amountRow; ++i) { // 处理行
            hssfRow = hssfSheet.getRow(i); // 获取行对象
            if (null == hssfRow) { // 行为空,跳过,继续解析下一行
                continue;
            }

            amountCel = hssfRow.getLastCellNum(); // 获取本行的列数
            for (int j = 0; j < amountCel; ++j) { // 处理列
                hssfCell = hssfRow.getCell(j); // 获取单元格对象
                if (null == hssfCell) { // 单元格为空,跳过,继续解析下一个单元格
                    continue;
                }

                TypeAnalysis(hssfCell, j); // 分析单元格数据类型
            }
        }
    }

    private static void TypeAnalysis(HSSFCell hssfCell, int celNum) {

        int celType = hssfCell.getCellType(); // 获取单元格数据类型
        String key = hssfSheet.getRow(0).getCell(celNum).getStringCellValue(); // 获取第celNUm列的Field
        list = LinkAnalysis.Lists.getList(map, key); // 获取用于存储同一Field(列)的相同类型数据的list

        switch (celType) { // 匹配数据类型
            case HSSFCell.CELL_TYPE_NUMERIC:
                list.add(String.valueOf(hssfCell.getNumericCellValue())); // 将数据add进list
                map.put(key, list); // 将数据存入excel数据对象
                break;
            case HSSFCell.CELL_TYPE_STRING:
                list.add(hssfCell.getStringCellValue());
                map.put(key, list);
                break;
            case HSSFCell.CELL_TYPE_FORMULA:
                list.add(hssfCell.getCellFormula());
                map.put(key, list);
                break;
            case HSSFCell.CELL_TYPE_BLANK:
                // 前面已处理,此处不可能为空
                break;
            case HSSFCell.CELL_TYPE_BOOLEAN:
                list.add(String.valueOf(hssfCell.getBooleanCellValue()));
                map.put(key, list);
                break;
            case HSSFCell.CELL_TYPE_ERROR:
                list.add(String.valueOf(hssfCell.getErrorCellValue()));
                map.put(key, list);
                break;
            default:
                //
                break;
        }
    }
}


Lists.java
package LinkAnalysis;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * Created by carrot on 16/8/10.
 */
public class Lists {

    public static List<String> getList(Map map, String key) {

        if (!map.containsKey(key)) {
            return new ArrayList();
        }
        return (List<String>) map.get(key);
    }
}


代码能跑通。数据的有效性校验还没有做,后续补上。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值