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

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

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

PhpSpreadsheetは、PHPExcelの後継であるPHPライブラリです。新規Excelファイルの作成や既存Excelファイルの読み書き、ファイル編集など一連の操作を無償で行うことができます。

PHP

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

Q&A

解決済

1回答

430閲覧

PhpSpreadsheet 棒グラフ作成 作成されたExcelファイルを開くと一部内容に問題あり

akooooo

総合スコア4

PhpSpreadsheet

PhpSpreadsheetは、PHPExcelの後継であるPHPライブラリです。新規Excelファイルの作成や既存Excelファイルの読み書き、ファイル編集など一連の操作を無償で行うことができます。

PHP

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

0グッド

0クリップ

投稿2024/06/19 04:58

編集2024/06/20 00:14

実現したいこと

以下環境にてphpspreadsheetのChart機能を利用し棒グラフを描写しました。
ファイルは作成されましたがファイルを開くと【一部の内容に問題がありました。】と表示されるため
それを表示させないようにしたいのですが、方法が全く分からず質問させていただきました。
"php": "7.4.3"
”phpspreadsheet": "^1.29"

発生している問題・分からないこと

Excelファイルを開く
→【一部の内容に問題がありました。】のExcelのインフォメーションメッセージ
→はいをクリック
→【修復または削除によりファイルを開くことができました】のExcelのインフォメーションメッセージ
→グラフは問題なく表示されている。
「修復されたレコード: /xl/drawings/drawing1.xml パーツ内のスケッチ (図形描画)」

イメージ説明

エラーメッセージ

error

1修復のログファイル内容 2 3<recoveryLog xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"> 4<logFileName>error180240_13.xml</logFileName> 5<summary>ファイル 'C:\Users\XXXX\DownloadsXXXXXXXX.xlsx' にエラーが検出されました</summary> 6<repairedRecords> 7<repairedRecord>修復されたレコード: /xl/drawings/drawing1.xml パーツ内のスケッチ (図形描画)</repairedRecord> 8</repairedRecords> 9</recoveryLog>

該当のソースコード

PHP

