phpexcelについて。
xlsxをpost→読み込み、配列に変換→フォーマットに沿ってxlsxを書き出し・・・という処理を作っていたのだが、
うわさに聞いていた通り、かなりメモリを食うようで、5000行を読み込んで分割して・・・といった処理が完走できない。
下手をすると300行くらいの処理も危うい。
google先生に泣きついて、unsetなりphpのメモリを上げるなりしたのだが、エラーメッセージを吐かないで固まってしまう。
しょうがないので、
xlsxをpost→読み込み、配列に変換→生成するファイルごとに配列を分割→ajaxで連続送信→フォーマットに沿ってxlsxをoutput
・・・とやったら、一瞬で処理が終わってしまった。
やはり、どこかでメモリが解放しきれていなかったのだろうか。
色々手を変え品を変えやっていたら、はまってしまったが、結果としてajaxで途中経過も出力できるようになったし、よかった。
Translate
2016年2月8日月曜日
2016年2月4日木曜日
【CSS】【javascript】ドラッグアンドドロップはhoverではない
タイトルどおりなのですが。
ブラウザにファイルをドラッグアンドドロップしてアップロード・・・というものを作っているとき、
指定のゾーンにドラッグしているマウスが移動したら、色を変えるなりしようと思っていたのですが、
実際には、うまく動かない。
ファイルをドロップした後に、hoverとして認識されてしまう。
どうやら、cssのhoverではドラッグ中のマウスは感知できない。
こんなときは、javascriptのdrag~イベントを使うしかないみたい。
マウスがホバーなんだからいいじゃん!とは思ったけど、全くの別物のようです。
ちょっと混乱したのでメモ。
ブラウザにファイルをドラッグアンドドロップしてアップロード・・・というものを作っているとき、
指定のゾーンにドラッグしているマウスが移動したら、色を変えるなりしようと思っていたのですが、
実際には、うまく動かない。
ファイルをドロップした後に、hoverとして認識されてしまう。
どうやら、cssのhoverではドラッグ中のマウスは感知できない。
こんなときは、javascriptのdrag~イベントを使うしかないみたい。
マウスがホバーなんだからいいじゃん!とは思ったけど、全くの別物のようです。
ちょっと混乱したのでメモ。
ラベル:
CSV,
javascript,
お仕事メモ
2016年2月1日月曜日
【phpMyAdmin】【excel】csvをインポートすると先頭の文字が消える
東京都○○区・・・というデータをインポートするが、
都○○区となっていて仰天。
エクセルからcsvを書き出し、phpMyAdminにインポートしようとすると、ファイル先頭の2文字が消えることがある。
文字化けとかではなく、文字欠け。ぐぐっても文字化けの問題ばかりひっかかるので、一応メモ。
エクセル → ヘッダ削除 → CSVにエクスポート → テキストエディタでエンコードをUTF-8に変更 → インポート → 文字欠けで死亡!
悪さが起きるのがファイル最初の文字なので、BOMがゴニョゴニョとしているのかもしれないが、
とりあえず、バッドノウハウだけ書いておこう。
エクセル → CSVにエクスポート → テキストエディタでエンコードをUTF-8に変更 → インポート →
インポート時、phpMyAdminの部分インポートというところで
Skip this number of queries (for SQL) or lines (for other formats), starting from the first one:
の値を「1」
とする。最初の一行をヘッダ扱いで無視するよ・・・ということ。これでたぶん問題なし!
根本的に解決してないので、モヤモヤしますが。
都○○区となっていて仰天。
エクセルからcsvを書き出し、phpMyAdminにインポートしようとすると、ファイル先頭の2文字が消えることがある。
文字化けとかではなく、文字欠け。ぐぐっても文字化けの問題ばかりひっかかるので、一応メモ。
エクセル → ヘッダ削除 → CSVにエクスポート → テキストエディタでエンコードをUTF-8に変更 → インポート → 文字欠けで死亡!
悪さが起きるのがファイル最初の文字なので、BOMがゴニョゴニョとしているのかもしれないが、
とりあえず、バッドノウハウだけ書いておこう。
エクセル → CSVにエクスポート → テキストエディタでエンコードをUTF-8に変更 → インポート →
インポート時、phpMyAdminの部分インポートというところで
Skip this number of queries (for SQL) or lines (for other formats), starting from the first one:
の値を「1」
とする。最初の一行をヘッダ扱いで無視するよ・・・ということ。これでたぶん問題なし!
根本的に解決してないので、モヤモヤしますが。
2016年1月27日水曜日
【php】配列をCSVに書き出し&文字コード変換
表題どおり。
配列内の要素を一つ一つshiftjisに変換してから書き込んでいます。
日本語文字コードを一つに統一して欲しいのだけど、血を血で洗う戦争が起きたりするのでしょうか。
$csv = new SplFileObject( "csv.csv", "w" );
foreach ($array_for_csv as $raw_array) {
$encodedarray =array();
foreach ($raw_array as $rawtext) {
$encodedarray[] = mb_convert_encoding($rawtext,'SJIS');
}
$csv->fputcsv($encodedarray);
}
fclose($csv);
配列内の要素を一つ一つshiftjisに変換してから書き込んでいます。
日本語文字コードを一つに統一して欲しいのだけど、血を血で洗う戦争が起きたりするのでしょうか。
$csv = new SplFileObject( "csv.csv", "w" );
foreach ($array_for_csv as $raw_array) {
$encodedarray =array();
foreach ($raw_array as $rawtext) {
$encodedarray[] = mb_convert_encoding($rawtext,'SJIS');
}
$csv->fputcsv($encodedarray);
}
fclose($csv);
2016年1月26日火曜日
【php】【phpexcel】他のシートからデータをコピーする
テンプレートなどを読み込みたいときに。
<?php
require_once './Classes/PHPExcel.php';
require_once './Classes/PHPExcel/IOFactory.php';
$book = new PHPExcel();
$templateExcel = PHPExcel_IOFactory::load(dirname(__FILE__) .'/tmp/template.xlsx');
$sheet = $templateExcel->getSheetByName('template')->copy();
unset($templateExcel);
$sheet->setTitle("hoge");
/*
$sheetの
編集があれば、ここで
*/
$book->addSheet($sheet);
$writer = PHPExcel_IOFactory::createWriter($book, "Excel2007");
$writer->save(dirname(__FILE__) .'/huga.xlsx');
$book->disconnectWorksheets();
unset($book);
<?php
require_once './Classes/PHPExcel.php';
require_once './Classes/PHPExcel/IOFactory.php';
$book = new PHPExcel();
$templateExcel = PHPExcel_IOFactory::load(dirname(__FILE__) .'/tmp/template.xlsx');
$sheet = $templateExcel->getSheetByName('template')->copy();
unset($templateExcel);
$sheet->setTitle("hoge");
/*
$sheetの
編集があれば、ここで
*/
$book->addSheet($sheet);
$writer = PHPExcel_IOFactory::createWriter($book, "Excel2007");
$writer->save(dirname(__FILE__) .'/huga.xlsx');
$book->disconnectWorksheets();
unset($book);
2016年1月20日水曜日
【php】エクセルをコピペして配列に収納
csv経由で一括とかではなく、エクセルの内容をDBなどに入れたい場合、
エクセルの内容を入力フォームにペーストすると、
セルごとにtabで区切られたテキストが表示される。
これをそのままフォームへpostしたと仮定して、受け側のプログラム。
条件として、
○コピペする列の数は決まっている
○最後の列に改行記号が入っていない
とします。
$contents = $_POST["contents"];//これがフォームの内容
$celllength = 10;//一行あたりのセルの数を決めておく
$masterarray =[];//目標となる配列。ここに全て入れたい。
$count =0;
$array = explode("\t", $contents);//とりあえず全てtabで区切る
foreach ($array as $key => $value) {
if($count % ($celllength-1) ==0 &&$count>0)//最後の列は次の行の最初の列とくっついているので、改行記号で分ける。
{
$masterarray[]=explode("\n",$value)[0];
$masterarray[]=explode("\n",$value)[1];
}
else {
$masterarray[]=$value;
}
$count++;
}
if(count($masterarray) > $celllength)
{
array_pop($masterarray);//最後の行の最後の列を二つにしてしまったので、削除しておく
}
if(count($masterarray) % $celllength !=0 )//postされたセルの数が正しいか確認
{
echo "error:セルの数が不正です。エクセルの選択範囲を見直してください。";
die;
}
foreach ($masterarray as $key => $value) {
echo $key.":".$value."\r";//debug
}
後はお好きに。$masterarrayは連想配列にしてあげたほうが使いやすいですね。
エクセルの内容を入力フォームにペーストすると、
セルごとにtabで区切られたテキストが表示される。
これをそのままフォームへpostしたと仮定して、受け側のプログラム。
条件として、
○コピペする列の数は決まっている
○最後の列に改行記号が入っていない
とします。
$contents = $_POST["contents"];//これがフォームの内容
$celllength = 10;//一行あたりのセルの数を決めておく
$masterarray =[];//目標となる配列。ここに全て入れたい。
$count =0;
$array = explode("\t", $contents);//とりあえず全てtabで区切る
foreach ($array as $key => $value) {
if($count % ($celllength-1) ==0 &&$count>0)//最後の列は次の行の最初の列とくっついているので、改行記号で分ける。
{
$masterarray[]=explode("\n",$value)[0];
$masterarray[]=explode("\n",$value)[1];
}
else {
$masterarray[]=$value;
}
$count++;
}
if(count($masterarray) > $celllength)
{
array_pop($masterarray);//最後の行の最後の列を二つにしてしまったので、削除しておく
}
if(count($masterarray) % $celllength !=0 )//postされたセルの数が正しいか確認
{
echo "error:セルの数が不正です。エクセルの選択範囲を見直してください。";
die;
}
foreach ($masterarray as $key => $value) {
echo $key.":".$value."\r";//debug
}
後はお好きに。$masterarrayは連想配列にしてあげたほうが使いやすいですね。
2016年1月18日月曜日
【jquery】複雑な形のテーブル要素の取得
不幸にしてこんなテーブルに遭遇したとする
テーブル内の要素を順番に取得する方法は
$(function() {
$("table tr").each(function() {
$(this).children().each(function () {
alert( $(this).html());
});
});
});
こんなかんじ。では、どんな順番で取得するかというと
このような順番で取得してくれる。
例えば二行目だけ取得しようとすると
$('table tr:nth-child(2)').children().each(function () {
alert( $(this).html());
});
こんなコードになるが、結果は
7,8,9となる。
逆に7,4,8,9と取得したいときが面倒くさそう。
テーブル内の要素を順番に取得する方法は
$(function() {
$("table tr").each(function() {
$(this).children().each(function () {
alert( $(this).html());
});
});
});
こんなかんじ。では、どんな順番で取得するかというと
1 | 2 | 3 | 4 | 5 | 6 |
7 | 8 | 9 | |||
10 | 11 | 12 | 13 | 14 | |
15 | 16 | 17 | 18 | 19 |
このような順番で取得してくれる。
例えば二行目だけ取得しようとすると
$('table tr:nth-child(2)').children().each(function () {
alert( $(this).html());
});
こんなコードになるが、結果は
7,8,9となる。
逆に7,4,8,9と取得したいときが面倒くさそう。
登録:
投稿 (Atom)