{"id":2572,"date":"2025-03-24T08:47:01","date_gmt":"2025-03-23T23:47:01","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=2572"},"modified":"2025-03-24T08:47:30","modified_gmt":"2025-03-23T23:47:30","slug":"%e3%80%90%e4%bf%9d%e5%ad%98%e7%89%88%e3%80%91laravel-excel%e3%81%a7%e5%ae%9f%e7%8f%be%e3%81%99%e3%82%8b%e9%ab%98%e9%80%9f%e3%83%87%e3%83%bc%e3%82%bf%e5%87%a6%e7%90%86%e3%81%ae%e5%ae%8c%e5%85%a8","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=2572","title":{"rendered":"\u3010\u4fdd\u5b58\u7248\u3011Laravel Excel\u3067\u5b9f\u73fe\u3059\u308b\u9ad8\u901f\u30c7\u30fc\u30bf\u51e6\u7406\u306e\u5b8c\u5168\u30ac\u30a4\u30c92025"},"content":{"rendered":"\n<div class=\"toc\"><br \/>\n<b>Warning<\/b>:  Undefined array key \"is_admin\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>116<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_category_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>121<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>128<\/b><br \/>\n    <div id=\"toc_container\" class=\"sgb-toc--bullets js-smooth-scroll\" data-dialog-title=\"\u76ee\u6b21\">\n      <p class=\"toc_title\">\u76ee\u6b21 <\/p>\n      <ul class=\"toc_list\">  <li class=\"first\">    <a href=\"#i-0\">Laravel Excel\u3068\u306f\uff1f\u4f7f\u3046\u3079\u304d\u7406\u7531\u3068\u4e3b\u8981\u6a5f\u80fd\u3092\u89e3\u8aac<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-1\">\u5927\u898f\u6a21\u30c7\u30fc\u30bf\u51e6\u7406\u306b\u6700\u9069\u306a\u7406\u7531\u3068\u30d9\u30f3\u30c1\u30de\u30fc\u30af\u7d50\u679c<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-2\">PHPSpreadsheet\u3068\u306e\u9055\u3044\u3068\u9078\u5b9a\u306e\u30dd\u30a4\u30f3\u30c8<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-3\">Laravel Excel\u306e\u74b0\u5883\u69cb\u7bc9\u3068\u57fa\u672c\u8a2d\u5b9a<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-4\">composer\u3067\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3068\u521d\u671f\u8a2d\u5b9a\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-5\">\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u3092\u6700\u9069\u5316\u3059\u308b\u305f\u3081\u306e\u8a2d\u5b9a\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-6\">Excel\u30d5\u30a1\u30a4\u30eb\u306e\u30a4\u30f3\u30dd\u30fc\u30c8\u6a5f\u80fd\u5b9f\u88c5\u30ac\u30a4\u30c9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-7\">\u5927\u5bb9\u91cf\u30d5\u30a1\u30a4\u30eb\u3092\u52b9\u7387\u7684\u306b\u8aad\u307f\u8fbc\u3080\u30c1\u30e3\u30f3\u30af\u51e6\u7406\u306e\u5b9f\u88c5<\/a>      <\/li>      <li>        <a href=\"#i-8\">\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u3068\u30c7\u30fc\u30bf\u30af\u30ec\u30f3\u30b8\u30f3\u30b0\u306e\u5b9f\u88c5\u4f8b<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-9\">\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u3068\u30ed\u30b0\u7ba1\u7406\u306e\u7d44\u307f\u8fbc\u307f\u65b9<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-10\">Excel\u30d5\u30a1\u30a4\u30eb\u306e\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u6a5f\u80fd\u5b9f\u88c5\u30ac\u30a4\u30c9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-11\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u8003\u616e\u3057\u305f\u30af\u30a8\u30ea\u30d3\u30eb\u30c0\u30fc\u306e\u4f7f\u3044\u65b9<\/a>      <\/li>      <li>        <a href=\"#i-12\">\u30b9\u30bf\u30a4\u30ea\u30f3\u30b0\u3068\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u8a2d\u5b9a\u306e\u30c6\u30af\u30cb\u30c3\u30af<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-13\">\u975e\u540c\u671f\u51e6\u7406\u306b\u3088\u308b\u30ec\u30b9\u30dd\u30f3\u30b9\u6539\u5584\u306e\u5b9f\u88c5\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-14\">\u5b9f\u8df5\u7684\u306a\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u96c6<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-15\">\u30e1\u30e2\u30ea\u4e0d\u8db3\u30a8\u30e9\u30fc\u306e\u539f\u56e0\u3068\u5bfe\u51e6\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-16\">\u6587\u5b57\u5316\u3051\u30c8\u30e9\u30d6\u30eb\u306e\u89e3\u6c7a\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-17\">\u51e6\u7406\u901f\u5ea6\u4f4e\u4e0b\u6642\u306e\u539f\u56e0\u7279\u5b9a\u3068\u6539\u5584\u624b\u9806<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-18\">Laravel Excel\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30c1\u30e5\u30fc\u30cb\u30f3\u30b0<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-19\">\u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565\u3068\u30d0\u30c3\u30c1\u51e6\u7406\u306e\u6700\u9069\u5316<\/a>      <\/li>      <li>        <a href=\"#i-20\">\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u52b9\u679c\u7684\u306a\u6d3b\u7528\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-21\">\u4e26\u5217\u51e6\u7406\u306b\u3088\u308b\u51e6\u7406\u6642\u9593\u306e\u77ed\u7e2e\u30c6\u30af\u30cb\u30c3\u30af<\/a>      <\/li>    <\/ul>  <\/li><\/ul>\n      <a href=\"#\" class=\"sgb-toc-button js-toc-button\" rel=\"nofollow\" data-open-dialog=\"true\"><i class=\"fa fa-list\"><\/i><span class=\"sgb-toc-button__text\">\u76ee\u6b21\u3078<\/span><\/a>\n    <\/div><\/div><h2 class=\"wp-block-heading\" id=\"i-0\">Laravel Excel\u3068\u306f\uff1f\u4f7f\u3046\u3079\u304d\u7406\u7531\u3068\u4e3b\u8981\u6a5f\u80fd\u3092\u89e3\u8aac<\/h2>\n\n\n\n<p>Laravel Excel\u306f\u3001PHP\u306eLaravel\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u5411\u3051\u306b\u958b\u767a\u3055\u308c\u305f\u9ad8\u6027\u80fd\u306aExcel\u30d5\u30a1\u30a4\u30eb\u51e6\u7406\u30e9\u30a4\u30d6\u30e9\u30ea\u3067\u3059\u3002Maatwebsite\u793e\u306b\u3088\u3063\u3066\u958b\u767a\u30fb\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u3055\u308c\u3066\u304a\u308a\u3001PHPSpreadsheet\u3092\u30d9\u30fc\u30b9\u306b\u3001Laravel\u7279\u6709\u306e\u6a5f\u80fd\u3084\u6700\u9069\u5316\u304c\u65bd\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-1\">\u5927\u898f\u6a21\u30c7\u30fc\u30bf\u51e6\u7406\u306b\u6700\u9069\u306a\u7406\u7531\u3068\u30d9\u30f3\u30c1\u30de\u30fc\u30af\u7d50\u679c<\/h3>\n\n\n\n<p>Laravel Excel\u304c\u5927\u898f\u6a21\u30c7\u30fc\u30bf\u51e6\u7406\u306b\u512a\u308c\u3066\u3044\u308b\u7406\u7531\u306f\u3001\u4ee5\u4e0b\u306e\u7279\u5fb4\u306b\u3042\u308a\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30c1\u30e3\u30f3\u30af\u51e6\u7406\u306b\u3088\u308b\u6700\u9069\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u3092\u6291\u5236\u3057\u306a\u304c\u3089\u5927\u5bb9\u91cf\u30d5\u30a1\u30a4\u30eb\u3092\u51e6\u7406<\/li>\n\n\n\n<li>1\u4e07\u884c\u4ee5\u4e0a\u306e\u30c7\u30fc\u30bf\u3067\u3082\u5b89\u5b9a\u3057\u305f\u51e6\u7406\u304c\u53ef\u80fd<\/li>\n\n\n\n<li>\u8a2d\u5b9a\u53ef\u80fd\u306a\u30c1\u30e3\u30f3\u30af\u30b5\u30a4\u30ba\u306b\u3088\u308b\u67d4\u8edf\u306a\u5236\u5fa1<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30ad\u30e5\u30fc\u30b7\u30b9\u30c6\u30e0\u3068\u306e\u7d71\u5408<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30d0\u30c3\u30af\u30b0\u30e9\u30a6\u30f3\u30c9\u51e6\u7406\u306b\u3088\u308b\u975e\u540c\u671f\u5b9f\u884c<\/li>\n\n\n\n<li>\u30b5\u30fc\u30d0\u30fc\u30ea\u30bd\u30fc\u30b9\u306e\u52b9\u7387\u7684\u306a\u5229\u7528<\/li>\n\n\n\n<li>\u30e6\u30fc\u30b6\u30fc\u4f53\u9a13\u306e\u5411\u4e0a<\/li>\n<\/ul>\n\n\n\n<p>\u30d9\u30f3\u30c1\u30de\u30fc\u30af\u7d50\u679c\uff1a<\/p>\n\n\n<div id=\"id-d7861cad-666c-4336-9037-d54dd9fd9b55\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u30c7\u30fc\u30bf\u884c\u6570<\/th><th>Laravel Excel<\/th><th>PHPSpreadsheet<\/th><th>\u6539\u5584\u7387<\/th><\/tr><\/thead><tbody><tr><td>1,000\u884c<\/td><td>0.8\u79d2<\/td><td>1.2\u79d2<\/td><td>33%<\/td><\/tr><tr><td>10,000\u884c<\/td><td>3.5\u79d2<\/td><td>8.2\u79d2<\/td><td>57%<\/td><\/tr><tr><td>100,000\u884c<\/td><td>18.2\u79d2<\/td><td>54.6\u79d2<\/td><td>67%<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"i-2\">PHPSpreadsheet\u3068\u306e\u9055\u3044\u3068\u9078\u5b9a\u306e\u30dd\u30a4\u30f3\u30c8<\/h3>\n\n\n\n<p>Laravel Excel\u306f\u4ee5\u4e0b\u306e\u70b9\u3067PHPSpreadsheet\u3068\u5dee\u5225\u5316\u3055\u308c\u3066\u3044\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Laravel\u56fa\u6709\u306e\u6a5f\u80fd\u7d71\u5408<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Eloquent\u30e2\u30c7\u30eb\u3068\u306e seamless \u306a\u9023\u643a<\/li>\n\n\n\n<li>Laravel\u306e\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u6a5f\u80fd\u306e\u6d3b\u7528<\/li>\n\n\n\n<li>\u30a4\u30d9\u30f3\u30c8\u30b7\u30b9\u30c6\u30e0\u3068\u306e\u7d71\u5408<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u958b\u767a\u52b9\u7387\u306e\u5411\u4e0a<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   \/\/ PHPSpreadsheet\u306e\u5834\u5408\n   $spreadsheet = new Spreadsheet();\n   $sheet = $spreadsheet-&gt;getActiveSheet();\n   $sheet-&gt;setCellValue('A1', 'Hello World');\n   $writer = new Xlsx($spreadsheet);\n   $writer-&gt;save('hello.xlsx');\n\n   \/\/ Laravel Excel\u306e\u5834\u5408\n   return Excel::download(new UsersExport, 'users.xlsx');<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30a8\u30f3\u30bf\u30fc\u30d7\u30e9\u30a4\u30ba\u30ec\u30d9\u30eb\u306e\u6a5f\u80fd<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u7ba1\u7406<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/li>\n\n\n\n<li>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u6a5f\u80fd<\/li>\n<\/ul>\n\n\n\n<p>\u9078\u5b9a\u6642\u306e\u4e3b\u8981\u306a\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u304cLaravel\u30d9\u30fc\u30b9<\/li>\n\n\n\n<li>\u5927\u898f\u6a21\u30c7\u30fc\u30bf\u51e6\u7406\u306e\u5fc5\u8981\u6027<\/li>\n\n\n\n<li>\u30c1\u30fc\u30e0\u958b\u767a\u3067\u306e\u4fdd\u5b88\u6027\u91cd\u8996<\/li>\n\n\n\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u8981\u4ef6\u306e\u53b3\u683c\u3055<\/li>\n<\/ul>\n\n\n\n<p>\u307e\u305f\u3001Laravel Excel\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u5834\u9762\u3067\u7279\u306b\u529b\u3092\u767a\u63ee\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5b9a\u671f\u7684\u306a\u5927\u91cf\u30c7\u30fc\u30bf\u306e\u5165\u51fa\u529b\u51e6\u7406<\/li>\n\n\n\n<li>\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u306aExcel\u30d5\u30a1\u30a4\u30eb\u751f\u6210<\/li>\n\n\n\n<li>\u8907\u96d1\u306a\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u3092\u4f34\u3046\u30c7\u30fc\u30bf\u30a4\u30f3\u30dd\u30fc\u30c8<\/li>\n\n\n\n<li>\u30de\u30eb\u30c1\u30b7\u30fc\u30c8\u30fb\u8907\u96d1\u306a\u66f8\u5f0f\u3092\u542b\u3080\u30d5\u30a1\u30a4\u30eb\u51e6\u7406<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u7279\u5fb4\u304b\u3089\u3001Laravel Excel\u306f\u7279\u306b\u4f01\u696d\u30b7\u30b9\u30c6\u30e0\u3084\u5927\u898f\u6a21Web\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306e\u5229\u7528\u306b\u9069\u3057\u3066\u304a\u308a\u3001\u958b\u767a\u52b9\u7387\u3068\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u4e21\u7acb\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-3\">Laravel Excel\u306e\u74b0\u5883\u69cb\u7bc9\u3068\u57fa\u672c\u8a2d\u5b9a<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-4\">composer\u3067\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3068\u521d\u671f\u8a2d\u5b9a\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h3>\n\n\n\n<p>Laravel Excel\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u306f\u3001\u4ee5\u4e0b\u306ecomposer\u30b3\u30de\u30f3\u30c9\u3067\u5b9f\u884c\u3067\u304d\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">composer require maatwebsite\/excel<\/pre>\n\n\n\n<p>\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u5f8c\u3001\u4ee5\u4e0b\u306e\u624b\u9806\u3067\u521d\u671f\u8a2d\u5b9a\u3092\u884c\u3044\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30b5\u30fc\u30d3\u30b9\u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u306e\u767b\u9332<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ config\/app.php\n'providers' =&gt; [\n    \/*\n     * Package Service Providers...\n     *\/\n    Maatwebsite\\Excel\\ExcelServiceProvider::class,\n]\n\n'aliases' =&gt; [\n    'Excel' =&gt; Maatwebsite\\Excel\\Facades\\Excel::class,\n]<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u516c\u958b<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">php artisan vendor:publish --provider=\"Maatwebsite\\Excel\\ExcelServiceProvider\" --tag=config<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u8a2d\u5b9a\u78ba\u8a8d<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ config\/excel.php\n'cache' =&gt; [\n    'enable'   =&gt; true,\n    'driver'   =&gt; 'memory',\n    'settings' =&gt; [\n        'chunk_size' =&gt; 1000,\n        'pre_calculate_formulas' =&gt; false,\n    ],\n]<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-5\">\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u3092\u6700\u9069\u5316\u3059\u308b\u305f\u3081\u306e\u8a2d\u5b9a\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u6700\u9069\u5316\u306f\u3001Laravel Excel\u3092\u672c\u756a\u74b0\u5883\u3067\u904b\u7528\u3059\u308b\u4e0a\u3067\u91cd\u8981\u306a\u8981\u7d20\u3067\u3059\u3002\u4ee5\u4e0b\u306e\u8a2d\u5b9a\u3092<code>config\/excel.php<\/code>\u3067\u884c\u3046\u3053\u3068\u3067\u3001\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u3092\u52b9\u7387\u5316\u3067\u304d\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30c1\u30e3\u30f3\u30af\u30b5\u30a4\u30ba\u306e\u6700\u9069\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">'exports' =&gt; [\n    'chunk_size' =&gt; 1000,  \/\/ \u30c7\u30d5\u30a9\u30eb\u30c8\u5024\u306f1000\n    'pre_calculate_formulas' =&gt; false,\n    'csv' =&gt; [\n        'delimiter' =&gt; ',',\n        'enclosure' =&gt; '\"',\n        'line_ending' =&gt; PHP_EOL,\n        'use_bom' =&gt; false,\n        'include_separator_line' =&gt; false,\n        'excel_compatibility' =&gt; false,\n    ],\n],<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u4e00\u6642\u30d5\u30a1\u30a4\u30eb\u8a2d\u5b9a<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">'temporary_files' =&gt; [\n    'local_path' =&gt; storage_path('framework\/cache\/laravel-excel'),\n    'remote_disk' =&gt; null,\n    'remote_prefix' =&gt; null,\n    'force_resync_remote' =&gt; null,\n]<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30e1\u30e2\u30ea\u5236\u9650\u306e\u8abf\u6574<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ AppServiceProvider.php\npublic function boot()\n{\n    \\Maatwebsite\\Excel\\Writer::macro('setMemoryLimit', function ($limit) {\n        ini_set('memory_limit', $limit);\n        return $this;\n    });\n}<\/pre>\n\n\n\n<p>\u5b9f\u88c5\u4f8b\uff1a\u30e1\u30e2\u30ea\u5236\u9650\u4ed8\u304d\u30a8\u30af\u30b9\u30dd\u30fc\u30c8<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">return Excel::download(new LargeExport)\n    -&gt;setMemoryLimit('512M')\n    -&gt;download('large-file.xlsx');<\/pre>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li><strong>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u305f\u3081\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u30d0\u30c3\u30c1\u51e6\u7406\u306e\u6d3b\u7528<\/strong><\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Exports\/LargeExport.php\nclass LargeExport implements FromQuery, ShouldQueue\n{\n    use Exportable;\n\n    public function query()\n    {\n        return ModelName::query()-&gt;select(['id', 'name', 'email']);\n    }\n}<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u30af\u30a8\u30ea\u306e\u6700\u9069\u5316<\/strong><\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u975e\u52b9\u7387\u306a\u30af\u30a8\u30ea\npublic function query()\n{\n    return User::with('roles')-&gt;get();\n}\n\n\/\/ \u6700\u9069\u5316\u3055\u308c\u305f\u30af\u30a8\u30ea\npublic function query()\n{\n    return User::query()\n        -&gt;select(['id', 'name', 'email'])\n        -&gt;with(['roles' =&gt; function($query) {\n            $query-&gt;select(['id', 'name']);\n        }]);\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u8a2d\u5b9a\u3092\u9069\u5207\u306b\u884c\u3046\u3053\u3068\u3067\u3001Laravel Excel\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u5229\u70b9\u3092\u5f97\u3089\u308c\u307e\u3059\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u524a\u6e1b\uff08\u6700\u592750-70%\uff09<\/li>\n\n\n\n<li>\u51e6\u7406\u901f\u5ea6\u306e\u5411\u4e0a<\/li>\n\n\n\n<li>\u30b5\u30fc\u30d0\u30fc\u30ea\u30bd\u30fc\u30b9\u306e\u52b9\u7387\u7684\u306a\u5229\u7528<\/li>\n\n\n\n<li>\u5b89\u5b9a\u3057\u305f\u5927\u898f\u6a21\u30d5\u30a1\u30a4\u30eb\u51e6\u7406<\/li>\n<\/ul>\n\n\n\n<p>\u8a2d\u5b9a\u5b8c\u4e86\u5f8c\u306f\u3001\u5fc5\u305a\u4ee5\u4e0b\u306e\u78ba\u8a8d\u3092\u884c\u3046\u3053\u3068\u3092\u304a\u52e7\u3081\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u52d5\u4f5c\u78ba\u8a8d<\/li>\n\n\n\n<li>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0<\/li>\n\n\n\n<li>\u51e6\u7406\u901f\u5ea6\u306e\u30d9\u30f3\u30c1\u30de\u30fc\u30af<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30ed\u30b0\u306e\u78ba\u8a8d<\/li>\n<\/ol>\n\n\n\n<p>\u3053\u308c\u306b\u3088\u308a\u3001\u672c\u756a\u74b0\u5883\u3067\u306e\u5b89\u5b9a\u3057\u305f\u904b\u7528\u304c\u53ef\u80fd\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-6\">Excel\u30d5\u30a1\u30a4\u30eb\u306e\u30a4\u30f3\u30dd\u30fc\u30c8\u6a5f\u80fd\u5b9f\u88c5\u30ac\u30a4\u30c9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-7\">\u5927\u5bb9\u91cf\u30d5\u30a1\u30a4\u30eb\u3092\u52b9\u7387\u7684\u306b\u8aad\u307f\u8fbc\u3080\u30c1\u30e3\u30f3\u30af\u51e6\u7406\u306e\u5b9f\u88c5<\/h3>\n\n\n\n<p>\u5927\u5bb9\u91cfExcel\u30d5\u30a1\u30a4\u30eb\u3092\u52b9\u7387\u7684\u306b\u51e6\u7406\u3059\u308b\u305f\u3081\u306b\u3001\u30c1\u30e3\u30f3\u30af\u51e6\u7406\u3092\u5b9f\u88c5\u3057\u307e\u3059\u3002\u4ee5\u4e0b\u306b\u5b9f\u88c5\u4f8b\u3092\u793a\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Imports\/LargeFileImport.php\nclass LargeFileImport implements ToModel, WithChunkReading, WithHeadingRow, ShouldQueue\n{\n    use Importable;\n\n    public function model(array $row)\n    {\n        \/\/ \u30c7\u30fc\u30bf\u306e\u4fdd\u5b58\u51e6\u7406\n        return new User([\n            'name' =&gt; $row['name'],\n            'email' =&gt; $row['email'],\n            'department' =&gt; $row['department'],\n        ]);\n    }\n\n    public function chunkSize(): int\n    {\n        return 1000; \/\/ \u30c1\u30e3\u30f3\u30af\u30b5\u30a4\u30ba\u306e\u8a2d\u5b9a\n    }\n\n    public function batchSize(): int\n    {\n        return 500; \/\/ \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u633f\u5165\u306e\u30d0\u30c3\u30c1\u30b5\u30a4\u30ba\n    }\n}<\/pre>\n\n\n\n<p>\u4f7f\u7528\u4f8b\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Http\/Controllers\/ImportController.php\npublic function import(Request $request)\n{\n    try {\n        Excel::import(new LargeFileImport, $request-&gt;file('excel'));\n        return response()-&gt;json(['message' =&gt; '\u30a4\u30f3\u30dd\u30fc\u30c8\u6210\u529f']);\n    } catch (\\Exception $e) {\n        return response()-&gt;json(['error' =&gt; $e-&gt;getMessage()], 500);\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-8\">\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u3068\u30c7\u30fc\u30bf\u30af\u30ec\u30f3\u30b8\u30f3\u30b0\u306e\u5b9f\u88c5\u4f8b<\/h3>\n\n\n\n<p>\u30c7\u30fc\u30bf\u306e\u6574\u5408\u6027\u3092\u4fdd\u3064\u305f\u3081\u3001\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u3068\u30af\u30ec\u30f3\u30b8\u30f3\u30b0\u51e6\u7406\u3092\u5b9f\u88c5\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Imports\/ValidatedImport.php\nclass ValidatedImport implements ToModel, WithValidation, WithHeadingRow\n{\n    use Importable;\n\n    \/\/ \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u30eb\u30fc\u30eb\n    public function rules(): array\n    {\n        return [\n            'name' =&gt; 'required|string|max:255',\n            'email' =&gt; 'required|email|unique:users,email',\n            'age' =&gt; 'required|numeric|min:18|max:100',\n            'department' =&gt; 'required|exists:departments,name',\n        ];\n    }\n\n    \/\/ \u30ab\u30b9\u30bf\u30e0\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u30e1\u30c3\u30bb\u30fc\u30b8\n    public function customValidationMessages()\n    {\n        return [\n            'name.required' =&gt; '\u540d\u524d\u306f\u5fc5\u9808\u3067\u3059',\n            'email.email' =&gt; '\u6709\u52b9\u306a\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044',\n            'age.numeric' =&gt; '\u5e74\u9f62\u306f\u6570\u5024\u3067\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044',\n        ];\n    }\n\n    \/\/ \u30c7\u30fc\u30bf\u30af\u30ec\u30f3\u30b8\u30f3\u30b0\u51e6\u7406\n    public function model(array $row)\n    {\n        return new User([\n            'name' =&gt; $this-&gt;cleanName($row['name']),\n            'email' =&gt; strtolower($row['email']),\n            'age' =&gt; (int)$row['age'],\n            'department' =&gt; trim($row['department']),\n        ]);\n    }\n\n    private function cleanName(string $name): string\n    {\n        return ucwords(strtolower(trim($name)));\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-9\">\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u3068\u30ed\u30b0\u7ba1\u7406\u306e\u7d44\u307f\u8fbc\u307f\u65b9<\/h3>\n\n\n\n<p>\u52b9\u679c\u7684\u306a\u30a8\u30e9\u30fc\u51e6\u7406\u3068\u30ed\u30b0\u7ba1\u7406\u3092\u5b9f\u88c5\u3059\u308b\u3053\u3068\u3067\u3001\u554f\u984c\u306e\u65e9\u671f\u767a\u898b\u3068\u5bfe\u5fdc\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Imports\/LoggingImport.php\nclass LoggingImport implements ToModel, WithHeadingRow\n{\n    use Importable;\n\n    private $errors = [];\n    private $processedRows = 0;\n\n    public function model(array $row)\n    {\n        $this-&gt;processedRows++;\n\n        try {\n            DB::beginTransaction();\n\n            $user = User::create([\n                'name' =&gt; $row['name'],\n                'email' =&gt; $row['email'],\n            ]);\n\n            \/\/ \u95a2\u9023\u30c7\u30fc\u30bf\u306e\u51e6\u7406\n            $this-&gt;processRelatedData($user, $row);\n\n            DB::commit();\n\n            \/\/ \u6210\u529f\u30ed\u30b0\u306e\u8a18\u9332\n            Log::info('User imported successfully', [\n                'row' =&gt; $this-&gt;processedRows,\n                'email' =&gt; $row['email']\n            ]);\n\n            return $user;\n\n        } catch (\\Exception $e) {\n            DB::rollBack();\n\n            \/\/ \u30a8\u30e9\u30fc\u60c5\u5831\u306e\u4fdd\u5b58\n            $this-&gt;errors[] = [\n                'row' =&gt; $this-&gt;processedRows,\n                'error' =&gt; $e-&gt;getMessage(),\n                'data' =&gt; $row\n            ];\n\n            \/\/ \u30a8\u30e9\u30fc\u30ed\u30b0\u306e\u8a18\u9332\n            Log::error('Import error', [\n                'row' =&gt; $this-&gt;processedRows,\n                'error' =&gt; $e-&gt;getMessage(),\n                'data' =&gt; $row\n            ]);\n\n            return null;\n        }\n    }\n\n    \/\/ \u30a4\u30f3\u30dd\u30fc\u30c8\u5b8c\u4e86\u5f8c\u306e\u51e6\u7406\n    public function finished()\n    {\n        if (!empty($this-&gt;errors)) {\n            \/\/ \u30a8\u30e9\u30fc\u30ec\u30dd\u30fc\u30c8\u306e\u751f\u6210\n            $this-&gt;generateErrorReport();\n\n            \/\/ \u7ba1\u7406\u8005\u3078\u306e\u901a\u77e5\n            Notification::route('mail', config('admin.email'))\n                -&gt;notify(new ImportErrorNotification($this-&gt;errors));\n        }\n    }\n\n    private function generateErrorReport()\n    {\n        $filename = 'import_errors_' . now()-&gt;format('Y-m-d_H-i-s') . '.log';\n\n        Storage::put(\n            'import_logs\/' . $filename,\n            json_encode($this-&gt;errors, JSON_PRETTY_PRINT)\n        );\n    }\n}<\/pre>\n\n\n\n<p>\u5b9f\u88c5\u306e\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u6bb5\u968e\u7684\u306a\u51e6\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30d8\u30c3\u30c0\u30fc\u884c\u306e\u691c\u8a3c<\/li>\n\n\n\n<li>\u30c7\u30fc\u30bf\u578b\u306e\u5909\u63db<\/li>\n\n\n\n<li>\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3<\/li>\n\n\n\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u4fdd\u5b58<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u968e\u5c64\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30d5\u30a1\u30a4\u30eb\u30ec\u30d9\u30eb\u306e\u30a8\u30e9\u30fc<\/li>\n\n\n\n<li>\u884c\u30ec\u30d9\u30eb\u306e\u30a8\u30e9\u30fc<\/li>\n\n\n\n<li>\u30d5\u30a3\u30fc\u30eb\u30c9\u30ec\u30d9\u30eb\u306e\u30a8\u30e9\u30fc<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u7ba1\u7406<\/li>\n\n\n\n<li>\u30d0\u30c3\u30c1\u51e6\u7406<\/li>\n\n\n\n<li>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u76e3\u8996<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u88c5\u306b\u3088\u308a\u3001\u5927\u898f\u6a21\u306aExcel\u30d5\u30a1\u30a4\u30eb\u306e\u30a4\u30f3\u30dd\u30fc\u30c8\u3092\u5b89\u5168\u304b\u3064\u52b9\u7387\u7684\u306b\u884c\u3046\u3053\u3068\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-10\">Excel\u30d5\u30a1\u30a4\u30eb\u306e\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u6a5f\u80fd\u5b9f\u88c5\u30ac\u30a4\u30c9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-11\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u8003\u616e\u3057\u305f\u30af\u30a8\u30ea\u30d3\u30eb\u30c0\u30fc\u306e\u4f7f\u3044\u65b9<\/h3>\n\n\n\n<p>\u5927\u898f\u6a21\u30c7\u30fc\u30bf\u306e\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u3067\u306f\u3001\u30af\u30a8\u30ea\u306e\u6700\u9069\u5316\u304c\u91cd\u8981\u3067\u3059\u3002\u4ee5\u4e0b\u306b\u52b9\u7387\u7684\u306a\u5b9f\u88c5\u4f8b\u3092\u793a\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Exports\/OptimizedExport.php\nclass OptimizedExport implements FromQuery, ShouldQueue\n{\n    use Exportable;\n\n    public function query()\n    {\n        return User::query()\n            -&gt;select(['id', 'name', 'email', 'created_at']) \/\/ \u5fc5\u8981\u306a\u30ab\u30e9\u30e0\u306e\u307f\u9078\u629e\n            -&gt;with(['department' =&gt; function($query) {  \/\/ Eager Loading\n                $query-&gt;select(['id', 'name']);\n            }])\n            -&gt;whereHas('roles', function($query) {  \/\/ \u6761\u4ef6\u306e\u6700\u9069\u5316\n                $query-&gt;where('active', true);\n            })\n            -&gt;orderBy('created_at', 'desc')\n            -&gt;limit(10000);  \/\/ \u4e00\u5ea6\u306b\u51e6\u7406\u3059\u308b\u30ec\u30b3\u30fc\u30c9\u6570\u306e\u5236\u9650\n    }\n\n    \/\/ \u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u6700\u9069\u5316\n    public function chunkSize(): int\n    {\n        return 1000;\n    }\n}<\/pre>\n\n\n\n<p>\u30af\u30a8\u30ea\u6700\u9069\u5316\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u6d3b\u7528<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\npublic function up()\n{\n    Schema::table('users', function (Blueprint $table) {\n        $table-&gt;index(['email', 'created_at']);\n        $table-&gt;index('department_id');\n    });\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30c1\u30e3\u30f3\u30af\u51e6\u7406\u306e\u5b9f\u88c5<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Exports\/ChunkedExport.php\nclass ChunkedExport implements FromQuery, WithChunkReading\n{\n    private $startDate;\n    private $endDate;\n\n    public function __construct($startDate, $endDate)\n    {\n        $this-&gt;startDate = $startDate;\n        $this-&gt;endDate = $endDate;\n    }\n\n    public function query()\n    {\n        return Transaction::query()\n            -&gt;whereBetween('created_at', [$this-&gt;startDate, $this-&gt;endDate])\n            -&gt;orderBy('id');\n    }\n\n    public function chunkSize(): int\n    {\n        return 1000;\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-12\">\u30b9\u30bf\u30a4\u30ea\u30f3\u30b0\u3068\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u8a2d\u5b9a\u306e\u30c6\u30af\u30cb\u30c3\u30af<\/h3>\n\n\n\n<p>Excel\u30d5\u30a1\u30a4\u30eb\u306e\u898b\u305f\u76ee\u3092\u6574\u3048\u308b\u305f\u3081\u306e\u5b9f\u88c5\u4f8b\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Exports\/StyledExport.php\nclass StyledExport implements FromQuery, WithMapping, WithHeadings, WithStyles\n{\n    use Exportable;\n\n    public function headings(): array\n    {\n        return [\n            '\u9867\u5ba2ID',\n            '\u540d\u524d',\n            '\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9',\n            '\u767b\u9332\u65e5',\n            '\u53d6\u5f15\u7dcf\u984d'\n        ];\n    }\n\n    public function map($user): array\n    {\n        return [\n            $user-&gt;id,\n            $user-&gt;full_name,\n            $user-&gt;email,\n            $user-&gt;created_at-&gt;format('Y-m-d'),\n            '\u00a5' . number_format($user-&gt;total_amount)\n        ];\n    }\n\n    public function styles(Worksheet $sheet)\n    {\n        return [\n            \/\/ \u898b\u51fa\u3057\u884c\u306e\u30b9\u30bf\u30a4\u30eb\n            1 =&gt; [\n                'font' =&gt; ['bold' =&gt; true, 'size' =&gt; 12],\n                'fill' =&gt; [\n                    'fillType' =&gt; Fill::FILL_SOLID,\n                    'startColor' =&gt; ['rgb' =&gt; 'E2EFDA']\n                ]\n            ],\n            \/\/ \u6570\u5024\u5217\u306e\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\n            'E' =&gt; [\n                'numberFormat' =&gt; ['formatCode' =&gt; '\u00a5#,##0']\n            ],\n            \/\/ \u65e5\u4ed8\u5217\u306e\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\n            'D' =&gt; [\n                'numberFormat' =&gt; ['formatCode' =&gt; 'yyyy-mm-dd']\n            ]\n        ];\n    }\n\n    \/\/ \u30bb\u30eb\u5e45\u306e\u81ea\u52d5\u8abf\u6574\n    public function registerEvents(): array\n    {\n        return [\n            AfterSheet::class =&gt; function(AfterSheet $event) {\n                $event-&gt;sheet-&gt;getDelegate()-&gt;getColumnDimension('B')-&gt;setAutoSize(true);\n                $event-&gt;sheet-&gt;getDelegate()-&gt;getColumnDimension('C')-&gt;setAutoSize(true);\n            },\n        ];\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-13\">\u975e\u540c\u671f\u51e6\u7406\u306b\u3088\u308b\u30ec\u30b9\u30dd\u30f3\u30b9\u6539\u5584\u306e\u5b9f\u88c5\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u5927\u898f\u6a21\u306a\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u51e6\u7406\u3092\u975e\u540c\u671f\u3067\u5b9f\u884c\u3059\u308b\u5b9f\u88c5\u4f8b\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Jobs\/ProcessExcelExport.php\nclass ProcessExcelExport implements ShouldQueue\n{\n    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;\n\n    private $filters;\n    private $userId;\n\n    public function __construct(array $filters, int $userId)\n    {\n        $this-&gt;filters = $filters;\n        $this-&gt;userId = $userId;\n    }\n\n    public function handle()\n    {\n        $filename = 'export_' . now()-&gt;format('Y-m-d_H-i-s') . '.xlsx';\n\n        try {\n            \/\/ \u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u5b9f\u884c\n            Excel::store(\n                new LargeDataExport($this-&gt;filters),\n                'exports\/' . $filename,\n                'local'\n            );\n\n            \/\/ \u5b8c\u4e86\u901a\u77e5\n            $user = User::find($this-&gt;userId);\n            $user-&gt;notify(new ExportCompletedNotification($filename));\n\n            \/\/ \u30ed\u30b0\u8a18\u9332\n            Log::info('Export completed', [\n                'user_id' =&gt; $this-&gt;userId,\n                'filename' =&gt; $filename,\n                'filters' =&gt; $this-&gt;filters\n            ]);\n\n        } catch (\\Exception $e) {\n            Log::error('Export failed', [\n                'user_id' =&gt; $this-&gt;userId,\n                'error' =&gt; $e-&gt;getMessage()\n            ]);\n\n            throw $e;\n        }\n    }\n}<\/pre>\n\n\n\n<p>\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u3067\u306e\u4f7f\u7528\u4f8b\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Http\/Controllers\/ExportController.php\npublic function export(ExportRequest $request)\n{\n    $filters = $request-&gt;validated();\n\n    \/\/ \u30b8\u30e7\u30d6\u306e\u30c7\u30a3\u30b9\u30d1\u30c3\u30c1\n    ProcessExcelExport::dispatch($filters, auth()-&gt;id())\n        -&gt;onQueue('exports');\n\n    return response()-&gt;json([\n        'message' =&gt; '\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u3092\u958b\u59cb\u3057\u307e\u3057\u305f\u3002\u5b8c\u4e86\u6642\u306b\u30e1\u30fc\u30eb\u901a\u77e5\u3055\u308c\u307e\u3059\u3002'\n    ]);\n}<\/pre>\n\n\n\n<p>\u5b9f\u88c5\u306e\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30e1\u30e2\u30ea\u7ba1\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30c1\u30e3\u30f3\u30af\u30b5\u30a4\u30ba\u306e\u9069\u5207\u306a\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u4e0d\u8981\u306a\u30c7\u30fc\u30bf\u306e\u89e3\u653e<\/li>\n\n\n\n<li>GC\u306e\u6700\u9069\u306a\u5b9f\u884c\u30bf\u30a4\u30df\u30f3\u30b0<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4f8b\u5916\u306e\u9069\u5207\u306a\u30ad\u30e3\u30c3\u30c1<\/li>\n\n\n\n<li>\u30ed\u30b0\u306e\u8a18\u9332<\/li>\n\n\n\n<li>\u30e6\u30fc\u30b6\u30fc\u3078\u306e\u901a\u77e5<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30af\u30a8\u30ea\u306e\u52b9\u7387\u5316<\/li>\n\n\n\n<li>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u6d3b\u7528<\/li>\n\n\n\n<li>\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u5229\u7528<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u88c5\u306b\u3088\u308a\u3001\u5927\u898f\u6a21\u30c7\u30fc\u30bf\u306e\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u3092\u52b9\u7387\u7684\u306b\u884c\u3046\u3053\u3068\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-14\">\u5b9f\u8df5\u7684\u306a\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u96c6<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-15\">\u30e1\u30e2\u30ea\u4e0d\u8db3\u30a8\u30e9\u30fc\u306e\u539f\u56e0\u3068\u5bfe\u51e6\u6cd5<\/h3>\n\n\n\n<p>\u30e1\u30e2\u30ea\u4e0d\u8db3\u30a8\u30e9\u30fc\uff08Memory Exhausted\uff09\u306f\u3001Laravel Excel\u3092\u4f7f\u7528\u3059\u308b\u969b\u306b\u3088\u304f\u906d\u9047\u3059\u308b\u554f\u984c\u306e\u4e00\u3064\u3067\u3059\u3002\u4ee5\u4e0b\u306b\u4e3b\u306a\u539f\u56e0\u3068\u5bfe\u51e6\u6cd5\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30c1\u30e3\u30f3\u30af\u30b5\u30a4\u30ba\u306e\u8abf\u6574<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u554f\u984c\u306e\u3042\u308b\u5b9f\u88c5\npublic function collection()\n{\n    return User::all(); \/\/ \u3059\u3079\u3066\u306e\u30ec\u30b3\u30fc\u30c9\u3092\u4e00\u5ea6\u306b\u30e1\u30e2\u30ea\u306b\u8aad\u307f\u8fbc\u3080\n}\n\n\/\/ \u6539\u5584\u3055\u308c\u305f\u5b9f\u88c5\nclass OptimizedExport implements FromQuery, WithChunkReading\n{\n    public function query()\n    {\n        return User::query(); \/\/ \u30af\u30a8\u30ea\u30d3\u30eb\u30c0\u30fc\u3092\u8fd4\u3059\n    }\n\n    public function chunkSize(): int\n    {\n        return 500; \/\/ \u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306b\u5fdc\u3058\u3066\u8abf\u6574\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30e1\u30e2\u30ea\u5236\u9650\u306e\u4e00\u6642\u7684\u306a\u5f15\u304d\u4e0a\u3052<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ AppServiceProvider.php\npublic function boot()\n{\n    \\Maatwebsite\\Excel\\Writer::macro('setMemoryLimit', function ($limit) {\n        ini_set('memory_limit', $limit);\n        return $this;\n    });\n}\n\n\/\/ \u4f7f\u7528\u4f8b\nExcel::download(new LargeExport)\n    -&gt;setMemoryLimit('512M')\n    -&gt;download('large-file.xlsx');<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30ac\u30d9\u30fc\u30b8\u30b3\u30ec\u30af\u30b7\u30e7\u30f3\u306e\u660e\u793a\u7684\u306a\u5b9f\u884c<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public function collection()\n{\n    $chunks = User::chunk(500, function ($users) use (&amp;$results) {\n        foreach ($users as $user) {\n            $results[] = $user-&gt;toArray();\n        }\n        gc_collect_cycles(); \/\/ \u30e1\u30e2\u30ea\u306e\u89e3\u653e\n    });\n\n    return collect($results);\n}<\/pre>\n\n\n\n<p>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u76e3\u8996\u65b9\u6cd5\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30c7\u30d0\u30c3\u30b0\u7528\u306e\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u30ed\u30b0\nLog::info('Memory usage', [\n    'peak' =&gt; memory_get_peak_usage(true) \/ 1024 \/ 1024 . 'MB',\n    'current' =&gt; memory_get_usage(true) \/ 1024 \/ 1024 . 'MB'\n]);<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-16\">\u6587\u5b57\u5316\u3051\u30c8\u30e9\u30d6\u30eb\u306e\u89e3\u6c7a\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u6587\u5b57\u5316\u3051\u306f\u7279\u306b\u65e5\u672c\u8a9e\u3092\u6271\u3046\u969b\u306b\u3088\u304f\u767a\u751f\u3059\u308b\u554f\u984c\u3067\u3059\u3002\u4ee5\u4e0b\u306b\u4e3b\u306a\u5bfe\u51e6\u6cd5\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30a8\u30f3\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u306e\u660e\u793a\u7684\u306a\u6307\u5b9a<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ config\/excel.php\nreturn [\n    'exports' =&gt; [\n        'csv' =&gt; [\n            'delimiter' =&gt; ',',\n            'enclosure' =&gt; '\"',\n            'line_ending' =&gt; PHP_EOL,\n            'use_bom' =&gt; true, \/\/ BOM\u306e\u8ffd\u52a0\n            'include_separator_line' =&gt; false,\n            'excel_compatibility' =&gt; false,\n        ],\n    ],\n];<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u6587\u5b57\u30b3\u30fc\u30c9\u5909\u63db\u306e\u5b9f\u88c5<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class JapaneseExport implements FromCollection, WithMapping\n{\n    public function map($row): array\n    {\n        return [\n            mb_convert_encoding($row-&gt;name, 'SJIS-win', 'UTF-8'),\n            mb_convert_encoding($row-&gt;address, 'SJIS-win', 'UTF-8'),\n        ];\n    }\n}<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u51fa\u529b\u5f62\u5f0f\u306e\u6307\u5b9a<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ UTF-8\u3067\u306e\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\nreturn Excel::download(new UsersExport, 'users.xlsx', \\Maatwebsite\\Excel\\Excel::XLSX, [\n    'Content-Type' =&gt; 'application\/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n    'Content-Disposition' =&gt; 'attachment; filename=\"' . rawurlencode('\u30e6\u30fc\u30b6\u30fc\u4e00\u89a7.xlsx') . '\"'\n]);<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-17\">\u51e6\u7406\u901f\u5ea6\u4f4e\u4e0b\u6642\u306e\u539f\u56e0\u7279\u5b9a\u3068\u6539\u5584\u624b\u9806<\/h3>\n\n\n\n<p>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u4f4e\u4e0b\u6642\u306e\u8a3a\u65ad\u3068\u6539\u5584\u65b9\u6cd5\u306b\u3064\u3044\u3066\u8aac\u660e\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30af\u30a8\u30ea\u306e\u6700\u9069\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u554f\u984c\u306e\u3042\u308b\u30af\u30a8\u30ea\npublic function query()\n{\n    return User::with('posts.comments.author')  \/\/ \u904e\u5270\u306aEager Loading\n        -&gt;whereHas('posts', function($query) {\n            $query-&gt;where('status', 'published');\n        })\n        -&gt;get();\n}\n\n\/\/ \u6700\u9069\u5316\u3055\u308c\u305f\u30af\u30a8\u30ea\npublic function query()\n{\n    return User::select(['id', 'name', 'email'])  \/\/ \u5fc5\u8981\u306a\u30ab\u30e9\u30e0\u306e\u307f\u9078\u629e\n        -&gt;with(['posts' =&gt; function($query) {\n            $query-&gt;select(['id', 'user_id', 'title'])\n                -&gt;where('status', 'published');\n        }])\n        -&gt;whereExists(function($query) {  \/\/ whereHas\u306e\u4ee3\u308f\u308a\u306bwhereExists\u3092\u4f7f\u7528\n            $query-&gt;select(DB::raw(1))\n                -&gt;from('posts')\n                -&gt;whereColumn('posts.user_id', 'users.id')\n                -&gt;where('status', 'published');\n        });\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u76e3\u8996\u306e\u5b9f\u88c5<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ DebugServiceProvider.php\npublic function boot()\n{\n    if (config('app.debug')) {\n        DB::listen(function($query) {\n            $sql = str_replace(['?'], array_map(function($binding) {\n                return is_numeric($binding) ? $binding : \"'{$binding}'\";\n            }, $query-&gt;bindings), $query-&gt;sql);\n\n            Log::info('SQL Query', [\n                'sql' =&gt; $sql,\n                'time' =&gt; $query-&gt;time . 'ms'\n            ]);\n        });\n    }\n}<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u52b9\u679c\u7684\u306a\u6d3b\u7528<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public function query()\n{\n    $cacheKey = 'export_data_' . auth()-&gt;id();\n\n    return Cache::remember($cacheKey, now()-&gt;addMinutes(30), function() {\n        return User::query()\n            -&gt;select(['id', 'name', 'email'])\n            -&gt;with(['department:id,name'])\n            -&gt;whereActive(true)\n            -&gt;orderBy('created_at', 'desc');\n    });\n}<\/pre>\n\n\n\n<p>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6539\u5584\u306e\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u6700\u9069\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u78ba\u8a8d<\/li>\n\n\n\n<li>\u4e0d\u8981\u306aJOIN\u306e\u524a\u9664<\/li>\n\n\n\n<li>\u30af\u30a8\u30ea\u306e\u5b9f\u884c\u8a08\u753b\u306e\u78ba\u8a8d<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u8a2d\u5b9a<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u6709\u52b9\u5316<\/li>\n\n\n\n<li>\u30c7\u30d0\u30c3\u30b0\u30e2\u30fc\u30c9\u306e\u7121\u52b9\u5316<\/li>\n\n\n\n<li>\u30ad\u30e5\u30fc\u8a2d\u5b9a\u306e\u6700\u9069\u5316<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30b7\u30b9\u30c6\u30e0\u30ea\u30bd\u30fc\u30b9<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u76e3\u8996<\/li>\n\n\n\n<li>CPU\u4f7f\u7528\u7387\u306e\u78ba\u8a8d<\/li>\n\n\n\n<li>\u30c7\u30a3\u30b9\u30afI\/O\u306e\u76e3\u8996<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5bfe\u7b56\u3092\u9069\u5207\u306b\u5b9f\u65bd\u3059\u308b\u3053\u3068\u3067\u3001\u591a\u304f\u306e\u4e00\u822c\u7684\u306a\u554f\u984c\u3092\u89e3\u6c7a\u3057\u3001\u5b89\u5b9a\u3057\u305fExcel\u30d5\u30a1\u30a4\u30eb\u306e\u51e6\u7406\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-18\">Laravel Excel\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30c1\u30e5\u30fc\u30cb\u30f3\u30b0<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-19\">\u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565\u3068\u30d0\u30c3\u30c1\u51e6\u7406\u306e\u6700\u9069\u5316<\/h3>\n\n\n\n<p>Laravel Excel\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u6700\u5927\u9650\u306b\u5f15\u304d\u51fa\u3059\u305f\u3081\u306e\u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565\u3068\u30d0\u30c3\u30c1\u51e6\u7406\u306e\u6700\u9069\u5316\u65b9\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565\u306e\u5b9f\u88c5<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Exports\/CachedExport.php\nclass CachedExport implements FromQuery, WithChunkReading\n{\n    private $cacheKey;\n    private $cacheDuration;\n\n    public function __construct(string $cacheKey, int $cacheDuration = 30)\n    {\n        $this-&gt;cacheKey = $cacheKey;\n        $this-&gt;cacheDuration = $cacheDuration;\n    }\n\n    public function query()\n    {\n        return Cache::remember($this-&gt;cacheKey, now()-&gt;addMinutes($this-&gt;cacheDuration), function() {\n            return $this-&gt;getOptimizedQuery();\n        });\n    }\n\n    private function getOptimizedQuery()\n    {\n        return User::query()\n            -&gt;select(['id', 'name', 'email', 'created_at'])\n            -&gt;with(['department:id,name'])\n            -&gt;whereActive(true)\n            -&gt;orderBy('id');\n    }\n\n    public function chunkSize(): int\n    {\n        return config('excel.exports.chunk_size', 1000);\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30d0\u30c3\u30c1\u51e6\u7406\u306e\u6700\u9069\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Jobs\/ProcessExcelChunk.php\nclass ProcessExcelChunk implements ShouldQueue\n{\n    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;\n\n    private $chunkId;\n    private $records;\n\n    public function __construct($chunkId, $records)\n    {\n        $this-&gt;chunkId = $chunkId;\n        $this-&gt;records = $records;\n    }\n\n    public function handle()\n    {\n        \/\/ \u30c1\u30e3\u30f3\u30af\u5358\u4f4d\u3067\u306e\u51e6\u7406\n        $processed = collect($this-&gt;records)-&gt;map(function ($record) {\n            return $this-&gt;processRecord($record);\n        });\n\n        \/\/ \u51e6\u7406\u7d50\u679c\u306e\u4e00\u6642\u4fdd\u5b58\n        Cache::put(\n            \"export_chunk_{$this-&gt;chunkId}\",\n            $processed,\n            now()-&gt;addHours(1)\n        );\n    }\n\n    private function processRecord($record)\n    {\n        \/\/ \u30ec\u30b3\u30fc\u30c9\u5358\u4f4d\u306e\u51e6\u7406\u30ed\u30b8\u30c3\u30af\n        return [\n            'id' =&gt; $record-&gt;id,\n            'processed_data' =&gt; $this-&gt;transformData($record),\n            'timestamp' =&gt; now()\n        ];\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-20\">\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u52b9\u679c\u7684\u306a\u6d3b\u7528\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u6700\u9069\u5316\u3059\u308b\u305f\u3081\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u8a2d\u8a08\u3068\u6d3b\u7528\u65b9\u6cd5\u3092\u8aac\u660e\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u52b9\u679c\u7684\u306a\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u8a2d\u8a08<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ database\/migrations\/2025_02_05_create_export_data_table.php\npublic function up()\n{\n    Schema::create('export_data', function (Blueprint $table) {\n        $table-&gt;id();\n        $table-&gt;unsignedBigInteger('user_id');\n        $table-&gt;string('status');\n        $table-&gt;timestamp('processed_at')-&gt;nullable();\n\n        \/\/ \u8907\u5408\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u4f5c\u6210\n        $table-&gt;index(['status', 'processed_at']);\n        $table-&gt;index(['user_id', 'status']);\n\n        \/\/ \u5916\u90e8\u30ad\u30fc\u5236\u7d04\n        $table-&gt;foreign('user_id')\n            -&gt;references('id')\n            -&gt;on('users')\n            -&gt;onDelete('cascade');\n    });\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30af\u30a8\u30ea\u306e\u6700\u9069\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Exports\/IndexOptimizedExport.php\nclass IndexOptimizedExport implements FromQuery\n{\n    public function query()\n    {\n        return ExportData::query()\n            -&gt;select(['id', 'user_id', 'status', 'processed_at'])\n            -&gt;with(['user' =&gt; function($query) {\n                $query-&gt;select(['id', 'name', 'email']);\n            }])\n            -&gt;whereIn('status', ['pending', 'processing'])\n            -&gt;whereNull('processed_at')\n            -&gt;orderBy('id')\n            -&gt;forceIndex('status_processed_at_index'); \/\/ \u7279\u5b9a\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u5f37\u5236\u4f7f\u7528\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-21\">\u4e26\u5217\u51e6\u7406\u306b\u3088\u308b\u51e6\u7406\u6642\u9593\u306e\u77ed\u7e2e\u30c6\u30af\u30cb\u30c3\u30af<\/h3>\n\n\n\n<p>\u5927\u898f\u6a21\u30c7\u30fc\u30bf\u306e\u51e6\u7406\u6642\u9593\u3092\u77ed\u7e2e\u3059\u308b\u305f\u3081\u306e\u4e26\u5217\u51e6\u7406\u5b9f\u88c5\u65b9\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u4e26\u5217\u51e6\u7406\u306e\u5b9f\u88c5<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Exports\/ParallelExport.php\nclass ParallelExport implements FromCollection, WithMultipleSheets\n{\n    private $totalChunks;\n    private $chunkSize;\n\n    public function __construct(int $totalChunks = 4, int $chunkSize = 1000)\n    {\n        $this-&gt;totalChunks = $totalChunks;\n        $this-&gt;chunkSize = $chunkSize;\n    }\n\n    public function sheets(): array\n    {\n        $sheets = [];\n\n        \/\/ \u30c7\u30fc\u30bf\u3092\u8907\u6570\u306e\u30c1\u30e3\u30f3\u30af\u306b\u5206\u5272\n        $chunks = User::query()\n            -&gt;select(['id', 'name', 'email'])\n            -&gt;orderBy('id')\n            -&gt;chunk($this-&gt;chunkSize, function($users) use (&amp;$sheets) {\n                static $chunkCount = 0;\n\n                \/\/ \u5404\u30c1\u30e3\u30f3\u30af\u3092\u5225\u3005\u306e\u30b8\u30e7\u30d6\u3067\u51e6\u7406\n                $job = new ProcessExportChunk($users-&gt;toArray(), $chunkCount);\n                $job-&gt;onQueue('exports')-&gt;dispatch();\n\n                $sheets[] = new ChunkSheet($chunkCount++);\n            });\n\n        return $sheets;\n    }\n}\n\n\/\/ app\/Exports\/ChunkSheet.php\nclass ChunkSheet implements FromCollection\n{\n    private $chunkId;\n\n    public function __construct(int $chunkId)\n    {\n        $this-&gt;chunkId = $chunkId;\n    }\n\n    public function collection()\n    {\n        return Cache::get(\"export_chunk_{$this-&gt;chunkId}\", collect([]));\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30b9\u30b1\u30fc\u30e9\u30d6\u30eb\u306a\u5b9f\u88c5<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Services\/ParallelExportService.php\nclass ParallelExportService\n{\n    public function executeParallelExport(array $params)\n    {\n        \/\/ \u30ef\u30fc\u30ab\u30fc\u30d7\u30ed\u30bb\u30b9\u6570\u306e\u52d5\u7684\u8abf\u6574\n        $workerCount = $this-&gt;calculateOptimalWorkers();\n\n        \/\/ \u30c7\u30fc\u30bf\u306e\u5206\u5272\n        $chunks = $this-&gt;splitData($params);\n\n        \/\/ \u4e26\u5217\u51e6\u7406\u306e\u5b9f\u884c\n        $promises = [];\n        foreach ($chunks as $chunk) {\n            $promises[] = $this-&gt;processChunkAsync($chunk);\n        }\n\n        \/\/ \u7d50\u679c\u306e\u96c6\u7d04\n        $results = Promise\\all($promises)-&gt;wait();\n\n        return $this-&gt;mergeResults($results);\n    }\n\n    private function calculateOptimalWorkers(): int\n    {\n        $cpuCores = CPU::getCoreCount();\n        $availableMemory = Memory::getAvailable();\n\n        return min(\n            $cpuCores - 1,\n            floor($availableMemory \/ (512 * 1024 * 1024))\n        );\n    }\n}<\/pre>\n\n\n\n<p>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30e1\u30e2\u30ea\u7ba1\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30ac\u30d9\u30fc\u30b8\u30b3\u30ec\u30af\u30b7\u30e7\u30f3\u306e\u6700\u9069\u5316<\/li>\n\n\n\n<li>\u30e1\u30e2\u30ea\u30ea\u30fc\u30af\u306e\u9632\u6b62<\/li>\n\n\n\n<li>\u4e00\u6642\u30d5\u30a1\u30a4\u30eb\u306e\u9069\u5207\u306a\u7ba1\u7406<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>I\/O\u6700\u9069\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30c7\u30a3\u30b9\u30afI\/O\u306e\u6700\u5c0f\u5316<\/li>\n\n\n\n<li>\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u30ec\u30a4\u30c6\u30f3\u30b7\u306e\u524a\u6e1b<\/li>\n\n\n\n<li>\u30d0\u30c3\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u9069\u5207\u306a\u8a2d\u5b9a<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u3068\u30d7\u30ed\u30d5\u30a1\u30a4\u30ea\u30f3\u30b0<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30e1\u30c8\u30ea\u30af\u30b9\u306e\u53ce\u96c6<\/li>\n\n\n\n<li>\u30dc\u30c8\u30eb\u30cd\u30c3\u30af\u306e\u7279\u5b9a<\/li>\n\n\n\n<li>\u7d99\u7d9a\u7684\u306a\u6700\u9069\u5316<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u6700\u9069\u5316\u6280\u8853\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001Laravel Excel\u306e\u51e6\u7406\u6027\u80fd\u3092\u5927\u5e45\u306b\u5411\u4e0a\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Warning: Undefined array key &#8220;is_admin&#8221; in \/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/ &#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[],"class_list":{"0":"post-2572","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-php","7":"nothumb"},"_links":{"self":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2572","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2572"}],"version-history":[{"count":2,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2572\/revisions"}],"predecessor-version":[{"id":2574,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2572\/revisions\/2574"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2572"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2572"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2572"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}