質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

4183閲覧

phpspreadsheetで出力したエクセルファイルが自動計算しないセルができてしまう件

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/04/06 07:30

編集2020/04/07 00:04

データベース(MariaDB10.3.15)からPHP7+phpSpreadSheet経由でエクセルファイルを出力しています。

データベースやPHPの動作上には何も問題ないのですが、出力されるエクセルファイルに問題が生じています。

雛形となるエクセルファイルに埋め込んだ数式が、一部自動計算されないまま出力されてしまうことです。

実際のファイルをGoogleドライブにアップしましたので、ご確認いただければと存じます。
https://drive.google.com/file/d/1cUmLuBVo8XdSTPpnT5koMnckeKGNW_Rx/view?usp=sharing
パスワードは『tera』です。

ファイルにある「完了度」や「(計算用関数)」や「経費合計」などはきちんと数式に沿った計算をして表示しています。
ところが、「単価」と「金額」のみ、数式に沿って計算されないまま出力されてしまいます。

やってみたこと

  1. 【数式】>【計算方法の設定】>「再計算実行」・「シート再計算」・・・・・変わらず
  2. セルの数式を編集する操作 > 何もせず「ENTER」実行 > 自動再計算?により表示されるようになる
  3. カラム等の削除 > 自動再計算?により表示されるようになる
  4. テンプレートファイルを新規で作成し、計算に必要な最低限の数式を入れて実行・・・・・変わらず
  5. 他のマシンでの確認・・・・・(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に詳しい方、教えていただけますでしょうか。よろしくおねがいします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

いっそのこと、計算もPHP側でされるのが確実と思います。

Excelの式って「Bookのデータが更新(変更)されたとき」に動作するものなので、プログラム上で「そのデータでBookを作成した」だけの状態では働かなかったはずです。
※私も結局PHP側で計算したことがあります

投稿2020/04/06 11:51

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/04/07 00:55 編集

m.ts10806 さん > ありがとうございます。 なるほどですね。更新しないと再計算されないエクセル側の仕様なんですね。 ただし、当方の利用環境では数式の計算結果をPHP側で計算した結果を埋め込む仕様では、後日修正がある際の再計算に対応できなくなると困るため、数式はそのままにしていたいのです。 何らかの更新を加えることで更新(再計算)する工程を追加して対応しようと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問