Browse Source

GO导出换行符,封装json导出service

Zhouzhendong 5 years ago
parent
commit
32512ca87a

+ 1 - 2
app/Http/Controllers/OrderIssueController.php

@@ -512,7 +512,6 @@ class OrderIssueController extends Controller
         foreach ($array as $i => $str) {
 //            $string= preg_replace('/[\s,\,\,]+/','*++*',$str);
 //            $items = explode('*++*',$string);
-//            dd($items,$str);
             $items=[];
             preg_match('/^(\w*?)[\s,,;;]([\x{4e00}-\x{9fa5}]*?)[\s,,;;](.*?)[\s,,;;](\w*?)$/u', $str, $items);
             array_shift($items);
@@ -573,7 +572,7 @@ class OrderIssueController extends Controller
             }
             if(count($map)!==0)$maps[] = $map;
         }
-//        if(count($errors)>0)dd($errors);
+//        if(count($errors)>0)
         if(count($errors)>0) return ['success'=>false,'fail_info'=>$errors];
         try {
             foreach ($maps as $map) {

+ 15 - 2
app/Http/Controllers/TestController.php

@@ -43,6 +43,7 @@ use App\Services\CityService;
 use App\Services\CommodityService;
 use App\Services\common\BatchUpdateService;
 use App\Services\common\DataHandlerService;
+use App\Services\common\ExportService;
 use App\Services\InventoryCompareService;
 use App\Services\LogService;
 use App\Services\OracleActAllocationDetailService;
@@ -71,6 +72,7 @@ use Illuminate\Http\Request;
 use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Http;
 use Illuminate\Support\Facades\Redis;
+use Illuminate\Support\Str;
 use Ramsey\Collection\Collection;
 use Zttp\Zttp;
 
@@ -90,8 +92,19 @@ class TestController extends Controller
     }
 
     public function test4(){
-        dd(Unit::query()->whereIn('name',[])->get());
-
+        $row = [];
+        for ($i=0;$i<50;$i++){
+            $row[] = "表头-".Str::random(5);
+        }
+        $list = [];
+        for ($i=0;$i<3000;$i++){
+            $line = [];
+            for($j=0;$j<50;$j++){
+                $line[] = Str::random(3)."\r\n".Str::random(3);
+            }
+            $list[] = $line;
+        }
+        return app(ExportService::class)->json($row,$list,"测试记录");
     }
 
     public function test2(){

+ 45 - 0
app/Services/common/ExportService.php

@@ -0,0 +1,45 @@
+<?php
+
+namespace App\Services\common;
+
+
+
+use Exception;
+use Illuminate\Http\Response;
+use Illuminate\Support\Facades\Http;
+
+Class ExportService
+{
+
+    /**
+     * @param array $row            表头 一维数组
+     * @param array $list           表体 二维数组
+     * @param string $fileName      导出Excel文件名
+     * @param string $createFormat  导出数据格式化方式,默认非格式化
+     * @param array $mergeColumn    需要合并时 合并列 一维数组
+     * @param array $mergeRow       需要合并时 合并行 key-val数组 key为合并起点val为终点 例:["1"=>"4"] 第一行到第四行合并为一列
+     * @return Response
+     * @throws Exception            请求接口返回异常
+     */
+    public function json(array $row, array $list, string $fileName = '记录',
+                         string $createFormat = null, array $mergeColumn = [], array $mergeRow = []) :Response
+    {
+        $request['type'] = 'base';
+        $data = ['row'=>$row,'list'=>$list];
+        if ($createFormat){
+            $data["mergeColumn"] = $mergeColumn;
+            $data["mergeRow"] = $mergeRow;
+            $request["createFormat"] = "merge";
+        }
+        $request["data"] = json_encode($data,JSON_UNESCAPED_UNICODE);
+        $post=Http::post(config('go.export.url'),$request);
+
+        if ($post->status() == 500){
+            throw new Exception($post->header("Msg"));
+        }
+        return response($post,200, [
+            "Content-type"=>"application/octet-stream",
+            "Content-Disposition"=>"attachment; filename=".$fileName."-".date('ymdHis').'.xlsx',
+        ]);
+    }
+}

+ 25 - 21
serves/excelExportGo/excel/export.go

@@ -8,44 +8,48 @@ import (
 const SHEET  = "Sheet1"
 
 func CreateFile(row []interface{},list [][]interface{}, mergeRow map[string]string, mergeColumn []string) (excel *excelize.File) {
+    /* 生成文件 */
 	file := excelize.NewFile()
 	streamWriter, err := file.NewStreamWriter(SHEET)
 	if err != nil {
-		utilities.WriteLog("/excel/export.go:14   文件生成失败!","ERROR")
+		utilities.WriteLog("/excel/export.go:15   文件生成失败!","ERROR")
 	}
-    if mergeRow == nil && mergeColumn != nil {
-        styleID, err := file.NewStyle(&excelize.Style{
-            Alignment: &excelize.Alignment{
-                WrapText: true,
-            },
-        })
-        if err != nil {
-            utilities.WriteLog("/excel/export.go:18  创建换行样式失败!","ERROR")
-        }
-        for i := 0;i<len(mergeColumn); i++ {
-            err = file.SetColStyle(SHEET, mergeColumn[i], styleID)
-            if err != nil {
-                utilities.WriteLog("/excel/export.go:31  “"+mergeColumn[i]+"”设置换行格式失败!","ERROR")
-                return
-            }
-        }
+
+	/* 换行 */
+    styleID, err := file.NewStyle(&excelize.Style{
+        Alignment: &excelize.Alignment{
+            WrapText: true,
+        },
+    })
+    if err != nil {
+        utilities.WriteLog("/excel/export.go:25  创建换行样式失败!","ERROR")
+    }
+    end, _ := excelize.ColumnNumberToName(len(row))
+    err = file.SetColStyle(SHEET, "A:"+end, styleID)
+    if err != nil {
+        utilities.WriteLog("/excel/export.go:30  设置换行格式失败!","ERROR")
+        return
     }
+
+    /* 写入表头 */
 	cell, _ := excelize.CoordinatesToCellName(1, 1)
 	if err := streamWriter.SetRow(cell, row); err != nil {
-		utilities.WriteLog("/excel/export.go:18  写入表头失败!","ERROR")
+		utilities.WriteLog("/excel/export.go:37  写入表头失败!","ERROR")
 	}
+	/* 流式写入数据 */
 	for index := 0; index < len(list); index++ {
 		cell, _ := excelize.CoordinatesToCellName(1, index+2)
 		if err := streamWriter.SetRow(cell, list[index]); err != nil {
-			utilities.WriteLog("/excel/export.go:23  数据写入文件失败!","ERROR")
+			utilities.WriteLog("/excel/export.go:43  数据写入文件失败!","ERROR")
 		}
 	}
+	/* 合并操作 */
 	if mergeRow != nil && mergeColumn != nil {
 		for start,end := range mergeRow {
 			for i := 0;i<len(mergeColumn); i++ {
 				err := file.MergeCell(SHEET,mergeColumn[i]+start,mergeColumn[i]+end)
 				if err != nil {
-					utilities.WriteLog("/excel/export.go:31  合并单元格失败!","ERROR")
+					utilities.WriteLog("/excel/export.go:52  合并单元格失败!","ERROR")
 					return
 				}
 			}
@@ -53,7 +57,7 @@ func CreateFile(row []interface{},list [][]interface{}, mergeRow map[string]stri
 	}
 
 	if err := streamWriter.Flush(); err != nil {
-		utilities.WriteLog("/excel/export.go:39  文件流关闭失败!","ERROR")
+		utilities.WriteLog("/excel/export.go:60  文件流关闭失败!","ERROR")
 	}
 	return file
 }