データベース(MariaDB10.3.15)からPHP7+phpSpreadSheet経由でエクセルファイルを出力しています。
データベースやPHPの動作上には何も問題ないのですが、出力されるエクセルファイルに問題が生じています。
雛形となるエクセルファイルに埋め込んだ数式が、一部自動計算されないまま出力されてしまうことです。
実際のファイルをGoogleドライブにアップしましたので、ご確認いただければと存じます。
https://drive.google.com/file/d/1cUmLuBVo8XdSTPpnT5koMnckeKGNW_Rx/view?usp=sharing
パスワードは『tera』です。
ファイルにある「完了度」や「(計算用関数)」や「経費合計」などはきちんと数式に沿った計算をして表示しています。
ところが、「単価」と「金額」のみ、数式に沿って計算されないまま出力されてしまいます。
やってみたこと
- 【数式】>【計算方法の設定】>「再計算実行」・「シート再計算」・・・・・変わらず
- セルの数式を編集する操作 > 何もせず「ENTER」実行 > 自動再計算?により表示されるようになる
- カラム等の削除 > 自動再計算?により表示されるようになる
- テンプレートファイルを新規で作成し、計算に必要な最低限の数式を入れて実行・・・・・変わらず
- 他のマシンでの確認・・・・・(excel2010)NG / (excel2013)NG / (excel2019)OK
一番の可能性として、雛形となっているエクセルファイルのテンプレートの「書式」かなにかが悪さをしていて、今回のような状態になっている可能性も否定できませんが、異なるテンプレートで同様の抽出を行っても、全ておなじように「単価」と「金額」の部分が自動計算されないため、書式の問題では無いのかと考えています。
それならば、phpSpreadSheetを用いて数式を埋め込むことができれば、解決できるのかもしれないと考えています。
実際のコードは下記の通りとなっています。
php
1 try { 2 // DB接続時にfetchモードを指定 3 $pdo = new PDO('mysql:host=localhost;dbname=stocker_a120_flow;charset=utf8', 'root', '', 4 [PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC]); 5 6 foreach ($pdo->query("SELECT 7 8 `cnum_`, `cname`, `pnum_`, `bnum_`, `inum_`, 9 `dnum_`, `pname`, `psize`, `pmate`, `carea`, 10 `parea`, `pclss`, NULL AS `_cmp_`, `_nq__`, `_pq__`, 11 `smmtm`, `smhtm`, `smprm`, NULL AS `_spc_`, NULL AS`_tpc_`, 12 NULL AS `_oth_`, NULL AS `_clc_ `, `ratio`, `_sq__`, `ascls`, 13 `npart`, `pnow_`, `cpnow`, `plast`, `_evq_`, 14 NULL AS `_asm_`, `upric`, `tpric`, `asnum`, `pndst`, 15 `snum_`, `sname`, `gnum_` 16 17 FROM `flow_a120_main_view` 18 ORDER BY `gnum_`, `cnum_`, `pnum_`, `bnum_` 19 20 ") 21 AS $row) { 22 $data[] = $row; 23 24 } 25 } 26 catch (PDOException $e) { 27 header('content-type: text/plain'); 28 die("データベース接続に失敗しました。: " . $e->getMessage() . "\n"); 29 } 30 31 $sheet->fromArray($data, $exception_value, 'A6'); 32 33 $tmpFiles = "./files/" . $fileName; 34 $writer = new XlsxWriter($spreadsheet); 35 $writer->save("$tmpFiles");
上記コードの`_spc_`
と `_tpc_`
の部分に、テンプレートで使用している数式を埋め込むことができれば、解決できるかもしれません。しかし、その方法がわかりません。
phpSpreadSheetに詳しい方、教えていただけますでしょうか。よろしくおねがいします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/04/07 00:55 編集