桜ヶ丘日記

技術メモとかとか

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が作成される

「暦の上ではディセンバー」買った。

買った。

あまちゃん」の劇中歌で、宮藤官九郎作詞ということでなかなか面白い歌。


暦の上ではディセンバー

Amazonでmp3音楽データで250円。

そのうちタダ同然でGEOあたりで並ぶだろうけど、

  • いますぐ
  • リッピングの手間なく
  • タグ入力の手間なく
  • アートワークもばっちりつく

というメリットに250円払ったと思えば安い。

「Yahoo!コミュニケーションメール」のメールをPCやGmailでも送受信する方法

「Yahoo!コミュニケーションメール」ってスマホアプリからしか利用出来ないから不便!とお嘆きのあなた。

f:id:sakuragaoka:20130821120237p:plain

いえいえ。ちゃんと出来ますよ。

簡単に言うと

  • 「Yahoo!コミュニケーションメール」のメールアドレス・パスワードでYahoo!Japanにログイン出来る
  • その状態でYahoo!メールを開くと「Yahoo!コミュニケーションメール」のメールアドレスで送受信出来る
  • さらにPOPアクセスを有効にすれば通常のメーラーやGmailからでも送受信出来る(ただし広告メール受信が必要)

という感じです。

では手順を。


Yahoo!Japanからログアウトした状態で下記を開き、「Yahoo!コミュニケーションメール」のメールアドレス・パスワードでログイン

https://login.yahoo.co.jp/config/login
f:id:sakuragaoka:20130821120239p:plain


ついでなので生年月日・郵便番号・秘密の質問を登録しておく

f:id:sakuragaoka:20130821120240p:plain


登録情報の編集完了

f:id:sakuragaoka:20130821120243p:plain


Yahoo!メールを開く

http://mail.yahoo.co.jp/
f:id:sakuragaoka:20130821120244p:plain

なんと「Yahoo!コミュニケーションメール」で送受信したメールが見えるぞ!


「メールの設定」を開く

f:id:sakuragaoka:20130821120245p:plain


「POPアクセスとメール転送」を開く

f:id:sakuragaoka:20130821120247p:plain


Yahoo!デリバリーに登録する

Yahoo!デリバリーというのはYahoo!Japanの広告メール配信サービスのこと。
広告メールが届くようにしないとPOPアクセスは使わせて貰えないみたいです。
なあに、Gmailでも経由してゴミ箱直行フィルターでも使えばいいさ。
f:id:sakuragaoka:20130821120249p:plain


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


Spidering hacks―ウェブ情報ラクラク取得テクニック101選

さくらVPSでとりあえずWeb::Queryが使えるようにしてみる

PerljQuery風のセレクタを使ってスクレイピングが出来るモジュール、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 (アウトビアンキ)


参考
http://d.hatena.ne.jp/lesamoureuses/20110222/1298317227

プログラミングPerl〈VOLUME1〉