PHP WordをHTML出力 docx_reader

GitHubのリンク

< コード例 >

docx_reader.phpを配置してincludeで読み込んで使います。


include('./docx_reader.php');


// == リクエストパラメータ == //
$filename = $_POST["filename"] ? $_POST["filename"] : $_GET["filename"];

if (!$filename) {
  $filename = "/path/filename.docx";
}

$doc = new Docx_reader();
$doc->setFile($filename);

if(!$doc->get_errors()) {
    $html = $doc->to_html();
    $plain_text = $doc->to_plain_text();

    echo $html;
} else {
    echo implode(', ',$doc->get_errors());
}
echo "\n";

PHP ExcelをHTML出力 excel2html

GitHubのリンク

< インストール >

composer でインストールします。

[????@????]# composer require tomk79/php-excel2html
Cannot load Zend OPcache - it was already loaded
No composer.json in current directory, do you want to use the one at /home/ApacheDoc/invfiles? [Y,n]? n
Do not run Composer as root/super user! See https://getcomposer.org/root for details
Continue as root/super user [yes]? y
Info from https://repo.packagist.org: #StandWithUkraine
./composer.json has been created
Running composer update tomk79/php-excel2html
Loading composer repositories with package information
Updating dependencies
Lock file operations: 14 installs, 0 updates, 0 removals
  - Locking ezyang/htmlpurifier (v4.16.0)
  - Locking maennchen/zipstream-php (2.1.0)
  - Locking markbaker/complex (3.0.2)
  - Locking markbaker/matrix (3.0.1)
  - Locking michelf/php-markdown (1.9.1)
  - Locking myclabs/php-enum (1.8.4)
  - Locking phpoffice/phpspreadsheet (1.25.2)
  - Locking psr/http-client (1.0.2)
  - Locking psr/http-factory (1.0.2)
  - Locking psr/http-message (1.1)
  - Locking psr/simple-cache (1.0.1)
  - Locking symfony/polyfill-mbstring (v1.27.0)
  - Locking tomk79/filesystem (1.2.3)
  - Locking tomk79/php-excel2html (0.1.2)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 14 installs, 0 updates, 0 removals
  - Installing ezyang/htmlpurifier (v4.16.0): Extracting archive
  - Installing symfony/polyfill-mbstring (v1.27.0): Extracting archive
  - Installing psr/http-message (1.1): Extracting archive
  - Installing myclabs/php-enum (1.8.4): Extracting archive
  - Installing maennchen/zipstream-php (2.1.0): Extracting archive
  - Installing markbaker/complex (3.0.2): Extracting archive
  - Installing markbaker/matrix (3.0.1): Extracting archive
  - Installing psr/http-client (1.0.2): Extracting archive
  - Installing psr/http-factory (1.0.2): Extracting archive
  - Installing psr/simple-cache (1.0.1): Extracting archive
  - Installing tomk79/filesystem (1.2.3): Extracting archive
  - Installing phpoffice/phpspreadsheet (1.25.2): Extracting archive
  - Installing michelf/php-markdown (1.9.1): Extracting archive
  - Installing tomk79/php-excel2html (0.1.2): Extracting archive
5 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files
3 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
No security vulnerability advisories found

< コード例 >

<?php

require_once( '../vendor/autoload.php' );

ini_set("memory_limit", "-1");
ini_set('max_execution_time', 180);

// == リクエストパラメータ == //
$filename = $_POST["filename"] ? $_POST["filename"] : $_GET["filename"];

if (!$filename) {
  $filename = "/path/filename.xlsx";
}

$src = (new \tomk79\excel2html\main($filename))->get_html(
        array(
            'renderer' => 'strict',
            'cell_renderer' => 'html',
            'render_cell_width' => true,
            'render_cell_background' => true,
            'render_cell_borders' => true,
            'render_cell_align' => true,
            'render_cell_vertical_align' => true,
        ));

print $src;

< 画面例 >

西原春夫・地震自己責任

『 地震そのものは、人の力では阻止できない。従って、地震に不可避に伴う結果については、だれを非難することもできないだろう。冷たい言葉で言えば、自己責任に帰せられる災害、運命とあきらめなければならない部分が人生にあることは認めざるを得ない。 』

Python 基本メモ メール送信

< コード例 >

## 完了メール配信 ##

