1. 程式人生 > >Java解析Excel例項解析

Java解析Excel例項解析

最近有些配置APN的工作,需要將Excel中的資訊,配置成Android apns-conf.xml中的樣式。
作為一個程式設計師,我怎麼可能一行行的用眼睛看,然後用手去配置了!
於是,我決定利用Apache POI的支援庫,用java程式解析Excel表,
然後按指定格式生成輸出檔案。

這篇部落格主要記錄一下Java解析Excel的基本方法,結尾附上demo。

首先附上Apache POI庫的下載地址Apache POI - Download Release Artifacts
選擇合適的庫後,會自動跳轉到映象地址。
我的demo是基於poi-3.16-beta2寫的,不過並沒有使用什麼高深介面,因此程式碼應該是通用的。

匯入依賴庫後,主要的工作其實就是明白依賴庫中定義的Excel物件了,這裡盜一張圖:

如圖所示:
每一個Excel檔案都將被解析成一個WorkBook物件;
Excel的每一頁都將被解析成一個Sheet物件;
然後,Excel中的每一行都是一個Row物件,
每一個單元格都是一個Cell物件。

對這些基本概念有了一些基本瞭解後,就可以開始上例項了。

如上圖所示,為Excel中內容的基本格式,即一些APN需要的資訊。
為了方便我解析,我稍微修改了一些格式,將標題欄中每一項的首字母大寫(與Java解析Excel無關)。

Java入口函式如下:

