Java讀取Excel文件數(shù)據(jù)并將記錄寫入到新的文件中--POI技術(shù)實現(xiàn)

1. apache poi包里有4個主要的類:

  • Workbook------工作表,通過WorkbookFactory的create(FileInputStream fis)方法獲取核行,
  • Sheet------------表格秧了,Workbook實例的getSheetAt(int num)方法獲取刊愚,
  • Row--------------行,Sheet實例的getRow(int num)方法獲取栅哀,
  • Cell--------------單元格丑婿,Row實例的getCell(int num)方法獲取,
    最后通過Cell實例根據(jù)數(shù)據(jù)類型調(diào)用對應(yīng)的方法獲取單元格的值娄周。

2. 代碼

package com.upi.institution.utils;

import com.upi.institution.common.utils.CommonUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

public class ExcelUtil {

    private static Logger logger = LoggerFactory.getLogger(ExcelUtil.class);

    private static Workbook workbook;
    private static Sheet sheet;

    /**
     * 初始化表格涕侈,判斷文件格式是xls還是xlsx
     * @param excelPath
     */
    private static void initExcel(String excelPath){
        if (CommonUtils.isEmpty(excelPath)){
            logger.info("文件路徑不能為空");
            workbook = null;
            return;
        }
        try {
            InputStream is = new FileInputStream(excelPath);
            if (excelPath.endsWith(".xls")){//.xls格式
                workbook = new HSSFWorkbook(is);
            }else if(excelPath.endsWith(".xlsx")){//.xlsx格式
                workbook = new XSSFWorkbook(is);
            }else{
                workbook = null;
                logger.info("無法轉(zhuǎn)換的Excel文件格式(后綴名應(yīng)為:.xls或.xlsx)");
            }
        } catch (FileNotFoundException e) {
            logger.info("找不到指定文件");
        } catch (IOException e) {
            logger.info("IO異常");
        }
    }

    /**
     * 讀取Excel文件并解析成json字符串后寫入新的文件
     * @param excelPath 要解析的Excel文件路徑(具體文件)
     * @param fromRow 指定開始讀取的行數(shù),如從第2行開始則為2
     * @param filePath 寫入json后的文件保存位置(文件路徑)
     */
    private static void readExcelToJsonFile(String excelPath, int headerNum, int fromRow, String filePath){
        initExcel(excelPath);
        if(workbook == null){
            logger.info("初始化工作簿失敗");
            return;
        }
        for(int s=0; s<workbook.getNumberOfSheets(); s++){//遍歷sheet
            sheet = workbook.getSheetAt(s);
            Row headerRow = getRow(sheet, headerNum);//首行煤辨,即json-key
            int rowNum = sheet.getLastRowNum() + 1;//總行數(shù)
            for(int i=(fromRow-1); i<rowNum; i++){//遍歷行,從fromRow行開始遍歷
                Map<String, String > map = new HashMap<String, String>();
                Row row = sheet.getRow(i);
                if(row == null){
                    continue;
                }
                int cellNum = row.getLastCellNum();//總列數(shù)
                for(int j=0; j<cellNum; j++){//遍歷單元格
                    String key = getCellValue(headerRow.getCell(j));
                    String value = getCellValue(row.getCell(j));
                    if(!CommonUtils.isEmpty(key) && !CommonUtils.isEmpty(value)){
                        map.put(key, value);
                    }
                }
                String jsonStr = JsonUtil.toJson(map);//將map解析成json字符串
                String fileName = UUIDUtil.UUID("002");//生成隨機文件名裳涛,以"002"開頭
                String finalFilePath = filePath + "\\" + fileName + ".txt";//最終保存的文件路徑
                FileUtil.writeToFile(finalFilePath, jsonStr, false);//將json字符串寫入文件,不追加众辨,每一行數(shù)據(jù)即生成一個文件
                String fileNamePath = filePath + "\\fileNames.txt";//保存所有隨機文件名
                FileUtil.writeToFile(fileNamePath, (fileName + "\r\n"), true);//將文件名寫入fileNames.txt文本中
            }
            logger.info("成功讀取Excel并生成文件");
        }
    }

    /**
     * 獲取指定行
     * @param sheet
     * @param rowNum
     * @return
     */
    private static Row getRow(Sheet sheet, int rowNum){
        if(sheet == null){
            return null;
        }
        return sheet.getRow(rowNum - 1);
    }

