mode_sealaplAction.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482
  1. <?php
  2. require_once "include/PHPExcel.php";
  3. //require_once "include/vendor/phptal/phptal/classes/PHPTAL.php";
  4. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  5. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  6. use PhpOffice\PhpSpreadsheet\Style;
  7. use PhpOffice\PhpWord\PhpWord;
  8. use PhpOffice\PhpWord\IOFactory;
  9. use PhpOffice\PhpWord\Settings;
  10. use PhpOffice\PhpWord\Shared\Converter;
  11. use PhpOffice\PhpWord\Shared\Html;
  12. use PhpOffice\PhpWord\TemplateProcessor;
  13. use PhpOffice\PhpWord\Writer\PDF;
  14. use PhpOffice\PhpWord\SimpleType\Jc;
  15. use PhpOffice\PhpWord\SimpleType\JcTable;
  16. use PhpOffice\PhpSpreadsheet\Writer\Exception as WriterException;
  17. /**
  18. * 印章申请使用
  19. */
  20. class mode_sealaplClassAction extends inputAction{
  21. public function initAction()
  22. {
  23. parent::initAction(); // TODO: Change the autogenerated stub
  24. // $this->export_detail_listAjax();
  25. }
  26. protected function savebefore($table, $arr, $id, $addbo){
  27. }
  28. protected function saveafter($table, $arr, $id, $addbo){
  29. //更新
  30. $mknum = arrvalue($arr, 'mknum');
  31. if(!isempt($mknum)){
  32. $numa = explode(',', $mknum);
  33. $num = $numa[0];
  34. $mid = (int)arrvalue($numa,1);
  35. $flow = m('flow')->initflow($num);
  36. if($num=='officia'){
  37. $flow->update("`yzid`='$id'", "`id`='$mid'");
  38. }
  39. }
  40. }
  41. //获取印章
  42. public function getsealdata()
  43. {
  44. $where= m('admin')->getcompanywhere(1);
  45. $rows = m('seal')->getall('1=1 '.$where.'','`id`as value,`name`,`type`','`sort`');
  46. $aaar = $barr = array();
  47. foreach($rows as $k=>$rs){
  48. $rs['subname'] = $rs['type'];
  49. $rs['padding'] = '40';
  50. $aaar[] = $rs;
  51. }
  52. return array_merge($aaar, $barr);
  53. }
  54. public function getsealdatass()
  55. {
  56. $where= m('admin')->getcompanywhere(1);
  57. $rows = m('seal')->getall('1=1 '.$where.'','`id`as value,`name`,`type`','`sort`,`type`');
  58. $barr = array();
  59. $type = '';
  60. foreach($rows as $k=>$rs){
  61. if($type!=$rs['type'])$barr[] = array('value'=>'','name'=>$rs['type'],'disabled'=>true);
  62. $rs['padding'] = '40';
  63. $barr[] = $rs;
  64. $type = $rs['type'];
  65. }
  66. return $barr;
  67. }
  68. public function getSealListAjax() {
  69. $seal_list = m("seal")->getall("1=1", "id, name");
  70. array_unshift($seal_list, ["id"=>"0","name"=>"全部"]);
  71. $this->returnjson($seal_list);
  72. }
  73. /**
  74. * @throws PHPExcel_Exception
  75. * @throws PHPExcel_Writer_Exception
  76. * @throws PHPExcel_Reader_Exception
  77. * @throws \PhpOffice\PhpSpreadsheet\Exception
  78. */
  79. public function export_listAjax() {
  80. $startDate = $this->post("start_date");
  81. $stopDate = $this->post("stop_date");
  82. $status = $this->post("status");
  83. $export_type = $this->post("export_type");
  84. $whereArr = [
  85. "startDate"=>$startDate,
  86. "stopDate"=>$stopDate,
  87. "status"=>$status,
  88. "export_type"=>$export_type,
  89. ];
  90. $excelTitle = "枣泉煤矿用印登记台账";
  91. $sealArr = m("seal")->getall("1=1", "id, name, specialized");
  92. $sealDic = [];
  93. foreach ($sealArr as $k=>$v) {
  94. $sealDic[$v["id"]] = $v;
  95. }
  96. if (!empty($export_type) && $export_type != 0) {
  97. $excelTitle .= "({$sealDic[$export_type]['name']})";
  98. }
  99. $list = m("sealapl")->getSealaplList($whereArr);
  100. // 创建一个新的PHPExcel对象
  101. # 实例化 Spreadsheet 对象
  102. $spreadsheet = new Spreadsheet();
  103. $spreadsheet->setActiveSheetIndex(0); // 设置活动的工作表
  104. # 获取活动工作薄
  105. $sheet = $spreadsheet->getActiveSheet();
  106. $sheet->mergeCells("A1:P1"); // 水平合并A1单元格
  107. $sheet->setCellValue('A1', $excelTitle); // 设置表头
  108. // 设置样式
  109. // 设置表头和第二行的样式(获取样式及设置方式类似,但类名不同)
  110. $bodersStyle = [
  111. 'borders' => [
  112. 'allBorders' => [
  113. 'borderStyle' => Style\Border::BORDER_THIN,
  114. ],
  115. ]
  116. ];
  117. $styleArray = [
  118. 'borders' => $bodersStyle['borders'],
  119. 'alignment' => [
  120. 'horizontal' => Style\Alignment::HORIZONTAL_CENTER,
  121. 'vertical' => Style\Alignment::VERTICAL_CENTER,
  122. 'wrapText' => true,
  123. ]
  124. ];
  125. $sheet->getStyle('A1:P2')->applyFromArray($styleArray);
  126. $spreadsheet->getActiveSheet()->getRowDimension('1')->setRowHeight(95);
  127. $sheet->getStyle('A1')->getFont()->setBold(false)->setSize(24);
  128. $sheet->getStyle('A2:P2')->getFont()->setBold(true)->setSize(14);
  129. // 设置为字符串格式
  130. $sheet->getStyle('J')->getNumberFormat()->setFormatCode(Style\NumberFormat::FORMAT_TEXT);
  131. // 列宽
  132. $sheet->getColumnDimension('A')->setWidth(13);
  133. $sheet->getColumnDimension('B')->setWidth(7);
  134. $sheet->getColumnDimension('C')->setWidth(47);
  135. $sheet->getColumnDimension('D')->setWidth(18);
  136. $sheet->getColumnDimension('E')->setWidth(10);
  137. $sheet->getColumnDimension('F')->setWidth(12);
  138. $sheet->getColumnDimension('G')->setWidth(8);
  139. $sheet->getColumnDimension('H')->setWidth(11);
  140. $sheet->getColumnDimension('I')->setWidth(12);
  141. $sheet->getColumnDimension('J')->setWidth(11); // 手机号
  142. $sheet->getColumnDimension('K')->setWidth(13);
  143. $sheet->getColumnDimension('L')->setWidth(12);
  144. $sheet->getColumnDimension('M')->setWidth(12);
  145. $sheet->getColumnDimension('N')->setWidth(12);
  146. $sheet->getColumnDimension('O')->setWidth(12);
  147. $sheet->getColumnDimension('P')->setWidth(12);
  148. // 表头
  149. $titleArr = ["时间","年度\n编号","用印事由摘要、\n用印材料明细(全称)","相对方名称","金额、\n工作量","合同号","用印\n数量","申请\n单位\n负责人","经办人","手机号","矿最终审\n批领导","法律事\n务审核\n人","业务\n部门\n审核人","办公室\n审核人","印章\n专管人","备注"];
  150. // 设置列,循环设置表头单元格的值
  151. $column = 'A';
  152. foreach ($titleArr as $title) {
  153. $sheet->setCellValue($column.'2', $title);
  154. $column++;
  155. }
  156. $rowArr = [];
  157. foreach ($list as $key=>$row) {
  158. $num = $row['id'];
  159. $date = $row['applydt'];
  160. $year = date("Y", strtotime($date));
  161. $month = date("m", strtotime($date));
  162. $this_month = date("Y-m", strtotime($date));
  163. $last_month = date("Y-m", strtotime("-1 month", strtotime($date)));
  164. $office_date = date("Y-m-d", strtotime($row['office_date']));
  165. $year_num = $row['year_num'];
  166. $reason = $row['reason'];
  167. $opp_name = $row['opp_name'];
  168. $amount = $row['amount'];
  169. $contract_num = $row['contract_num'];
  170. $use_con = $row['use_con'];
  171. $applicant = $row['applicant'];
  172. $apply_pnum = $row['apply_pnum'];
  173. $advice_level4_leader = $row['advice_level4_leader'];
  174. $advice_level3_leader = $row['advice_level3_leader'];
  175. $advice_level2_leader = $row['advice_level2_leader'];
  176. $advice_level1_leader = $row['advice_level1_leader'];
  177. $notes = $row['notes'];
  178. $seal_name = $row['seal_name'];
  179. $bgr = $sealDic[$seal_name]['specialized'];
  180. $rowArr[] = [
  181. $office_date, // 时间
  182. $year_num, // 年度编号
  183. $reason, // 用印事由摘要、用印材料明细(全称)
  184. $opp_name, // 相对方名称
  185. $amount, // 金额、工作量
  186. $contract_num, // 合同号
  187. $use_con, // 用印数量
  188. $advice_level1_leader, // 申请单位负责人
  189. $applicant, // 经办人
  190. $apply_pnum, // 手机号
  191. null, // 矿最终审批领导
  192. $advice_level4_leader, // 法律事务审核人
  193. $advice_level1_leader, // 业务部门审核人
  194. $advice_level2_leader, // 办公室审核人
  195. $bgr, // 印章保管业务核实人
  196. $notes // 备注
  197. ];
  198. }
  199. $rowNum = 3;
  200. foreach ($rowArr as $row) {
  201. $column = 'A';
  202. foreach ($row as $key => $value) {
  203. $sheet->setCellValue($column.$rowNum, $value);
  204. $column++;
  205. }
  206. $rowNum++;
  207. }
  208. // 其他表格式设置
  209. $rowCode = 'A3:P'.(count($rowArr)+2);
  210. $sheet->getStyle($rowCode)->applyFromArray($styleArray);
  211. $spreadsheet->getActiveSheet()->getStyle($rowCode)->getFont()->setSize(14);
  212. // 定义保存的文件名和路径
  213. $mkdir = UPDIR.'/logs/'.date('Y-m');
  214. // 已可用中文
  215. // if(!contain(strtolower(PHP_OS),'win')){
  216. // $excelTitle = c('pingyin')->get("枣泉煤矿用印登记台账", 1);//linux要用拼音,不然会乱码
  217. // }
  218. $filename = ''.$excelTitle.'_'.date('Y_m_d_H_i_s').'.xlsx';
  219. $filename = str_replace('/','',$filename);
  220. $savePath = $mkdir.'/'.$filename;
  221. if (!is_dir($mkdir)) {
  222. if (!mkdir($mkdir, 0777, true)) { // recursive=true 自动创建多级目录
  223. die("错误:无法创建目录 " . $mkdir);
  224. }
  225. }
  226. $writer = new Xlsx($spreadsheet);
  227. try {
  228. $writer->save($savePath);
  229. } catch (WriterException $e) {
  230. die("保存失败: " . $e->getMessage());
  231. }
  232. $this->returnjson(array(
  233. 'url' => $savePath,
  234. 'totalCount'=> count($list),
  235. 'downCount' => count($list),
  236. ));
  237. }
  238. public function export_detail_listAjax() {
  239. // 获取 POST 数据
  240. $startDate = $this->post("start_date");
  241. $stopDate = $this->post("stop_date");
  242. $status = $this->post("status");
  243. $export_type = $this->post("export_type");
  244. $whereArr = [
  245. "startDate"=>$startDate,
  246. "stopDate"=>$stopDate,
  247. "status"=>$status,
  248. "export_type"=>$export_type,
  249. ];
  250. $list = m("sealapl")->getSealaplList($whereArr);
  251. $sealArr = m("seal")->getall("1=1", "id, name, specialized");
  252. $sealDic = [];
  253. foreach ($sealArr as $k => $v) {
  254. $sealDic[$v["id"]] = $v;
  255. }
  256. // 检查模板文件是否存在
  257. $templatePath = 'upload/template/word/template_sealapl_2.docx';
  258. if (!file_exists($templatePath)) {
  259. $this->returnjson(array(
  260. 'error' => 'Template file not found',
  261. 'totalCount' => 0,
  262. 'downCount' => 0
  263. ));
  264. return;
  265. }
  266. // 创建一个新的 PhpWord 对象
  267. $phpWord = new PhpWord();
  268. $section = $phpWord->addSection();
  269. foreach ($list as $row) {
  270. try {
  271. $templateWord = new TemplateProcessor($templatePath);
  272. $num = $row['year_num'];
  273. $applydt = $row['applydt'];
  274. $year = date("Y", strtotime($applydt));
  275. $month = date("m", strtotime($applydt));
  276. $this_month = date("Y-m", strtotime($applydt));
  277. $last_month = date("Y-m", strtotime("-1 month", strtotime($applydt)));
  278. $office_date = date("Y-m-d", strtotime($row['office_date']));
  279. $year_num = $row['year_num'];
  280. $reason = $row['reason'];
  281. $opp_name = $row['opp_name'];
  282. $amount = $row['amount'];
  283. $contract_num = $row['contract_num'];
  284. $use_con = $row['use_con'];
  285. $applicant = $row['applicant'];
  286. $apply_pnum = $row['apply_pnum'];
  287. $advice_level4 = $row['advice_level4'];
  288. $advice_level4_leader = $row['advice_level4_leader'];
  289. $advice_level3_leader = $row['advice_level3_leader'];
  290. $advice_level2 = $row['advice_level2_leader'];
  291. $advice_level2_leader = $row['advice_level2_leader'];
  292. $advice_level1 = $row['advice_level1'];
  293. $advice_level1_leader = $row['advice_level1_leader'];
  294. $notes = $row['notes'];
  295. $seal_name = $row['seal_name'];
  296. // $bgr = $sealDic[$seal_name]['specialized'];
  297. $apply_dept = $row['apply_dept'];
  298. $templateWord->setValues([
  299. "this_month" => $this_month,
  300. "num" => $num,
  301. "apply_dept" => $apply_dept,
  302. "sealname" => $sealDic[$seal_name]['name'],
  303. "applydt" => $applydt,
  304. "opp_name" => $opp_name,
  305. "contract_num" => $contract_num,
  306. "amount" => $amount,
  307. "reason" => $reason,
  308. "advice_level4" => $advice_level4,
  309. "advice_level4_leader" => $advice_level4_leader,
  310. "advice_level1" => $advice_level1,
  311. "advice_level1_leader" => $advice_level1_leader,
  312. "advice_level2" => $advice_level2,
  313. "advice_level2_leader" => $advice_level2_leader,
  314. "applicant" => $applicant,
  315. "apply_pnum" => $apply_pnum,
  316. ]);
  317. // 将模板处理后的内容保存到临时文件
  318. $tempWord = tempnam(sys_get_temp_dir(), 'merged_'). '.docx';
  319. $templateWord->saveAs($tempWord);
  320. // 删除临时文件
  321. unlink($tempWord);
  322. } catch (\Exception $e) {
  323. // 如果出现异常,删除临时文件
  324. if (isset($tempWord) && file_exists($tempWord)) {
  325. unlink($tempWord);
  326. }
  327. if (isset($tempPdf) && file_exists($tempPdf)) {
  328. unlink($tempPdf);
  329. }
  330. $this->returnjson(array(
  331. 'error' => 'An error occurred: '. $e->getMessage(),
  332. 'totalCount' => 0,
  333. 'downCount' => 0
  334. ));
  335. return;
  336. }
  337. }
  338. // 定义保存的文件名和路径
  339. $mkdir = UPDIR.'/logs/'.date('Y-m');
  340. $excelTitle = "枣泉煤矿用印登记台账";
  341. if(!contain(strtolower(PHP_OS),'win')){
  342. $excelTitle = c('pingyin')->get($excelTitle, 1);//linux要用拼音,不然会乱码
  343. }
  344. $filename = ''.$excelTitle.'_'.date('Y_m_d_H_i_s').'.docx';
  345. $filename = str_replace('/','',$filename);
  346. $savePath = $mkdir.'/'.$filename;
  347. // 保存为 Word 文件
  348. $wordWriter = IOFactory::createWriter($phpWord, 'Word2007');
  349. $wordWriter->save($savePath);
  350. $this->returnjson(array(
  351. 'url' => $savePath,
  352. 'totalCount' => count($list),
  353. 'downCount' => count($list),
  354. ));
  355. }
  356. //获取相关信息放到说明里
  357. public function getbinfoAjax()
  358. {
  359. $mknum = $this->get('mknum');
  360. $barr = array();
  361. if(!isempt($mknum)){
  362. $numa = explode(',', $mknum);
  363. $num = $numa[0];
  364. $mid = (int)arrvalue($numa,1);
  365. $flow = m('flow')->initflow($num, $mid, false);
  366. $barr['zhaiyao'] = $flow->getsummary();
  367. }
  368. return $barr;
  369. }
  370. public function sealaplaftershow($table,$rows)
  371. {
  372. $barr['rows'] = $rows;
  373. $barr['atypearr'] = $this->atypearr;
  374. if($this->loadci==1){
  375. $vobj = m('view');
  376. $barr['isadd'] = $vobj->isadd($this->modeid, $this->adminid); //判断是否可添加
  377. $barr['isdaoru'] = $vobj->isdaoru($this->modeid, $this->adminid); //判断是否可导入
  378. $barr['isdaochu'] = $vobj->isdaochu($this->modeid, $this->adminid); //判断是否可导入
  379. // $barr['listinfo'] = m('mode')->createlistpage($this->flow->moders,0,1,$this);
  380. }
  381. $barr['souarr'] = $this->flow->flowsearchfields();
  382. $rows = $this->flow->viewjinfields($rows);//禁看字段处理
  383. $farrl = array();
  384. foreach($this->flow->fieldsarra as $k2=>$rs2){
  385. if($rs2['fieldstype']=='uploadimg')$farrl[$rs2['fields']]=$rs2['fieldstype'];
  386. }
  387. if($rows)foreach($rows as $k1=>$rs1){
  388. foreach($farrl as $fid=>$flx){
  389. if(isset($rs1[$fid])){
  390. $val = $rs1[$fid];
  391. if($flx=='uploadimg'){
  392. $val = $this->rock->gethttppath($val);
  393. $rows[$k1][$fid] = $val;
  394. //if($this->flow->modeid>92)$val='<img src="'.$val.'" height="60">';
  395. }
  396. }
  397. }
  398. }
  399. $barr['modeid'] = $this->modeid;
  400. $barr['loadci'] = $this->loadci;
  401. // $barr['rows'] = $rows;
  402. $scarr = $this->storeafter($table, $rows, $barr);
  403. if(is_array($scarr))foreach($scarr as $k=>$v)$barr[$k]=$v;
  404. return $barr;
  405. }
  406. }