PhpSpreadsheet에서 텍스트 파일(csv,txt) 로드

매우 간단하고 공식 문서 보면 알지만 자신의 비망록으로.
그리고 초보자 전용입니다. 실수가있을 수 있으므로 지적하십시오.

환경


  • php 7.1.4
  • Phpspreadsheet 1.1.0
  • Laravel Framework 5.5.34

  • version 확인의 커맨드는 뭐야···? 좋기 때문에 글쓰기
  • php php -v
  • Phpspreadsheet composer show
  • laravel php artisan --version

  • 텍스트 파일 로드



    준비한 것은 메모장 텍스트 파일.



    읽는 파일 유형이 텍스트 파일로 알려져 있으므로 csv 유형의 reader 객체를 인스턴스화하고 파일을 spreadsheet 객체로 읽습니다.

    컨트롤러
    $reader = new \PhpOffice\PhpSpreadsheet\Reader\Csv();
    $spreadsheet = $reader->load($filePath);
    

    나는 view로부터 파일을 보내고 있었으므로 파일 패스는 이하와 같은 형태로 받고 있다

    컨트롤러
    $filePath = request()->file('fileName');
    

    로드 옵션



    파일 형식에주의

    Note that\PhpOffice\PhpSpreadsheet\Reader\Csv by default assumes that the loaded CSV file is UTF-8 encoded.
    (기본적으로\PhpOffice\PhpSpreadsheet\Reader\Csv는 로드된 CSV 파일이 UTF-8로 인코딩되어 있다고 가정합니다.)

    읽기 텍스트 파일이 'SJIS'인데! 그렇다면 인스턴스화 한 후에

    컨트롤러
    $reader->setInputEncoding('SJIS');
    

    그러면 문자도 제대로 읽어줍니다.

    기타 다양한 설정 가능. 자세한 내용은 공식 문서를 참조하십시오.

    데이터 저장



    읽은 시트에서 데이터를 좋은 느낌으로 저장

    컨트롤러
    use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
    
    $sheet = $spreadsheet->getSheet(0);
    
    // rowとcolのデータ領域を確認
    $rowMax = $sheet->getHighestRow();  
    $colMaxStr = $sheet->getHighestColumn();
    $colMax = Coordinate::columnIndexFromString($colMaxStr);
    
    // 1セルごとにテキストデータを取得
    $sheetData = [ ];
    for($r = 1; $r <= $rowMax; $r ++) {
      for($c = 1; $c <= $colMax; $c ++) {
        $cell = $sheet->getCellByColumnAndRow($c, $r);
        $sheetData[$r][$c] = $cell->getValue();
      }
    }
    

    이제는 이 방법으로만 데이터를 저장하는 방법을 알지 못했기 때문에 다른 좋은 방법이 있다면 알려주세요.

    (추기) 이런 까다로운 방법 하지 않아도 1행으로 배열로 하는 방법 있었다.

    컨트롤러
    
    $sheetData = $spreadsheet->getActiveSheet()->toArray();
    
    

    출력되는 배열은 for 문을 돌리는 방법과 같습니다. 단연 이쪽이 편해! ! ! ! !
    toArray 메소드의 인수는 전부 4개, 거의 데포로 좋다고 생각합니다.

    Worksheet.php
    /**
      * Create array from worksheet.
      * @param mixed $nullValue セルが存在しない場合、配列エントリに返される値
      * @param bool $calculateFormulas 数式を計算すべきか?
      * @param bool $formatData Should セル値に書式を適用する必要があるか?
      * @param bool $returnCellRef False - 0から数えてカウントされる行と列の単純な配列を返します
      *                            True - 実際の行IDと列IDによってインデックスされた行と列を返します
      *
      * @return array
      */
     public function toArray($nullValue = null, $calculateFormulas = true, $formatData = true, $returnCellRef = false)
        {
            // Garbage collect...
            $this->garbageCollect();
    
            //    Identify the range that we need to extract from the worksheet
            $maxCol = $this->getHighestColumn();
            $maxRow = $this->getHighestRow();
    
            // Return
            return $this->rangeToArray('A1:' . $maxCol . $maxRow, $nullValue, $calculateFormulas, $formatData, $returnCellRef);
        }
    

    $sheetData의 내용은

    덤프
    array:10 [
      1 => array:7 [
        1 => "FF"
        2 => "1987年"
        3 => "FC"
        4 => "wol"
        5 => "カオス"
        6 => "とくれせんたぼーび"
        7 => null
      ]
      2 => array:7 [
        1 => "FF2"
        2 => "1988年"
        3 => "FC"
        4 => "フリオニール"
        5 => "パラメキア帝国初代皇帝"
        6 => "……ゴクッ……"
        7 => null
      ]
      3 => array:7 [
        1 => "FF3"
        2 => "1990年"
        3 => "FC"
        4 => "オニオンナイトorルーネス"
        5 => "暗闇の雲"
        6 => "ファファファ…"
        7 => null
      ]
      4 => array:7 [
        1 => "FF4"
        2 => "1991年"
        3 => "SF"
        4 => "セシル"
        5 => "ゼロムス"
        6 => "いいですとも!"
        7 => null
      ]
      5 => array:7 [
        1 => "FF5"
        2 => "1992年"
        3 => "SF"
        4 => "バッツ"
        5 => "ネオエクスデス"
        6 => "ボコ、行ってくる!"
        7 => null
      ]
      6 => array:7 [
        1 => "FF6"
        2 => "1994年"
        3 => "SF"
        4 => "ティナ"
        5 => "ケフカ"
        6 => "命、夢、希望、どこから来て どこへ行く?そんなものは、この私がハカイする!"
        7 => null
      ]
      7 => array:7 [
        1 => "FF7"
        2 => "1997年"
        3 => "PS"
        4 => "クラウド"
        5 => "セフィロス"
        6 => "興味ないね"
        7 => null
      ]
      8 => array:7 [
        1 => "FF8"
        2 => "1999年"
        3 => "PS"
        4 => "スコール"
        5 => "アルティミシア"
        6 => "壁にでも話してろよ"
        7 => null
      ]
      9 => array:7 [
        1 => "FF9"
        2 => "2000年"
        3 => "PS"
        4 => "ジタン"
        5 => "ペプシマン"
        6 => "誰かを助けるのに理由がいるかい?"
        7 => null
      ]
      10 => array:7 [
        1 => "FF7"
        2 => "2001年"
        3 => "PS2"
        4 => "ティーダ"
        5 => "シン"
        6 => "泣くぞ。すぐ泣くぞ。絶対泣くぞ。ほら泣くぞ。"
        7 => null
      ]
    ]
    

    왜 마지막으로 null이 들어오는지는 조사중입니다.

    이런 느낌으로 읽을 수 있었기 때문에 나머지는 이 녀석을 DB 보존하게 되고 끓여지고 구워져 자유롭게.

    좋은 웹페이지 즐겨찾기