    /**
     * 獲取單元格的值
     * @param cell
     * @return 單元格值
     */
    private static String getCellValue(Cell cell){
        String cellValue = "";
        if(cell != null){
            switch (cell.getCellType()){//單元格類型
                case Cell.CELL_TYPE_BOOLEAN://布爾類型
                    cellValue = cell.getBooleanCellValue() + "";
                    break;
                case Cell.CELL_TYPE_NUMERIC://數(shù)字類型
                    if (DateUtil.isCellDateFormatted(cell)) {//格式化后的日期數(shù)值類型
                        cellValue = new DataFormatter().formatCellValue(cell);
                    } else {
                        //數(shù)值
                        double value = cell.getNumericCellValue();
                        int intValue = (int) value;
                        cellValue = value - intValue == 0 ? String.valueOf(intValue) : String.valueOf(value);
                    }
                    break;
                case Cell.CELL_TYPE_FORMULA:{//公式
                    try{
                        cellValue = cell.getNumericCellValue() + "";
                    }catch(IllegalStateException e){
                        cellValue = String.valueOf(cell.getRichStringCellValue());
                    }
                }
                break;
                case Cell.CELL_TYPE_STRING://字符串
                    cellValue = cell.getStringCellValue();
                    break;
                case Cell.CELL_TYPE_BLANK://空值
                    cellValue = "";
                    break;
                case Cell.CELL_TYPE_ERROR://故障
                    cellValue = "非法字符";
                    break;
                default:
                    cellValue = "未知類型";
                    break;
            }
        }
        return cellValue.trim();
    }

    public static void main(String[] args) {
        String test = "C:\\Users\\Administrator\\Desktop\\test.xls";
        String filePath = "C:\\Users\\Administrator\\Desktop";
        readExcelToJsonFile(test, 1, 2, filePath);
    }

}

3. 測試

test.xls表格數(shù)據(jù)

運行代碼:


控制臺
桌面生成的文件
json數(shù)據(jù)
文件名
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末端三,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鹃彻,更是在濱河造成了極大的恐慌技肩,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浮声,死亡現(xiàn)場離奇詭異,居然都是意外死亡旋奢,警方通過查閱死者的電腦和手機泳挥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來至朗,“玉大人屉符,你說我怎么就攤上這事∏乱” “怎么了矗钟?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長嫌变。 經(jīng)常有香客問我吨艇,道長,這世上最難降的妖魔是什么腾啥? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任东涡,我火速辦了婚禮,結(jié)果婚禮上倘待,老公的妹妹穿的比我還像新娘疮跑。我一直安慰自己,他們只是感情好凸舵,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布祖娘。 她就那樣靜靜地躺著,像睡著了一般啊奄。 火紅的嫁衣襯著肌膚如雪渐苏。 梳的紋絲不亂的頭發(fā)上掀潮,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天,我揣著相機與錄音整以,去河邊找鬼胧辽。 笑死,一個胖子當(dāng)著我的面吹牛公黑,可吹牛的內(nèi)容都是我干的邑商。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼凡蚜,長吁一口氣:“原來是場噩夢啊……” “哼人断!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起朝蜘,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤恶迈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后谱醇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體暇仲,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年副渴,在試婚紗的時候發(fā)現(xiàn)自己被綠了奈附。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡煮剧,死狀恐怖斥滤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情勉盅,我是刑警寧澤佑颇,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站草娜,受9級特大地震影響挑胸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宰闰,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一嗜暴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧议蟆,春花似錦闷沥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春路狮,著一層夾襖步出監(jiān)牢的瞬間虫啥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工奄妨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留涂籽,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓砸抛,卻偏偏與公主長得像评雌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子直焙,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容

  • 使用首先需要了解他的工作原理 1.POI結(jié)構(gòu)與常用類 (1)創(chuàng)建Workbook和Sheet (2)創(chuàng)建單元格 (...
    長城ol閱讀 8,414評論 2 25
  • 轉(zhuǎn)自鏈接 目錄 1.認識NPOI 2.使用NPOI生成xls文件 2.1創(chuàng)建基本內(nèi)容 2.1.1創(chuàng)建Workboo...
    腿毛褲閱讀 10,502評論 1 3
  • ——邊學(xué)習(xí)邊記錄~最近需要用到從外部文件導(dǎo)入測試數(shù)據(jù)景东,因而上網(wǎng)查了一些讀取excel文件這方面的代碼,然后修改后適...
    study_monkey閱讀 2,347評論 0 3
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法奔誓,類相關(guān)的語法斤吐,內(nèi)部類的語法,繼承相關(guān)的語法厨喂,異常的語法和措,線程的語...
    子非魚_t_閱讀 31,602評論 18 399
  • POI操作Excel Excel簡介一個excel文件就是一個工作簿workbook,一個工作簿中可以創(chuàng)建多張工作...
    灰氣球閱讀 4,705評論 2 48