実現したいこと
以下環境にて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>
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。