PhpSpreadsheetでExcelファイルを読み込んで値を挿入し保存するサンプル
コード
<?php require '/Users/sakuragaoka/vendor/autoload.php'; // ファイルを読み込む $reader = new PhpOffice\PhpSpreadsheet\Reader\Xlsx(); $reader->setIncludeCharts(TRUE); $book = $reader->load('template.xlsx'); // 値を書き込む $book->setActiveSheetIndex(1); // 二番目のシートを選択する $sheet = $book->getActiveSheet(); $sheet->setCellValue('A1', 'Hello World !'); $book->setActiveSheetIndex(0); // 最初のシートを選択する // ファイルを書き出す $writer = new PhpOffice\PhpSpreadsheet\Writer\Xlsx($book); $writer->setIncludeCharts(TRUE); $writer->save('output.xlsx');
xamppでPhpSpreadsheetを試してみる
xamppのphpでPhpSpreadsheetを試してみた。
PhpSpreadsheetはComposerを使ってインストールすることになる。
環境
C:\Users\sakuragaoka>ver Microsoft Windows [Version 6.1.7601] C:\Users\sakuragaoka>php -v PHP 7.1.9 (cli) (built: Aug 30 2017 18:37:35) ( ZTS MSVC14 (Visual C++ 2015) x86) Copyright (c) 1997-2017 The PHP Group Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
Composerを入れる
手順
https://getcomposer.org/download/
からダウンロードしインストーラで入れる
起動
C:\Users\sakuragaoka>composer ______ / ____/___ ____ ___ ____ ____ ________ _____ / / / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/ / /___/ /_/ / / / / / / /_/ / /_/ (__ ) __/ / \____/\____/_/ /_/ /_/ .___/\____/____/\___/_/ /_/ Composer version 1.5.2 2017-09-11 16:59:25 Usage: command [options] [arguments] (略) C:\Users\sakuragaoka>composer.bat --version Composer version 1.5.2 2017-09-11 16:59:25
Composerを使ってPhpSpreadsheetを入れる
手順
C:\Users\sakuragaoka>composer require phpoffice/phpspreadsheet:dev-develop ./composer.json has been updated Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 2 installs, 0 updates, 0 removals - Installing psr/simple-cache (1.0.0): Downloading (100%) - Installing phpoffice/phpspreadsheet (dev-develop 1cec980): Cloning 1cec980167 from cache phpoffice/phpspreadsheet suggests installing mpdf/mpdf (Option for rendering PDF with PDF Writer) phpoffice/phpspreadsheet suggests installing dompdf/dompdf (Option for rendering PDF with PDF Writer) phpoffice/phpspreadsheet suggests installing tecnick.com/tcpdf (Option for rendering PDF with PDF Writer) phpoffice/phpspreadsheet suggests installing jpgraph/jpgraph (Option for rendering charts, or including charts with PDF or HTML Writers) Writing lock file Generating autoload files C:\Users\sakuragaoka>
動作確認
あらかじめ
C:\home\work\phpspreadsheet\hello.php
に
https://phpspreadsheet.readthedocs.io/en/develop/#installation
にあるHello Worldサンプルを作成しておく
C:\Users\sakuragaoka>cd C:\home\work\phpspreadsheet C:\home\work\phpspreadsheet>type hello.php <?php require '/Users/sakuragaoka/vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; $spreadsheet = new Spreadsheet(); $sheet = $spreadsheet->getActiveSheet(); $sheet->setCellValue('A1', 'Hello World !'); $writer = new Xlsx($spreadsheet); $writer->save('hello world.xlsx'); C:\home\work\phpspreadsheet>php hello.php C:\home\work\phpspreadsheet>
C:\home\work\phpspreadsheet
の中にhello world.xlsxが作成される
「暦の上ではディセンバー」買った。
「Yahoo!コミュニケーションメール」のメールをPCやGmailでも送受信する方法
「Yahoo!コミュニケーションメール」ってスマホアプリからしか利用出来ないから不便!とお嘆きのあなた。
いえいえ。ちゃんと出来ますよ。
簡単に言うと
- 「Yahoo!コミュニケーションメール」のメールアドレス・パスワードでYahoo!Japanにログイン出来る
- その状態でYahoo!メールを開くと「Yahoo!コミュニケーションメール」のメールアドレスで送受信出来る
- さらにPOPアクセスを有効にすれば通常のメーラーやGmailからでも送受信出来る(ただし広告メール受信が必要)
という感じです。
では手順を。
Yahoo!Japanからログアウトした状態で下記を開き、「Yahoo!コミュニケーションメール」のメールアドレス・パスワードでログイン
https://login.yahoo.co.jp/config/login
ついでなので生年月日・郵便番号・秘密の質問を登録しておく
登録情報の編集完了
「メールの設定」を開く
「POPアクセスとメール転送」を開く
Yahoo!デリバリーに登録する
Yahoo!デリバリーというのはYahoo!Japanの広告メール配信サービスのこと。
広告メールが届くようにしないとPOPアクセスは使わせて貰えないみたいです。
なあに、Gmailでも経由してゴミ箱直行フィルターでも使えばいいさ。
「POPアクセスとメール転送」の設定
「設定する」ボタンを押せばPOP・SMTPの設定情報が表示されるので、あとは好きなメーラーなりGmailなりに設定すればOK!
SANYO eneloop 限定単3形8本パック HR-3UTGB-8U
超小型!2台同時充電[iPhone5・iPad mini対応!各社Androidスマートフォン、iPad第4世代・iPad3・iPad2・iPhone4S・4対応]2ポートUSBシガーソケットカーチャージャー 2000mAハイパワー出力、Android用充電ケーブル付属
iPhone5 iPad4 iPad mini Android 対応 2.1A 超小型 2ポートUSB オレンジLED発光 シガーソケット カーチャージャー日本語パッケージ
Hanwha USB 2ポート搭載 USBカーチャージャー 高出力2.1Aポート搭載でiPadの充電にも対応! UMA-2USBCA21
Web::Queryでキャッシュ機能を持たせる
開発用に処理内容をちょこちょこ書き換えながらスクレイピングを回しまくると、問い合わせ先のWebサーバーにリクエスト投げまくるんでちょっと迷惑をかけます。
そこでキャッシュを実装してみるんですが一番簡単なのはHTTP::Cache::Transparentです。
手順はこれだけ
- HTTP::Cache::TransparentをWeb::Queryより後にuseする
- 実際にWeb::Queryを使う前にHTTP::Cache::Transparentをinitする
実験環境はいつものさくらVPS。
■ 元のコード
さくらVPSでとりあえずWeb::Queryが使えるようにしてみる
http://sakuragaoka.hatenadiary.jp/entry/2013/06/07/201740
■ 参考
http://d.ballade.jp/blog/2008/03/lwpget_1b79.html
■ インストール
$ sudo cpan HTTP::Cache::Transparent
■ 使ってみる
- BasePath: キャッシュを作る場所
- NoUpdate: この間(秒)はWebサーバーに再度問い合わせをしない
- MaxAge: この間(時間)キャッシュファイルを保持する
- Verbose: 1にすると画面に冗長な出力をする
#!/usr/bin/env perl use utf8; use strict; use warnings; use Web::Query; use HTTP::Cache::Transparent; binmode(STDOUT, ":utf8"); HTTP::Cache::Transparent::init({ BasePath => '/var/www/XXXXXX/batch/httpcache/wq', NoUpdate => 60*60*24*7, # sec MaxAge => 24*365, # hour Verbose => 0, }); wq('http://www.goo-net.com/catalog/')->find('div.box_searchUsedCar ul.line li a')->each(sub{ $_[1]->each(sub{ my(undef, $wq) = @_; my $name_j = $wq->text(); my $name = $wq->attr('href'); $name =~s|^/catalog/(\w+)/index.html$|$1|; print qq|$name ($name_j)\n|; }) }); exit;
■ 結果
キャッシュ有り無しの違いだけなんで、実行しても改変前のコードと出力は変わらない訳ですがキャッシュが出来てるのは確認出来ます。
$ ls -l /var/www/cardata/batch/httpcache/wq total 48 -rw-rw-r-- 1 sakuragaoka 49024 Jul 11 13:43 a09f5047f9c2d2e9959587f9ac732c17
さくらVPSでとりあえずWeb::Queryが使えるようにしてみる
PerlでjQuery風のセレクタを使ってスクレイピングが出来るモジュール、Web::Queryを使いたいのでまずは使えるようにしてみる。
インストール。
$ sudo yum -y install cpan (中略) Installed: perl-CPAN.x86_64 0:1.9402-131.el6_4 Dependency Installed: perl-Digest-SHA.x86_64 1:5.47-131.el6_4 perl-ExtUtils-MakeMaker.x86_64 0:6.55-131.el6_4 perl-ExtUtils-ParseXS.x86_64 1:2.2003.0-131.el6_4 perl-Test-Harness.x86_64 0:3.17-131.el6_4 perl-devel.x86_64 4:5.10.1-131.el6_4 Complete! $ sudo cpan cpan> install CPAN cpan> reload cpan $ sudo cpan Module::Build $ sudo cpan Web::Query
テスト。
自動車のメーカー名一覧をgoo-netから取得するよー!
$ cat > ~/sample.pl use strict; use warnings; use Web::Query; binmode(STDOUT, ":utf8"); wq('http://www.goo-net.com/catalog/') ->find('div.box_searchUsedCar ul.line li a') ->each(sub{ $_[1]->each(sub{ my(undef, $wq) = @_; my $name_j = $wq->text(); my $name = $wq->attr('href'); $name =~s|^/catalog/(\w+)/index.html$|$1|; print qq|$name ($name_j)\n|; }) }); exit;
実行してみる
$ perl ~/sample.pl LEXUS (レクサス) TOYOTA (トヨタ) NISSAN (日産) HONDA (ホンダ) MAZDA (マツダ) EUNOS (ユーノス) FORD_JAPAN (日本フォード) MITSUBISHI (三菱) SUBARU (スバル) DAIHATSU (ダイハツ) SUZUKI (スズキ) ISUZU (いすゞ) MITSUOKA (ミツオカ) RENAULT (ルノー) PEUGEOT (プジョー) CITROEN (シトロエン) VENTURI (ヴェンチュリー) MERCEDES_BENZ (メルセデス・ベンツ) AMG (AMG) MAYBACH (マイバッハ) MCC_SMART (スマート) BMW (BMW) BMW_ALPINA (BMWアルピナ) AUDI (アウディ) VOLKSWAGEN (フォルクスワーゲン) MINI (MINI) OPEL (オペル) PORSCHE (ポルシェ) EUROPE_FORD (ヨーロッパフォード) YES (イエス!) VOLVO (ボルボ) SAAB (サーブ) ROLLSROYCE (ロールスロイス) BENTLEY (ベントレー) JAGUAR (ジャガー) DAIMLER (デイムラー) LAND_ROVER (ランドローバー) MG (MG) ROVER (ローバー) LOTUS (ロータス) ASTON_MARTIN (アストンマーティン) MORGAN (モーガン) TVR (TVR) FIAT (フィアット) ABARTH (アバルト) FERRARI (フェラーリ) LANCIA (ランチア) ALFA_ROMEO (アルファロメオ) MASERATI (マセラティ) LAMBORGHINI (ランボルギーニ) AUTOBIANCHI (アウトビアンキ)