public class MainEntrance {
    public
static void main(String[] args) { //由於Java解析Excel不可避免的與檔案格式耦合 //因此,我只能寫一個特質化的工具,而不是寫個模板 ApnExcelParseTool excelParseTool = new ApnExcelParseTool(); //傳入原始檔地址 excelParseTool.setFilePath("/home/zhangjian/Desktop/all_apn_together.xlsx"); try { //解析Excel得到Workbook物件
Workbook workbook = excelParseTool.initWorkBook(); //每一行具體資料,都將變成一個ApnModel List<ApnModel> outData = new ArrayList<>(); if (workbook != null) { //將workbook物件,解析成ApnModel excelParseTool.parseWorkbook(workbook, outData); } if (outData.size() > 0) { //將所有的ApnModel寫入到輸出檔案中 new ApnWriteTool().write("/home/zhangjian/Desktop/apns-conf.xml", outData); } } catch (IOException e) { System.out.println(e.toString()); } } }

整個Java主函式的邏輯還是很簡單的。

現在我們看看核心類ApnExcelParseTool中的內容,首先看看獲取Workbook相關的程式碼:

class ApnExcelParseTool {
    private String mFilePath;

    //儲存原始檔內容
    void setFilePath(String filePath) {
        mFilePath = filePath;
    }

    private static final String SUFFIX_2003 = ".xls";
    private static final String SUFFIX_2007 = ".xlsx";

    Workbook initWorkBook() throws IOException {
        File file = new File(mFilePath);
        InputStream is = new FileInputStream(file);

        Workbook workbook = null;
        //根據字尾,得到不同的Workbook子類,即HSSFWorkbook或XSSFWorkbook
        if (mFilePath.endsWith(SUFFIX_2003)) {
            workbook = new HSSFWorkbook(is);
        } else if (mFilePath.endsWith(SUFFIX_2007)) {
            workbook = new XSSFWorkbook(is);
        }

        return workbook;
    }
....................

得到Workbook後,就可以開始進一步解析了:

.......................
    void parseWorkbook(Workbook workbook, List<ApnModel> apnModelList) {
        int numOfSheet = workbook.getNumberOfSheets();

        //依次解析每一個Sheet
        for (int i = 0; i < numOfSheet; ++i) {
            Sheet sheet = workbook.getSheetAt(i);
            parseSheet(sheet, apnModelList);
        }
    }

    //儲存需要呼叫的ApnModel中的方法
    private List<Method> mUsedMethod;

    private void parseSheet(Sheet sheet, List<ApnModel> apnModelList) {
        Row row;

        int count = 0;

        //利用迭代器,取出每一個Row
        Iterator<Row> iterator = sheet.iterator();
        while(iterator.hasNext()) {
            row = iterator.next();

            //由於第一行是標題,因此這裡單獨處理
            if (count == 0) {
                mUsedMethod = new ArrayList<>();
                parseRowAndFindMethod(row);
            } else {
                //其它行都在這裡處理
                parseRowAndFillData(row, apnModelList);
            }

            ++count;
        }
    }

    private void parseRowAndFindMethod(Row row) {
        //利用parseRow處理每一行,得到每個cell中的String
        List<String> rst = parseRow(row);

        String methodName;
        try {
            //根據String得到需要呼叫的ApnModel中的方法
            //由於自己在ApnModel中定義的方法均是類似setMcc、setMnc等
            //因此才在一開始,將標題欄中每一項大寫
            for (String str : rst) {
                methodName = "set" + str;
                //反射拿到method
                mUsedMethod.add(
                        ApnModel.class.getDeclaredMethod(methodName, String.class));
            }
        } catch (NoSuchMethodException e) {
            System.out.println(e.toString());
        }

    }

    //開始解析具體的資料
    private void parseRowAndFillData(Row row, List<ApnModel> apnModelList) {
        //同樣利用parseRow得到具體每一行的資料
        List<String> rst = parseRow(row);

        ApnModel apnModel = new ApnModel();

        //這裡主要debug一下,避免由於Excel的格式可能不太對
        //使得每一行的資料解析地不太對
        if (mUsedMethod.size() != rst.size()) {
            System.out.println("WTF, size not right");
        } else {
            //利用反射,將資料填充到具體的ApnModel
            try {
                for (int i = 0; i < mUsedMethod.size(); ++i) {
                    mUsedMethod.get(i).invoke(apnModel, rst.get(i));
                }

                //儲存到輸出結果中
                apnModelList.add(apnModel);
            } catch (Exception e) {
                System.out.println(e.toString());
            }
        }
    }

    //這裡是解析每一行的程式碼
    private List<String> parseRow(Row row) {
        List<String> rst = new ArrayList<>();

        Cell cell;

        //利用迭代器得到每一個cell
        Iterator<Cell> iterator = row.iterator();
        while (iterator.hasNext()) {
            cell = iterator.next();

            //定義每一個cell的資料型別
            cell.setCellType(CellType.STRING);

            //取出cell中的value
            rst.add(cell.getStringCellValue());
        }

        return rst;
    }
.................

以上就是Java解析Excel範例的核心程式碼了。

之後的工作就是將ApnModel中儲存的資料,按照需要的格式寫入到輸出檔案了。
這部分程式碼比較粗糙,也與主題無關,就不直接貼到部落格上了。

最後的輸出結果類似於。與原生的格式一致了:

這裡唯一要注意的是,要保證Excel的格式正確。
單元格的內容可以是空白的,因此要保證Excel中僅有資料佔有了實際的內容。

如上圖所示,資料部分可以空白,但非資料的紅色部分就不要有內容了。

相關推薦

Java解析Excel例項解析

最近有些配置APN的工作,需要將Excel中的資訊,配置成Android apns-conf.xml中的樣式。 作為一個程式設計師,我怎麼可能一行行的用眼睛看,然後用手去配置了! 於是,我決定利用Apache POI的支援庫,用java程式解析Excel表,

Java讀取Excel解析文字(並格式化輸出)

說明 最近在做一個比較小型的網站,需要批量匯入註冊使用者.使用者的資訊寫在一張excel表格裡面. 所以就需要讀取excel.所以就記錄下遇到的問題,以及以後檢視. 相關技術

java實現Excel檔案解析---apache POI以及把漢字轉化為拼音

package com.haha.utils; import java.util.Arrays; import net.sourceforge.pinyin4j.PinyinHelper; import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType

Qt的事件處理和定時器解析例項解析

理論準備: 1、事件是由視窗系統或者Qt自身產生的,用以響應所發生的各類事情。 2、Qt事件的產生可能是因為鍵盤或滑鼠被按下,也有可能是視窗在顯示時,產生的繪製事件。 3、大多數事件都是為使用者的操作而產生的響應。其中比較特殊的定時器事件,則是由系統獨立產生的。 4、在Q

java生成Excel例項程式碼

工具類程式碼PoiExcelExport如下: package com.myssm.util.poi; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; i

轉:java 解析excel,帶合並單元的excel

void lena words ger add leo main 下標 解析excel   收集了一些對博主有幫助的博文,如下 >>>>>>>>>>>第一部分: 首先,mavn導入jar包 <!-- 解

Java上傳Excel解析

err com XML ger exc try finally write else 1.上傳: public String uploadFile(CommonsMultipartFile file,String uploadPath,String realUploadP

java利用poi解析excel文件

sheet 文件 引入 exceptio form number string lean error: 首先需要引入以下jar包 如果使用maven,需要添加兩個依賴 <dependencies> <dependency>

java解析Excel(xls、xlsx兩種格式)

https://www.cnblogs.com/hhhshct/p/7255915.html ********************************************************** 一、需要匯入的jar   1.commons-collections4-4.

上傳EXCEL檔案到後端,匯入並解析EXCEL的前後端實現(Vue.js + java後端)

vue.js前端,Java後端,如何匯入excel檔案,並且解析,本文給了前後端程式碼的實現,以及完美實踐OK之後的分享。 前端主要用了element-ui的upload元件。 關於這個元件的官方文件很少:http://element-cn.eleme.io/#/zh-CN/compon

java 解析excel

Java 使用POI 解析excel檔案,返回List<List<List>>, 分別為sheet,row,cell三層資料; 封裝程式碼: public class ImportExcel { public List<List<List&l

java解析Excel,使用InputStream讀取檔案

一、需要匯入的jar包 <dependency>             <groupId>org.apache.poi</groupId>             <artifactId>poi</ar

java解析Excel表格資料

我們使用的包為jxl.jar,可以實現從Excel檔案中讀取指定的行和列的值。 Excel表格: java程式碼演示: 1.獲取表格中name列的值效果: [game_loginwith, game_guest, game_policy, game_loadi

JAVA集合-03ArrayList原始碼解析和使用例項

上一章講解了Collection介面下得抽象類和繼承介面,後續深入到具體的實現類,部落格及對應得程式碼可在github上檢視 ArrayList簡介 ArrayList底層實現是陣列,相較於陣列固定大小,ArrayList可以動態的增加;ArrayList繼承AbstractCollect

java利用poi簡單解析excel

一般工作當中會有一些資料進行分析拼接之類,通過貼到excel中然後利用poi解析。還是有些用途的。 jar包poi-3.15.jar public class ExcelUtls { public static Map<String, S

Java解析excel工具easyexcel 助你快速簡單避免OOM

Java解析、生成Excel比較有名的框架有Apache poi、jxl。但他們都存在一個嚴重的問題就是非常的耗記憶體,poi有一套SAX模式的API可以一定程度的解決一些記憶體溢位的問題,但POI還是有一些缺陷,比如07版Excel解壓縮以及解壓後儲存都是在記憶體中完成的,

Java用POI讀取解析Excel時,遇到科學計數法的解決方法

在匯入excel2003或者2007的時候難免會遇到某些單元格雖然是文字數字,但是使用java的poi來解析時會出現科學計算形式,下面我們看怎麼去掉這種格式,以文字來顯示: 1、導包 <!-- https://mvnrepository.com/artifact/org.apa

java完美解析excel

java 程式碼完美解析excel表格,2007與2003版。2003及以上版本均可使用2007版 package com.elensdata; import org.apache.poi.hssf.usermodel.*; import org.apache.

Java簡單的繼承例項解析

面向物件程式語言具有封裝、繼承、多型三個基本特徵,本文就繼承舉例詳談 程式碼中有一個父類person1類,表示“這個人”,person1的一個子類為student,表示“這個人是學生”。 perso

Java集合框架之Collection例項解析

0、集合引入 1)集合的由來? Java是面向物件程式語言,經常需要操作很多物件,必要時需儲存物件(對Java語言而言,儲存的通常是物件的引用,以達到複用或管理等目的),常見容器如陣列和StringBuffer(執行緒安全但效率較低,為了提高效率而