ExportOrder2.php 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695
  1. <?php
  2. namespace App\Exports;
  3. use Illuminate\Support\Collection;
  4. use Maatwebsite\Excel\Concerns\FromCollection;
  5. use Maatwebsite\Excel\Concerns\WithCustomValueBinder;
  6. use Maatwebsite\Excel\Concerns\WithEvents; // 自动注册事件监听器
  7. use Maatwebsite\Excel\Concerns\WithHeadings;
  8. use Maatwebsite\Excel\Concerns\WithStrictNullComparison; // 导出 0 原样显示,不为 null
  9. use Maatwebsite\Excel\Events\AfterSheet;
  10. use PhpOffice\PhpSpreadsheet\Cell\Cell;
  11. use PhpOffice\PhpSpreadsheet\Cell\DataType;
  12. use PhpOffice\PhpSpreadsheet\Cell\DefaultValueBinder;
  13. use Maatwebsite\Excel\Concerns\WithTitle;
  14. class ExportOrder2 extends DefaultValueBinder implements WithCustomValueBinder , FromCollection, WithEvents, WithStrictNullComparison,withHeadings,WithTitle
  15. {
  16. public $mergeStart;
  17. public $mergeEnd;
  18. public $mergeTitles;
  19. protected $sheetName; // 存储 Sheet 名字
  20. /**
  21. * @return \Illuminate\Support\Collection
  22. */
  23. public function __construct($data,$type=1,$headers,$sheetName = 'Sheet1')
  24. {
  25. $this->data = $data;
  26. $this->type = $type;
  27. $this->headers = $headers;
  28. $this->sheetName = $sheetName; // 接收参数
  29. }
  30. // 3. 实现接口方法
  31. public function title(): string
  32. {
  33. return $this->sheetName;
  34. }
  35. public function registerEvents(): array
  36. {
  37. //区分不通状态的合同导出,格式不同
  38. $type = $this->type.'_set';
  39. return $this->$type();
  40. }
  41. //数组转集合
  42. public function collection()
  43. {
  44. return new Collection($this->createData());
  45. }
  46. //业务代码
  47. public function createData()
  48. {
  49. $name = $this->type;
  50. $data = $this->export();
  51. return $data;
  52. }
  53. public function bindValue(Cell $cell, $value)
  54. {
  55. // 检查是否需要保留前导零
  56. // if (is_string($value) && ctype_digit($value) && strpos($value, '0') === 0) {
  57. // $cell->setValueExplicit($value, DataType::TYPE_STRING);
  58. // return true;
  59. // }
  60. if (is_numeric($value)) {
  61. $cell->setValueExplicit($value, DataType::TYPE_STRING2);
  62. return true;
  63. }
  64. // else return default behavior
  65. return parent::bindValue($cell, $value);
  66. }
  67. // 自定义表头,需实现withHeadings接口
  68. public function headings(): array
  69. {
  70. return $this->headers;
  71. }
  72. private function export(){
  73. $list = [];
  74. foreach ($this->data as $v){
  75. $list[] = $v;
  76. }
  77. return $list;
  78. }
  79. private function jc_set()
  80. {
  81. return [
  82. AfterSheet::class => function (AfterSheet $event) {
  83. $sheet = $event->sheet->getDelegate();
  84. // 隐藏 C 列
  85. $sheet->getColumnDimension('C')->setVisible(false);
  86. // ==========================
  87. // 固定合并
  88. // ==========================
  89. $sheet->mergeCells('A1:A4'); // 分类
  90. $sheet->mergeCells('B1:B4'); // 项目
  91. $sheet->mergeCells('D1:AL2'); // 各项目利润
  92. // 设置标题
  93. $sheet->setCellValue('A1', '分类');
  94. $sheet->setCellValue('B1', '项目');
  95. $sheet->setCellValue('D1', '各项目利润');
  96. $startIndex = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($this->mergeStart);
  97. $endIndex = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($this->mergeEnd);
  98. $titleIndex = 0;
  99. for ($col = $startIndex; $col <= $endIndex; $col += 2) {
  100. // 当前两列坐标
  101. $col1 = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($col);
  102. $col2 = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($col + 1);
  103. // 合并 3-3 行
  104. $sheet->mergeCells("{$col1}3:{$col2}3");
  105. // 设置内容(外部传入)
  106. $title = $this->mergeTitles[$titleIndex] ?? '';
  107. $sheet->setCellValue("{$col1}3", $title);
  108. // ====================================
  109. // 自动填充 D4/E4、F4/G4…… 当月 / 累计
  110. // ====================================
  111. $sheet->setCellValue("{$col1}4", '当月');
  112. $sheet->setCellValue("{$col2}4", '累计');
  113. $titleIndex++;
  114. }
  115. // ==========================
  116. // A 列合并(分类)
  117. // ==========================
  118. $sheet->mergeCells('A5:A7'); // 收入
  119. $sheet->mergeCells('A8:A26'); // 销售费用
  120. $sheet->setCellValue('A5', '收入');
  121. $sheet->setCellValue('A8', '销售费用');
  122. // ==========================
  123. // B5 - B26 内容填充
  124. // ==========================
  125. $items = [
  126. "收款销售收入",
  127. "成本",
  128. "收款销售毛利",
  129. "结算费用",
  130. "管理费用",
  131. "物流配送",
  132. "合同费",
  133. "账扣费用",
  134. "促销员工资",
  135. "团购及其他返点",
  136. "陈列费",
  137. "客情费",
  138. "赠品费用",
  139. "广告宣传费",
  140. "快递费",
  141. "销售其他费用",
  142. "人员工资",
  143. "员工社保、福利费",
  144. "采购费用(手工)",
  145. "税金(手工)开票收入*1%",
  146. "财务手续费(手工)",
  147. "销售支出小计",
  148. ];
  149. $row = 5;
  150. foreach ($items as $text) {
  151. $sheet->setCellValue("B{$row}", $text);
  152. $row++;
  153. }
  154. // =================================================================
  155. // 样式
  156. // =================================================================
  157. $sheet->getStyle('A1:'.$this->mergeEnd.'200')
  158. ->getAlignment()
  159. ->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER)
  160. ->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER)
  161. ->setWrapText(true);
  162. foreach (range('A', 'Z') as $col) {
  163. $sheet->getColumnDimension($col)->setWidth(12);
  164. }
  165. foreach (range('A', 'I') as $col) {
  166. $sheet->getColumnDimension('A'.$col)->setWidth(12); // AA, AB ...
  167. }
  168. $sheet->getColumnDimension('B')->setWidth(25);
  169. // D5~AC26 填充数据
  170. $startRow = 5;
  171. $endRow = 26;
  172. $startCol = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($this->mergeStart);
  173. $endCol = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($this->mergeEnd);
  174. for ($row = $startRow; $row <= $endRow; $row++) {
  175. $dataRow = $this->data[$row - $startRow] ?? [];
  176. $colIndex = 0;
  177. for ($col = $startCol; $col <= $endCol; $col++) {
  178. $colLetter = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($col);
  179. $value = $dataRow[$colIndex] ?? '';
  180. $sheet->setCellValue($colLetter . $row, $value);
  181. $colIndex++;
  182. }
  183. }
  184. },
  185. ];
  186. }
  187. private function jc2_set()
  188. {
  189. return [
  190. AfterSheet::class => function (AfterSheet $event) {
  191. $sheet = $event->sheet->getDelegate();
  192. // 隐藏 C 列
  193. $sheet->getColumnDimension('C')->setVisible(false);
  194. // ==========================
  195. // 固定合并
  196. // ==========================
  197. $sheet->mergeCells('A1:A4'); // 分类
  198. $sheet->mergeCells('B1:B4'); // 项目
  199. $sheet->mergeCells('D1:K2'); // 通路各业务员利润
  200. // 设置标题
  201. $sheet->setCellValue('A1', '分类');
  202. $sheet->setCellValue('B1', '项目');
  203. $sheet->setCellValue('D1', '通路各业务员利润');
  204. $startIndex = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($this->mergeStart);
  205. $endIndex = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($this->mergeEnd);
  206. $titleIndex = 0;
  207. for ($col = $startIndex; $col <= $endIndex; $col += 2) {
  208. // 当前两列坐标
  209. $col1 = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($col);
  210. $col2 = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($col + 1);
  211. // 合并 3-3 行
  212. $sheet->mergeCells("{$col1}3:{$col2}3");
  213. // 设置内容(外部传入)
  214. $title = $this->mergeTitles[$titleIndex] ?? '';
  215. $sheet->setCellValue("{$col1}3", $title);
  216. // ====================================
  217. // 自动填充 D4/E4、F4/G4…… 当月 / 累计
  218. // ====================================
  219. $sheet->setCellValue("{$col1}4", '当月');
  220. $sheet->setCellValue("{$col2}4", '累计');
  221. $titleIndex++;
  222. }
  223. // ==========================
  224. // A 列合并(分类)
  225. // ==========================
  226. $sheet->mergeCells('A5:A7'); // 收入
  227. $sheet->mergeCells('A8:A26'); // 销售支出
  228. $sheet->setCellValue('A5', '收入');
  229. $sheet->setCellValue('A8', '销售支出');
  230. // ==========================
  231. // B5 - B26 内容填充
  232. // ==========================
  233. $items = [
  234. "收入",
  235. "成本",
  236. "毛利",
  237. "结算费用(560116)",
  238. "管理费用",
  239. "物流配送",
  240. "合同费(560115)",
  241. "账扣费用(560114)",
  242. "促销员工资(560113)",
  243. "团购及其他返点(560105)",
  244. "陈列费(560120)",
  245. "客情费(560112)",
  246. "赠品费用(560111)",
  247. "广告宣传费(560110)",
  248. "快递费(560109)",
  249. "销售其他费用(560101)",
  250. "员工工资支出(560115)",
  251. "员工社保、福利费(560118)",
  252. "采购费用(手工)(560107)",
  253. "税金(手工)",
  254. "财务手续费(手工)",
  255. "销售支出小计",
  256. ];
  257. $row = 5;
  258. foreach ($items as $text) {
  259. $sheet->setCellValue("B{$row}", $text);
  260. $row++;
  261. }
  262. // =================================================================
  263. // 样式
  264. // =================================================================
  265. $sheet->getStyle('A1:'.$this->mergeEnd.'200')
  266. ->getAlignment()
  267. ->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER)
  268. ->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER)
  269. ->setWrapText(true);
  270. foreach (range('A', 'Z') as $col) {
  271. $sheet->getColumnDimension($col)->setWidth(12);
  272. }
  273. foreach (range('A', 'I') as $col) {
  274. $sheet->getColumnDimension('A'.$col)->setWidth(12); // AA, AB ...
  275. }
  276. $sheet->getColumnDimension('B')->setWidth(25);
  277. // D5~AC26 填充数据
  278. $startRow = 5;
  279. $endRow = 26;
  280. $startCol = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($this->mergeStart);
  281. $endCol = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($this->mergeEnd);
  282. for ($row = $startRow; $row <= $endRow; $row++) {
  283. $dataRow = $this->data[$row - $startRow] ?? [];
  284. $colIndex = 0;
  285. for ($col = $startCol; $col <= $endCol; $col++) {
  286. $colLetter = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($col);
  287. $value = $dataRow[$colIndex] ?? '';
  288. $sheet->setCellValue($colLetter . $row, $value);
  289. $colIndex++;
  290. }
  291. }
  292. },
  293. ];
  294. }
  295. private function jc3_set()
  296. {
  297. return [
  298. AfterSheet::class => function (AfterSheet $event) {
  299. $sheet = $event->sheet->getDelegate();
  300. // ==========================
  301. // 1. 第一行:大标题 (A1:Z2)
  302. // 根据你的要求到 X2,但后面合计到了 Z,这里建议合并到 Z 保持美观
  303. // ==========================
  304. $sheet->mergeCells('A1:Z2');
  305. $sheet->setCellValue('A1', '各业务员利润');
  306. // ==========================
  307. // 2. 第三、四行:固定表头与人员分组
  308. // ==========================
  309. $sheet->mergeCells('A3:A4');
  310. $sheet->setCellValue('A3', '分类');
  311. $sheet->mergeCells('B3:B4');
  312. $sheet->setCellValue('B3', '项目');
  313. // --- C-F: 张春勇、霍尚琳 (4列) ---
  314. $sheet->mergeCells('C3:F3');
  315. $sheet->setCellValue('C3', '张春勇、霍尚琳(社区,通路)');
  316. $sheet->setCellValue('C4', '张春勇当月(社区)');
  317. $sheet->setCellValue('D4', '张春勇、霍尚琳当月(通路)');
  318. $sheet->setCellValue('E4', '合计');
  319. $sheet->setCellValue('F4', '年累计(7月-明年的6月)');
  320. // --- G-J: 金小勇 (4列) ---
  321. $sheet->mergeCells('G3:J3');
  322. $sheet->setCellValue('G3', '金小勇(通路,加盟)');
  323. $sheet->setCellValue('G4', '当月通路');
  324. $sheet->setCellValue('H4', '当月联华加盟');
  325. $sheet->setCellValue('I4', '月合计');
  326. $sheet->setCellValue('J4', '年累计(7月-明年的6月)');
  327. // --- K-N: 沈强 (4列) ---
  328. $sheet->mergeCells('K3:N3');
  329. $sheet->setCellValue('K3', '沈强(通路,智鲸)');
  330. $sheet->setCellValue('K4', '当月通路');
  331. $sheet->setCellValue('L4', '当月智鲸');
  332. $sheet->setCellValue('M4', '月合计');
  333. $sheet->setCellValue('N4', '年累计(7月-明年的6月)');
  334. // --- O-P: 王利英等 (2列) ---
  335. $sheet->mergeCells('O3:P3');
  336. $sheet->setCellValue('O3', '王利英、翁春燕、裴志华(通路加大卖场)');
  337. $sheet->setCellValue('O4', '当月');
  338. $sheet->setCellValue('P4', '年累计(7月-明年的6月)');
  339. // --- Q-T: 叶南汝 (4列) ---
  340. $sheet->mergeCells('Q3:T3');
  341. $sheet->setCellValue('Q3', '叶南汝(通路,大卖场)');
  342. $sheet->setCellValue('Q4', '当月通路');
  343. $sheet->setCellValue('R4', '当月大卖场');
  344. $sheet->setCellValue('S4', '当月合计');
  345. $sheet->setCellValue('T4', '年累计(7月-明年的6月)');
  346. // --- U-V: 行政 (2列) ---
  347. $sheet->mergeCells('U3:V3');
  348. $sheet->setCellValue('U3', '行政');
  349. $sheet->setCellValue('U4', '当月');
  350. $sheet->setCellValue('V4', '年累计(7月-明年的6月)');
  351. // --- W-X: 鲍总 (2列) ---
  352. $sheet->mergeCells('W3:X3');
  353. $sheet->setCellValue('W3', '鲍总');
  354. $sheet->setCellValue('W4', '当月');
  355. $sheet->setCellValue('X4', '年累计(7月-明年的6月)');
  356. // --- Y-Z: 合计 (2列) ---
  357. $sheet->mergeCells('Y3:Z3');
  358. $sheet->setCellValue('Y3', '合计');
  359. $sheet->setCellValue('Y4', '当月');
  360. $sheet->setCellValue('Z4', '年累计(7月-明年的6月)');
  361. // ==========================
  362. // 3. A列与B列内容 (5-32行)
  363. // ==========================
  364. $sheet->mergeCells('A5:A7');
  365. $sheet->setCellValue('A5', '收入');
  366. $sheet->mergeCells('A8:A32');
  367. $sheet->setCellValue('A8', '销售支出');
  368. $items = [
  369. 5 => "收入",
  370. 6 => "成本",
  371. 7 => "毛利",
  372. 8 => "结算费用(560116)",
  373. 9 => "管理费(收入*5%)",
  374. 10 => "物流配送(2.3%)",
  375. 11 => "合同费(560115)",
  376. 12 => "账扣费用(560114)",
  377. 13 => "促销员工资(560113)",
  378. 14 => "团购及其他返点(560105)",
  379. 15 => "陈列费(560120)",
  380. 16 => "客情费(560112)",
  381. 17 => "赠品费用(560111)",
  382. 18 => "广告宣传费(560110)",
  383. 19 => "快递费(560109)",
  384. 20 => "销售其他费用(560101)",
  385. 21 => "员工工资支出(560119)",
  386. 22 => "员工社保、福利费(560118)",
  387. 23 => "退货亏损(不良仓)",
  388. 24 => "采购费用(手工)(按人事计提)",
  389. 25 => "税金(1%)",
  390. 26 => "财务手续费(1%)",
  391. 27 => "其他出库单",
  392. 28 => "其他(1)为后续准备",
  393. 29 => "其他(2)为后续准备",
  394. 30 => "其他(3)为后续准备",
  395. 31 => "其他(4)为后续准备",
  396. 32 => "销售支出小计",
  397. ];
  398. foreach ($items as $rowNum => $text) {
  399. $sheet->setCellValue("B{$rowNum}", $text);
  400. }
  401. // ==========================
  402. // 4. 样式设置
  403. // ==========================
  404. $lastCol = 'Z';
  405. $sheet->getStyle("A1:{$lastCol}32")
  406. ->getAlignment()
  407. ->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER)
  408. ->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER)
  409. ->setWrapText(true);
  410. // 设置列宽
  411. $sheet->getColumnDimension('A')->setWidth(10);
  412. $sheet->getColumnDimension('B')->setWidth(35);
  413. foreach (range('C', $lastCol) as $col) {
  414. $sheet->getColumnDimension($col)->setWidth(16);
  415. }
  416. // ==========================
  417. // 5. 数据填充逻辑 (从C5开始)
  418. // ==========================
  419. // 假设 $this->data 是一个二维数组,每一行代表从 C 列到 Z 列的值
  420. $dataRowIndex = 0;
  421. for ($row = 5; $row <= 32; $row++) {
  422. $rowValues = $this->data[$dataRowIndex] ?? [];
  423. $colIndex = 0;
  424. // 从 C (Index 3) 到 Z (Index 26)
  425. for ($col = 3; $col <= 26; $col++) {
  426. $colLetter = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($col);
  427. $val = $rowValues[$colIndex] ?? '';
  428. $sheet->setCellValue($colLetter . $row, $val);
  429. $colIndex++;
  430. }
  431. $dataRowIndex++;
  432. }
  433. },
  434. ];
  435. }
  436. private function jc4_set()
  437. {
  438. return [
  439. AfterSheet::class => function (AfterSheet $event) {
  440. $sheet = $event->sheet->getDelegate();
  441. // ==========================
  442. // 1. 第一行:大标题 (A1:Z2)
  443. // ==========================
  444. $sheet->mergeCells('A1:AB2');
  445. $sheet->setCellValue('A1', '各项目利润');
  446. // ==========================
  447. // 2. 第三、四行:固定表头与人员分组
  448. // ==========================
  449. $sheet->mergeCells('A3:A4');
  450. $sheet->setCellValue('A3', '分类');
  451. $sheet->mergeCells('B3:B4');
  452. $sheet->setCellValue('B3', '项目');
  453. //大卖场
  454. $sheet->mergeCells('C3:D3');
  455. $sheet->setCellValue('C3', '大卖场');
  456. $sheet->setCellValue('C4', '当月');
  457. $sheet->setCellValue('D4', '年累计(7月-明年的6月)');
  458. //杭州大红鹰超市有限公司
  459. $sheet->mergeCells('E3:F3');
  460. $sheet->setCellValue('E3', '杭州大红鹰超市有限公司');
  461. $sheet->setCellValue('E4', '当月');
  462. $sheet->setCellValue('F4', '年累计(7月-明年的6月)');
  463. // 杭州宏祐贸易有限公司
  464. $sheet->mergeCells('G3:H3');
  465. $sheet->setCellValue('G3', '杭州宏祐贸易有限公司');
  466. $sheet->setCellValue('G4', '当月');
  467. $sheet->setCellValue('H4', '年累计(7月-明年的6月)');
  468. // 联华加盟
  469. $sheet->mergeCells('I3:J3');
  470. $sheet->setCellValue('I3', '联华加盟');
  471. $sheet->setCellValue('I4', '当月');
  472. $sheet->setCellValue('J4', '年累计(7月-明年的6月)');
  473. // 社区
  474. $sheet->mergeCells('K3:L3');
  475. $sheet->setCellValue('K3', '社区');
  476. $sheet->setCellValue('K4', '当月');
  477. $sheet->setCellValue('L4', '年累计(7月-明年的6月)');
  478. // 通路
  479. $sheet->mergeCells('M3:N3');
  480. $sheet->setCellValue('M3', '通路');
  481. $sheet->setCellValue('M4', '当月');
  482. $sheet->setCellValue('N4', '年累计(7月-明年的6月)');
  483. // 浙江汇德隆食品有限公司
  484. $sheet->mergeCells('O3:P3');
  485. $sheet->setCellValue('O3', '浙江汇德隆食品有限公司');
  486. $sheet->setCellValue('O4', '当月');
  487. $sheet->setCellValue('P4', '年累计(7月-明年的6月)');
  488. // 浙江灵峰教育后勤管理有限公司
  489. $sheet->mergeCells('Q3:R3');
  490. $sheet->setCellValue('Q3', '浙江灵峰教育后勤管理有限公司');
  491. $sheet->setCellValue('Q4', '当月');
  492. $sheet->setCellValue('R4', '年累计(7月-明年的6月)');
  493. // 浙江物联电子商务有限公司
  494. $sheet->mergeCells('S3:T3');
  495. $sheet->setCellValue('S3', '浙江物联电子商务有限公司');
  496. $sheet->setCellValue('S4', '当月');
  497. $sheet->setCellValue('T4', '年累计(7月-明年的6月)');
  498. // 浙江新宇贸易有限公司
  499. $sheet->mergeCells('U3:V3');
  500. $sheet->setCellValue('U3', '浙江新宇贸易有限公司');
  501. $sheet->setCellValue('U4', '当月');
  502. $sheet->setCellValue('V4', '年累计(7月-明年的6月)');
  503. // 智鲸
  504. $sheet->mergeCells('W3:X3');
  505. $sheet->setCellValue('W3', '智鲸');
  506. $sheet->setCellValue('W4', '当月');
  507. $sheet->setCellValue('X4', '年累计(7月-明年的6月)');
  508. // 行政
  509. $sheet->mergeCells('Y3:Z3');
  510. $sheet->setCellValue('Y3', '行政');
  511. $sheet->setCellValue('Y4', '当月');
  512. $sheet->setCellValue('Z4', '年累计(7月-明年的6月)');
  513. // 合计
  514. $sheet->mergeCells('AA3:AB3');
  515. $sheet->setCellValue('AA3', '合计');
  516. $sheet->setCellValue('AA4', '当月');
  517. $sheet->setCellValue('AB4', '年累计(7月-明年的6月)');
  518. $sheet->mergeCells('A5:A8');
  519. $sheet->setCellValue('A5', '收入');
  520. $sheet->mergeCells('A9:A33');
  521. $sheet->setCellValue('A9', '销售支出');
  522. $items = [
  523. 5 => "回款销售收入",
  524. 6 => "票扣费用(返利、调整等)",
  525. 7 => "回款业务成本",
  526. 8 => "回款销售毛利",
  527. 9 => "结算费用(560116)",
  528. 10 => "管理费(收入*5%)",
  529. 11 => "物流配送(2.3%)",
  530. 12 => "合同费(560115)",
  531. 13 => "账扣费用(560114)",
  532. 14 => "促销员工资(560113)",
  533. 15 => "团购及其他返点(560105)",
  534. 16 => "陈列费(560120)",
  535. 17 => "客情费(560112)",
  536. 18 => "赠品费用(560111)",
  537. 19 => "广告宣传费(560110)",
  538. 20 => "快递费(560109)",
  539. 21 => "销售其他费用(560101)",
  540. 22 => "员工工资支出(560119)",
  541. 23 => "员工社保、福利费(560118)",
  542. 24 => "退货亏损(不良仓)",
  543. 25 => "采购费用(手工)(按人事计提)",
  544. 26 => "税金(1%)",
  545. 27 => "财务手续费(1%)",
  546. 28 => "其他出库单",
  547. 29 => "其他(1)为后续准备",
  548. 30 => "其他(2)为后续准备",
  549. 31 => "其他(3)为后续准备",
  550. 32 => "其他(4)为后续准备",
  551. 33 => "销售支出小计",
  552. ];
  553. foreach ($items as $rowNum => $text) {
  554. $sheet->setCellValue("B{$rowNum}", $text);
  555. }
  556. // ==========================
  557. // 4. 样式设置
  558. // ==========================
  559. $lastCol = 'AB';
  560. $sheet->getStyle("A1:{$lastCol}33")
  561. ->getAlignment()
  562. ->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER)
  563. ->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER)
  564. ->setWrapText(true);
  565. // 设置列宽
  566. $sheet->getColumnDimension('A')->setWidth(10);
  567. $sheet->getColumnDimension('B')->setWidth(35);
  568. // 使用数字索引循环,从 C (第3列) 到 AB (第28列)
  569. for ($i = 3; $i <= 28; $i++) {
  570. $colLetter = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($i);
  571. $sheet->getColumnDimension($colLetter)->setWidth(16);
  572. }
  573. // ==========================
  574. // 5. 数据填充逻辑 (从C5开始)
  575. // ==========================
  576. if (!empty($this->data)) {
  577. // 彻底废弃 fromArray
  578. foreach ($this->data as $rowNum => $rowValues) {
  579. // 这里的 $rowNum 直接就是 5, 6, ..., 28, 33
  580. // 即使数据里混进了 29-32,我们也再拦截一次
  581. if ($rowNum >= 29 && $rowNum <= 32) {
  582. continue;
  583. }
  584. foreach ($rowValues as $colKey => $val) {
  585. $colNum = $colKey + 3; // C列开始
  586. $colLetter = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($colNum);
  587. $sheet->setCellValue($colLetter . $rowNum, $val);
  588. }
  589. }
  590. }
  591. },
  592. ];
  593. }
  594. }