TO_ADDRS = ["????????@gmail.com", "???????@?????.co.jp"]


smtp_server = "???????"
port = ??
server = smtplib.SMTP(smtp_server, port)
server.set_debuglevel(True)

message = MIMEMultipart()
message["Subject"] = "@@ タイトル @@"
message["To"] =  ",".join(TO_ADDRS )

message["From"] = "??????"

text = MIMEText("本文")
message.attach(text)

server.send_message(message)
server.quit()

chart.js 再描画でのエラーを回避


ここで教えて頂きました。

< コード例 >

チャートは4個を同時に表示
chart.jsの描画はクラスで行ってます。
4個のチャートオブジェクトは、staticな配列に入れてます。


static charts = [null, null, null, null] 

   // 前回消去 //
    if (typeof PieChart.charts[this.idx] !== 'undefined' &&  PieChart.charts[this.idx] !== null && PieChart.charts[this.idx]) {
      PieChart.charts[this.idx].destroy();
    }


    // == ドーナツチャート描画 == //
    PieChart.charts[this.idx] = new Chart(context, {
      //type: 'doughnut',
      //type: 'pie',
      type: chartType,
      data: {
        labels: labels,
        datasets: [{
            label: name,
            backgroundColor: ["#fa8072", "#00ff7f", "#00bfff", "#a9a9a9", "#f5f5f5", "#a7d4d4", "#E5E100"],
            data: counts
          }]
      },

      // プラグインをセット //
      plugins: [
        ChartDataLabels
      ],

      //color: "#ffffff",
      options: {
        responsive: false,
        maintainAspectRatio: false, // 2回目以降大きくなってしまうのを防止用

        legend: {
          labels: {
            // グローバルプロパティを上書 ?????? no affect //
            fontColor: 'white'
          }
        },

        // データラベルがアフェクトする用 //
        /*toltip: {
         enabled: false
         },*/

        plugins: {

          // データラベルがアフェクトする用 //
          toltip: {
            enabled: false
          },

          title: {
            display: true,
            text: name
          },

          // == データラベルプラグインの設定 == //
          datalabels: {
            color: '#294829',
            font: {
              weight: 'bold',
              size: 10, // <=== 小さ目
            },
            formatter: (value, ctx) => {

              let label = ctx.chart.data.labels[ctx.dataIndex];
              //return label + '\n' + value + '%';
              return label
            }
          }
          // == データラベルプラグインの設定終わり == //

        }
      }
    })

Tabulator カラムのグループヘッダー

 

 

 

ドキュメントはここ

< コード例 >

グループ化したいタイトルのカラムの配列を入れ子にします。


      // == Sizes == //
      {
        title: "Sizes",
        columns: [
          // GB Size //
          {title: 'Size (GB)', field: 'GB_SIZE', width: 50, hozAlign: 'right',
            formatter: function (cell, formatterParams, onRendered) {
              return numeral(cell.getValue()).format("#,###")
            }
          },

          // GB 前日//
          {title: 'Size (GB) P', field: 'GB_SIZE_BF1', width: 50, hozAlign: 'right',
            formatter: function (cell, formatterParams, onRendered) {
              return numeral(cell.getValue()).format("#,###")
            }
          },

          // MB Diff from 1 day before //
          {title: 'DiffS', field: 'DIFF_MB_SIZE', width: 60, hozAlign: 'right',
            formatter: function (cell, formatterParams, onRendered) {
              return numeral(cell.getValue()).format("#,###")
            }
          },
        ]
      },

      // == Counts == //
      {
        title: "Counts",
        columns: [

          // File count //
          {title: 'Count', field: 'CNT_FILE', width: 70, hozAlign: 'right',
            formatter: function (cell, formatterParams, onRendered) {
              return numeral(cell.getValue()).format("#,###")
            }
          },
          // File count previous //
          {title: 'Count P', field: 'CNT_FILE_BF1', width: 70, hozAlign: 'right',
            formatter: function (cell, formatterParams, onRendered) {
              return numeral(cell.getValue()).format("#,###")
            }
          },

          // File count difference from previous date //
          {title: 'DiffC', field: 'DIFF_CNT_FILE', width: 60, hozAlign: 'right',
            formatter: function (cell, formatterParams, onRendered) {
              return numeral(cell.getValue()).format("#,###")
            }
          }
        ]
      },

< 画面例 >