1require 'vendor/autoload.php'; 2use PhpOffice\PhpSpreadsheet\Spreadsheet; 3use PhpOffice\PhpSpreadsheet\Writer\Xlsx; 4use PhpOffice\PhpSpreadsheet\Reader\Xlsx as XlsxReader; 5use PhpOffice\PhpSpreadsheet\Chart\Chart; 6use PhpOffice\PhpSpreadsheet\Chart\DataSeries; 7use PhpOffice\PhpSpreadsheet\Chart\DataSeriesValues; 8use PhpOffice\PhpSpreadsheet\Chart\Layout; 9use PhpOffice\PhpSpreadsheet\Chart\Legend; 10use PhpOffice\PhpSpreadsheet\Chart\PlotArea; 11use PhpOffice\PhpSpreadsheet\Chart\Title; 12use PhpOffice\PhpSpreadsheet\IOFactory; 13 14 private function outputExcel3($filePath,$fileName) { 15 // Spreadsheetオブジェクト生成 16 $objSpreadsheet = new Spreadsheet(); 17 // ワークシートオブジェクト取得 18 $objWorksheet = $objSpreadsheet->getActiveSheet(); 19 // チャート用テストデータ生成 20 $objWorksheet->fromArray( 21 array( 22 array('売上', '商品1', '商品2', '商品3'), 23 array( 2016, 12, 18, 15), 24 array( 2017, 15, 19, 10), 25 array( 2018, 21, 23, 20), 26 array( 2019, 18, 14, 12), 27 array( 2020, 20, 21, 23), 28 ) 29 ); 30 31 // 系列ラベルの指定 32 $arrDataSeriesLabels = array( 33 new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$B$1', NULL, 1), //商品1 34 new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$C$1', NULL, 1), //商品2 35 new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$D$1', NULL, 1), //商品3 36 ); 37 // X軸ラベルの指定 38 $arrCategorysDataSeries = array( 39 new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$A$2:$A$6', NULL, 5), //2016 to 2020 40 ); 41 // 描画データの指定 42 $arrDataSeriesValues = array( 43 new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, 'Worksheet!$B$2:$B$6', NULL, 5), //商品1 44 new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, 'Worksheet!$C$2:$C$6', NULL, 5), //商品2 45 new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, 'Worksheet!$D$2:$D$6', NULL, 5), //商品3 46 ); 47 // チャート・データシリーズの生成 48 $objSeries = new DataSeries( 49 DataSeries::TYPE_BARCHART, // plotType 50 // NULL, // plotGrouping(DataSeries::GROUPING_STANDARD) 51 DataSeries::GROUPING_STANDARD, // plotGrouping 52 range(0, count($arrDataSeriesValues) - 1), // plotOrder 53 $arrDataSeriesLabels, // plotLabel 54 $arrCategorysDataSeries, // plotCategory 55 $arrDataSeriesValues // plotValues 56 ); 57 58 // プロットエリアにチャート・データシリーズに設定 59 $objPlotArea = new PlotArea(NULL, array($objSeries)); 60 // レジェンド生成(各折れ線の説明を行う) 61 $objLegend = new Legend(Legend::POSITION_TOPRIGHT, NULL, false); 62 // チャート・タイトル生成 63 $objTitle = new Title('売上データ:Bar Chart'); 64 // チャート生成 65 $objChart = new Chart( 66 'chart1', // name 67 $objTitle, // title 68 $objLegend, // legend 69 $objPlotArea, // plotArea 70 TRUE, // plotVisibleOnly 71 0, // displayBlanksAs 72 NULL, // xAxisLabel 73 NULL // yAxisLabel 74 ); 75 // ワークシート内のチャート位置設定 76 $objChart->setTopLeftPosition('A8'); // 左上 77 $objChart->setBottomRightPosition('G20'); // 右下 78 79 // ワークシートにチャート追加 80 $objWorksheet->addChart($objChart); 81 82 // [test-g-2-1.xlsx]:Excel2007形式で保存する 83 $objWriter = IOFactory::createWriter($objSpreadsheet, 'Xlsx'); 84 $objWriter->setIncludeCharts(TRUE); 85 $objWriter->save($filePath.'/'.$fileName); 86 87 header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;'); 88 header('Content-Disposition: attachment; filename="'.$fileName.'"'); 89 header('Cache-Control: max-age=0'); 90 echo file_get_contents($filePath.'/'.$fileName); 91 }
特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

①グラフではなくpng画像を描写した場合はエラーは発生しませんでした。
②save前にダウンロードを記述する方法が記載されており試してみましたが0バイトのファイルがダウンロードされてしまい、save後にすぐexit;が記述できませんでした。
参考サイト:https://qiita.com/haruna-nagayoshi/items/bccc4b844e909608f514
11. 書き込んだExcelを.xlsxとしてブラウザでダウンロードする

補足

OpenOfficeでファイルオープン特にメッセージが表示されず問題なく開けました。
PCにインストールされたMicrosoft365のExcelに問題があるということでしょうか?
それともphpSpredSeetでグラフありのファイルを作成しMicrosoft365のExcelで開いた場合は必ず一部破損のエラーが発生するのでしょうか?

補正後のxmlファイルを比較したところ、以下が追加されておりました。

<a:ext uri="{FF2B5EF4-FFF2-40B4-BE49-F238E27FC236}">
<a16:creationId xmlns:a16="http://schemas.microsoft.com/office/drawing/2014/main" id="{00000000-0008-0000-0000-000001040000}"/>
</a:ext>
</a:extLst>

<全体>
<xdr:wsDr xmlns:xdr="http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing" xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
xdr:twoCellAnchor
xdr:from
xdr:col0</xdr:col>
xdr:colOff0</xdr:colOff>
xdr:row7</xdr:row>
xdr:rowOff0</xdr:rowOff>
</xdr:from>
xdr:to
xdr:col6</xdr:col>
xdr:colOff95250</xdr:colOff>
xdr:row23</xdr:row>
xdr:rowOff95250</xdr:rowOff>
</xdr:to>
<xdr:graphicFrame macro="">
xdr:nvGraphicFramePr
<xdr:cNvPr id="1025" name="Chart 1">
<a:extLst>
<a:ext uri="{FF2B5EF4-FFF2-40B4-BE49-F238E27FC236}">
<a16:creationId xmlns:a16="http://schemas.microsoft.com/office/drawing/2014/main" id="{00000000-0008-0000-0000-000001040000}"/>
</a:ext>
</a:extLst>
</xdr:cNvPr>
xdr:cNvGraphicFramePr
<a:graphicFrameLocks/>
</xdr:cNvGraphicFramePr>
</xdr:nvGraphicFramePr>
xdr:xfrm
<a:off x="0" y="0"/>
<a:ext cx="0" cy="0"/>
</xdr:xfrm>
<a:graphic>
<a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/chart">
<c:chart xmlns:c="http://schemas.openxmlformats.org/drawingml/2006/chart" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" r:id="rId1"/>
</a:graphicData>
</a:graphic>
</xdr:graphicFrame>
xdr:clientData/
</xdr:twoCellAnchor>
</xdr:wsDr>

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

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

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

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

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

guest

回答1

0

自己解決

drawing1.xmlの以下部分を調査したところoffice365の【DocumentFormat.OpenXml.Linq 名前空間】の説明ページに行きついた。また、office2016以降にてグラフに一意のIDが振られるようになったものとのこと。
やはり、Microsoftの仕様のためソースで回避する方法は無いと判断。Excelを使用せずにPDF変換するなどの対応をするかエラーが出ても気にしない、、、、とすべきか。

<a16:creationId xmlns:a16="http://schemas.microsoft.com/office/drawing/2014/main" id="{257B76A5-862B-1B0D-9B3C-61AA7C4C784A}"/>

参考サイト
https://learn.microsoft.com/ja-jp/dotnet/api/documentformat.openxml.linq?view=openxml-3.0.1

https://stackoverflow.com/questions/78607563/what-does-the-id-of-a16creationid-mean-for-charts-in-openxml

投稿2024/06/20 05:36

akooooo

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.40%

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

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

質問する

関連した質問