Roc 1 year ago
parent
commit
7b364c88a4
5 changed files with 286 additions and 105 deletions
  1. 10 0
      controllers/data_manage/excel_info.go
  2. 7 7
      go.mod
  3. 38 0
      go.sum
  4. 227 97
      services/excel/excel_to_lucky_sheet.go
  5. 4 1
      services/excel/lucky_sheet.go

+ 10 - 0
controllers/data_manage/excel_info.go

@@ -2107,6 +2107,16 @@ func (c *ExcelInfoController) Copy() {
 //}
 
 //func init() {
+//	startNow := time.Now()
+//	fmt.Println(startNow.Format(utils.FormatDateTime))
+//	startTime := startNow.Unix()
 //	filePath := `static/tmpFile/化工23.05.24.xlsx`
+//	//filePath := `static/tmpFile/1. TAROUND_202308010201.xlsx`
+//	//filePath := `static/tmpFile/1. TAROUND_202308010201-2.xlsx`
+//	//filePath := `static/tmpFile/5. Outage_Values_Daily.xlsx`
+//	//filePath := `static/tmpFile/1. TAROUND_202308010201 - 副本.xlsx`
 //	excel.ConvToLuckySheet(filePath)
+//	cz := time.Now().Unix() - startTime
+//	fmt.Printf("处理完需要的时间:%d秒;约耗时:%d分%d秒", cz, cz/60, cz%60)
+//	fmt.Println()
 //}

+ 7 - 7
go.mod

@@ -28,7 +28,7 @@ require (
 	github.com/tealeg/xlsx v1.0.5
 	github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.541
 	github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ses v1.0.541
-	github.com/xuri/excelize/v2 v2.6.1
+	github.com/xuri/excelize/v2 v2.7.1
 	github.com/yidane/formula v0.0.0-20210902154546-0782e1736717
 	gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
 )
@@ -93,12 +93,12 @@ require (
 	github.com/tidwall/match v1.1.1 // indirect
 	github.com/tidwall/pretty v1.2.0 // indirect
 	github.com/tjfoc/gmsm v1.3.2 // indirect
-	github.com/xuri/efp v0.0.0-20220603152613-6918739fd470 // indirect
-	github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22 // indirect
-	golang.org/x/crypto v0.5.0 // indirect
-	golang.org/x/net v0.5.0 // indirect
-	golang.org/x/sys v0.4.0 // indirect
-	golang.org/x/text v0.6.0 // indirect
+	github.com/xuri/efp v0.0.0-20230802181842-ad255f2331ca // indirect
+	github.com/xuri/nfp v0.0.0-20230819163627-dc951e3ffe1a // indirect
+	golang.org/x/crypto v0.12.0 // indirect
+	golang.org/x/net v0.14.0 // indirect
+	golang.org/x/sys v0.11.0 // indirect
+	golang.org/x/text v0.12.0 // indirect
 	golang.org/x/time v0.0.0-20220609170525-579cf78fd858 // indirect
 	google.golang.org/protobuf v1.28.1 // indirect
 	gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect

+ 38 - 0
go.sum

@@ -536,10 +536,16 @@ github.com/wenzhenxi/gorsa v0.0.0-20210524035706-528c7050d703 h1:Tiqr9EWpYopXZf6
 github.com/wenzhenxi/gorsa v0.0.0-20210524035706-528c7050d703/go.mod h1:nfhBTKji6rC8lrjyikx8NJ85JHg6ZQam0a9Je+2RVOg=
 github.com/xuri/efp v0.0.0-20220603152613-6918739fd470 h1:6932x8ltq1w4utjmfMPVj09jdMlkY0aiA6+Skbtl3/c=
 github.com/xuri/efp v0.0.0-20220603152613-6918739fd470/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI=
+github.com/xuri/efp v0.0.0-20230802181842-ad255f2331ca h1:uvPMDVyP7PXMMioYdyPH+0O+Ta/UO1WFfNYMO3Wz0eg=
+github.com/xuri/efp v0.0.0-20230802181842-ad255f2331ca/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI=
 github.com/xuri/excelize/v2 v2.6.1 h1:ICBdtw803rmhLN3zfvyEGH3cwSmZv+kde7LhTDT659k=
 github.com/xuri/excelize/v2 v2.6.1/go.mod h1:tL+0m6DNwSXj/sILHbQTYsLi9IF4TW59H2EF3Yrx1AU=
+github.com/xuri/excelize/v2 v2.7.1 h1:gm8q0UCAyaTt3MEF5wWMjVdmthm2EHAWesGSKS9tdVI=
+github.com/xuri/excelize/v2 v2.7.1/go.mod h1:qc0+2j4TvAUrBw36ATtcTeC1VCM0fFdAXZOmcF4nTpY=
 github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22 h1:OAmKAfT06//esDdpi/DZ8Qsdt4+M5+ltca05dA5bG2M=
 github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ=
+github.com/xuri/nfp v0.0.0-20230819163627-dc951e3ffe1a h1:Mw2VNrNNNjDtw68VsEj2+st+oCSn4Uz7vZw6TbhcV1o=
+github.com/xuri/nfp v0.0.0-20230819163627-dc951e3ffe1a/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ=
 github.com/yidane/formula v0.0.0-20210902154546-0782e1736717 h1:9CTJJpdISGxMAELfVlprj5kZEsJEaNAWiobv8ZAd72U=
 github.com/yidane/formula v0.0.0-20210902154546-0782e1736717/go.mod h1:9/dQiKiN04yPMdgsuFmKGuI2Hdp6OmFV9gSWS1col6g=
 github.com/ylywyn/jpush-api-go-client v0.0.0-20190906031852-8c4466c6e369 h1:g95WlXTqXFLM36fhvDKcZWHTUnBb2KCEn4tuSizk/d8=
@@ -548,6 +554,7 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
 github.com/yuin/goldmark v1.1.30/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.2.1 h1:ruQGxdhGHe7FWOJPT0mKs5+pD2Xs1Bm/kdGlHO04FmM=
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
 github.com/yuin/gopher-lua v0.0.0-20171031051903-609c9cd26973 h1:iCnkJ/qjKZGdZnlcj1N55AxPDan814kpc3s1cDpQKd8=
 github.com/yuin/gopher-lua v0.0.0-20171031051903-609c9cd26973/go.mod h1:aEV29XrmTYFr3CiRxZeGHpkvbwq+prZduBqMaascyCU=
 github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs=
@@ -574,14 +581,19 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U
 golang.org/x/crypto v0.0.0-20191219195013-becbf705a915/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 golang.org/x/crypto v0.0.0-20220817201139-bc19a97f63c8/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE=
 golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU=
+golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
+golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk=
+golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4 h1:c2HOrn5iMezYjSlGPncknSEr/8x5LELb/ilJbXi9DEA=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/image v0.0.0-20220413100746-70e8d0d3baa9 h1:LRtI4W37N+KFebI/qV0OFiLUv4GLOWeEW5hn/KEJvxE=
 golang.org/x/image v0.0.0-20220413100746-70e8d0d3baa9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
+golang.org/x/image v0.5.0/go.mod h1:FVC7BI/5Ym8R25iw5OLsgshdUBbT1h5jZTpA+mvAdZ4=
 golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
 golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -590,6 +602,8 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl
 golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s=
+golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
+golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -606,14 +620,20 @@ golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/
 golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
 golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
 golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 golang.org/x/net v0.0.0-20220812174116-3211cb980234/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
 golang.org/x/net v0.5.0 h1:GyT4nK/YDHSqa1c4753ouYCDajOYKTja9Xb/OHtgvSw=
 golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws=
+golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
+golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
+golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14=
+golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8=
@@ -625,7 +645,9 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
+golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -649,14 +671,23 @@ golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18=
 golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=
+golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.4.0 h1:O7UWfv5+A2qiuulQk30kVinPoMtoIPeVaKLEgLpVkvg=
+golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
+golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
+golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
@@ -665,6 +696,10 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 golang.org/x/text v0.6.0 h1:3XmdazWV+ubf7QgHSTWeykHOci5oeekaGJBLkrkaw4k=
 golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc=
+golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20220609170525-579cf78fd858 h1:Dpdu/EMxGMFgq0CeYMh4fazTD2vtlZRYE7wyynxJb9U=
@@ -681,6 +716,9 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn
 golang.org/x/tools v0.0.0-20200509030707-2212a7e161a5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU=
+golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
+golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM=
+golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

+ 227 - 97
services/excel/excel_to_lucky_sheet.go

@@ -6,6 +6,8 @@ import (
 	"fmt"
 	"github.com/shopspring/decimal"
 	"github.com/xuri/excelize/v2"
+	"sync"
+	"time"
 )
 
 // ConvToLuckySheet 普通的excel转luckySheet数据
@@ -23,6 +25,8 @@ func ConvToLuckySheet(filePath string) (err error) {
 	sheetDataList := make([]SimpleLuckySheetData, 0)
 	// 获取所有sheet
 	sheetList := f.GetSheetList()
+	fmt.Println("读取完成后", time.Now().Format(utils.FormatDateTime))
+
 	for sheetIndex, sheetName := range sheetList {
 		sheetData, tmpErr := getLuckySheetData(f, sheetIndex, sheetName)
 		if tmpErr != nil {
@@ -80,19 +84,20 @@ type SimpleLuckySheetDataConfig struct {
 
 // SimpleLuckySheetCellData 单个单元格数据
 type SimpleLuckySheetCellData struct {
-	Col   int64                     `json:"c" description:"列"`
-	Row   int64                     `json:"r" description:"行"`
-	Value SimpleLuckySheetDataValue `json:"v" description:"单元格内值的数据"`
+	Col int64 `json:"c" description:"列"`
+	Row int64 `json:"r" description:"行"`
+	//Value SimpleLuckySheetDataValue `json:"v" description:"单元格内值的数据"`
+	Value interface{} `json:"v" description:"单元格内值的数据"`
 }
 
 // SimpleLuckySheetDataValue 单元格内值的数据
 type SimpleLuckySheetDataValue struct {
 	CellType LuckySheetDataCellType `json:"ct" description:"单元格值格式:文本、时间等	"`
 	Value    interface{}            `json:"v" description:"原始值"`
-	Monitor  string                 `json:"m" description:"显示值"`
+	//Monitor  string                 `json:"m" description:"显示值"`
 	//Fontsize       int                    `description:"字体大小,14"`
-	TextBeak int         `description:"文本换行,	0 截断、1溢出、2 自动换行"`
-	Tb       interface{} `json:"tb" description:"文本换行,	0 截断、1溢出、2 自动换行"`
+	//TextBeak int         `description:"文本换行,	0 截断、1溢出、2 自动换行"`
+	//Tb       interface{} `json:"tb" description:"文本换行,	0 截断、1溢出、2 自动换行"`
 	//Ps        LuckySheetDataCellComment `json:"ps" description:"批注"`
 	Function string `json:"f" description:"公式"`
 	//MergeCell LuckySheetDataConfigMerge `json:"mc" description:"合并单元格信息"`
@@ -111,126 +116,251 @@ func getLuckySheetData(f *excelize.File, sheetIndex int, sheetName string) (shee
 		CellData: cellData,
 		Config:   SimpleLuckySheetDataConfig{},
 	}
+	fmt.Println("开始读取sheet数据:", time.Now().Format(utils.FormatDateTime))
 	rows, tmpErr := f.GetRows(sheetName)
 	if tmpErr != nil {
 		err = tmpErr
 		return
 	}
+	fmt.Println("读取完sheet数据:", time.Now().Format(utils.FormatDateTime))
+	lenRow := len(rows)
+	fmt.Println("总共:", lenRow, "条数据")
+	if lenRow <= 0 {
+		return
+	}
+
 	//sheetData.Row = len(rows)
 	//sheetData.Column = len(Column)
 
 	// 最大单元格数
 	maxColumnIndex := 0
-	mergeCellList, err := f.GetMergeCells(sheetName)
-	if err != nil {
-		return
-	}
 
-	for _, v := range mergeCellList {
-		// 左上角单元格位置
-		cStartIndex, rStartIndex, tmpErr := excelize.CellNameToCoordinates(v.GetStartAxis())
-		if tmpErr != nil {
-			err = tmpErr
-			return
-		}
-		// 右下角单元格位置
-		cEndIndex, rEndIndex, tmpErr := excelize.CellNameToCoordinates(v.GetEndAxis())
-		if tmpErr != nil {
-			err = tmpErr
+	wg := sync.WaitGroup{}
+	wg.Add(1)
+	// 协程处理合并单元格
+	go func() {
+		defer func() {
+			wg.Done()
+		}()
+		mergeCellList, err := f.GetMergeCells(sheetName)
+		if err != nil {
 			return
 		}
-		//fmt.Println(v.GetEndAxis())
-		tmpLuckySheetDataConfigMerge := LuckySheetDataConfigMerge{
-			Row:    rStartIndex - 1,
-			Column: cStartIndex - 1,
-			Rs:     rEndIndex - rStartIndex + 1,
-			Cs:     cEndIndex - cStartIndex + 1,
-		}
-		mergeData[fmt.Sprint(rStartIndex-1, "_", cStartIndex-1)] = tmpLuckySheetDataConfigMerge
-	}
-	sheetData.Config.Merge = mergeData
-
-	colWidthMap := make(map[string]float64)
-	for rIndex, row := range rows {
-		for cIndex, colCell := range row {
-			if rIndex == 0 {
-				//colName, tmpErr := excelize.ColumnNumberToName(cIndex + 1)
-				//if tmpErr != nil {
-				//	err = tmpErr
-				//	return
-				//}
-				//colWidth, tmpErr := f.GetColWidth(sheetName, colName)
-				//if tmpErr != nil {
-				//	err = tmpErr
-				//	return
-				//}
-				//colWidthMap[fmt.Sprint(cIndex)] = emuToPx(colWidth)
-			}
-			if maxColumnIndex < cIndex {
-				maxColumnIndex = cIndex
-			}
-			cellName, tmpErr := excelize.CoordinatesToCellName(cIndex+1, rIndex+1)
+		for _, v := range mergeCellList {
+			// 左上角单元格位置
+			cStartIndex, rStartIndex, tmpErr := excelize.CellNameToCoordinates(v.GetStartAxis())
 			if tmpErr != nil {
 				err = tmpErr
 				return
 			}
-			cellType, tmpErr := f.GetCellType(sheetName, cellName)
+			// 右下角单元格位置
+			cEndIndex, rEndIndex, tmpErr := excelize.CellNameToCoordinates(v.GetEndAxis())
 			if tmpErr != nil {
 				err = tmpErr
 				return
 			}
-			cellFormula, tmpErr := f.GetCellFormula(sheetName, cellName)
-			if tmpErr != nil {
-				err = tmpErr
-				return
+			//fmt.Println(v.GetEndAxis())
+			tmpLuckySheetDataConfigMerge := LuckySheetDataConfigMerge{
+				Row:    rStartIndex - 1,
+				Column: cStartIndex - 1,
+				Rs:     rEndIndex - rStartIndex + 1,
+				Cs:     cEndIndex - cStartIndex + 1,
 			}
+			mergeData[fmt.Sprint(rStartIndex-1, "_", cStartIndex-1)] = tmpLuckySheetDataConfigMerge
+		}
+		sheetData.Config.Merge = mergeData
+	}()
+
+	colWidthMap := make(map[string]float64)
 
-			fmt.Println(cellName, ": ", "类型:", cellType, ",公式:", cellFormula, ",值", colCell, "\t")
+	// 每次分割就是5000条
+	splitNum := 500
+	splitLen := lenRow / splitNum
+	residue := lenRow % splitNum
+	if residue > 0 {
+		splitLen += 1
+	}
 
-			var colCellIntfac interface{}
-			cellTypeT := "g"
-			//colCell = utils.Tof
-			tmpDec, tmpErr := decimal.NewFromString(colCell)
-			if tmpErr != nil {
-				colCellIntfac = colCell
-			} else {
-				colCellIntfac, _ = tmpDec.Float64()
-				cellTypeT = "n"
-			}
+	for i := 0; i < splitLen; i++ {
+		wg.Add(1)
 
-			if cellFormula != `` {
-				cellFormula = `=` + cellFormula
-
-				calcChainList = append(calcChainList, CalcChain{
-					Col:   int64(cIndex),
-					Row:   int64(rIndex),
-					Index: sheetIndex,
-					Func:  []interface{}{true, colCell, cellFormula},
-					Color: "w",
-					Times: 0,
-				})
-			}
+		startRow := i * splitNum
+		endRow := (i + 1) * splitNum
+		if i == splitLen-1 && residue > 0 {
+			endRow = lenRow
+		}
+
+		go func(currStartRow, currEndRow int) {
+			defer func() {
+				wg.Done()
+			}()
+
+			for rIndex := currStartRow; rIndex < currEndRow; rIndex++ {
+				row := rows[rIndex]
+				for cIndex, colCell := range row {
+					if rIndex == 0 {
+						//colName, tmpErr := excelize.ColumnNumberToName(cIndex + 1)
+						//if tmpErr != nil {
+						//	err = tmpErr
+						//	return
+						//}
+						//colWidth, tmpErr := f.GetColWidth(sheetName, colName)
+						//if tmpErr != nil {
+						//	err = tmpErr
+						//	return
+						//}
+						//colWidthMap[fmt.Sprint(cIndex)] = emuToPx(colWidth)
+					}
+					if maxColumnIndex < cIndex {
+						maxColumnIndex = cIndex
+					}
+					cellName, tmpErr := excelize.CoordinatesToCellName(cIndex+1, rIndex+1)
+					if tmpErr != nil {
+						err = tmpErr
+						return
+					}
+					//cellType, tmpErr := f.GetCellType(sheetName, cellName)
+					//if tmpErr != nil {
+					//	err = tmpErr
+					//	return
+					//}
+					cellFormula, tmpErr := f.GetCellFormula(sheetName, cellName)
+					if tmpErr != nil {
+						err = tmpErr
+						return
+					}
+
+					//fmt.Println(cellName, ": ", "类型:", cellType, ",公式:", cellFormula, ",值", colCell, "\t")
+
+					var colCellIntfac interface{}
+					cellTypeT := "g"
+					//colCell = utils.Tof
+					tmpDec, tmpErr := decimal.NewFromString(colCell)
+					if tmpErr != nil {
+						colCellIntfac = colCell
+					} else {
+						colCellIntfac, _ = tmpDec.Float64()
+						cellTypeT = "n"
+					}
 
-			cellData = append(cellData, SimpleLuckySheetCellData{
-				Col: int64(cIndex),
-				Row: int64(rIndex),
-				Value: SimpleLuckySheetDataValue{
-					CellType: LuckySheetDataCellType{
+					if cellFormula != `` {
+						cellFormula = `=` + cellFormula
+
+						calcChainList = append(calcChainList, CalcChain{
+							Col:   int64(cIndex),
+							Row:   int64(rIndex),
+							Index: sheetIndex,
+							Func:  []interface{}{true, colCell, cellFormula},
+							Color: "w",
+							Times: 0,
+						})
+					}
+					//CellType LuckySheetDataCellType `json:"ct" description:"单元格值格式:文本、时间等	"`
+					//Value    interface{}            `json:"v" description:"原始值"`
+					////Monitor  string                 `json:"m" description:"显示值"`
+					////Fontsize       int                    `description:"字体大小,14"`
+					////TextBeak int         `description:"文本换行,	0 截断、1溢出、2 自动换行"`
+					////Tb       interface{} `json:"tb" description:"文本换行,	0 截断、1溢出、2 自动换行"`
+					////Ps        LuckySheetDataCellComment `json:"ps" description:"批注"`
+					//Function string `json:"f" description:"公式"`
+
+					valueMap := make(map[string]interface{})
+					valueMap["ct"] = LuckySheetDataCellType{
 						Fa: "General",
 						T:  cellTypeT,
-						//S:  nil,
-					},
-					Value:   colCellIntfac,
-					Monitor: colCell,
-					//Background:     "",
-					//FontFamily:     0,
-					//FontColor:      "",
-					Function: cellFormula,
-					//MergeCell: LuckySheetDataConfigMerge{},
-				},
-			})
-		}
+					}
+					valueMap["v"] = colCellIntfac
+					if cellFormula != `` {
+						valueMap["f"] = cellFormula
+					}
+					cellData = append(cellData, SimpleLuckySheetCellData{
+						Col:   int64(cIndex),
+						Row:   int64(rIndex),
+						Value: valueMap,
+					})
+				}
+			}
+		}(startRow, endRow)
 	}
+	wg.Wait()
+
+	fmt.Println("解析完sheet数据:", time.Now().Format(utils.FormatDateTime))
+	//for rIndex, row := range rows {
+	//	for cIndex, colCell := range row {
+	//		if rIndex == 0 {
+	//			//colName, tmpErr := excelize.ColumnNumberToName(cIndex + 1)
+	//			//if tmpErr != nil {
+	//			//	err = tmpErr
+	//			//	return
+	//			//}
+	//			//colWidth, tmpErr := f.GetColWidth(sheetName, colName)
+	//			//if tmpErr != nil {
+	//			//	err = tmpErr
+	//			//	return
+	//			//}
+	//			//colWidthMap[fmt.Sprint(cIndex)] = emuToPx(colWidth)
+	//		}
+	//		if maxColumnIndex < cIndex {
+	//			maxColumnIndex = cIndex
+	//		}
+	//		cellName, tmpErr := excelize.CoordinatesToCellName(cIndex+1, rIndex+1)
+	//		if tmpErr != nil {
+	//			err = tmpErr
+	//			return
+	//		}
+	//		//cellType, tmpErr := f.GetCellType(sheetName, cellName)
+	//		//if tmpErr != nil {
+	//		//	err = tmpErr
+	//		//	return
+	//		//}
+	//		cellFormula, tmpErr := f.GetCellFormula(sheetName, cellName)
+	//		if tmpErr != nil {
+	//			err = tmpErr
+	//			return
+	//		}
+	//
+	//		//fmt.Println(cellName, ": ", "类型:", cellType, ",公式:", cellFormula, ",值", colCell, "\t")
+	//
+	//		var colCellIntfac interface{}
+	//		cellTypeT := "g"
+	//		//colCell = utils.Tof
+	//		tmpDec, tmpErr := decimal.NewFromString(colCell)
+	//		if tmpErr != nil {
+	//			colCellIntfac = colCell
+	//		} else {
+	//			colCellIntfac, _ = tmpDec.Float64()
+	//			cellTypeT = "n"
+	//		}
+	//
+	//		if cellFormula != `` {
+	//			cellFormula = `=` + cellFormula
+	//
+	//			calcChainList = append(calcChainList, CalcChain{
+	//				Col:   int64(cIndex),
+	//				Row:   int64(rIndex),
+	//				Index: sheetIndex,
+	//				Func:  []interface{}{true, colCell, cellFormula},
+	//				Color: "w",
+	//				Times: 0,
+	//			})
+	//		}
+	//
+	//		cellData = append(cellData, SimpleLuckySheetCellData{
+	//			Col: int64(cIndex),
+	//			Row: int64(rIndex),
+	//			Value: SimpleLuckySheetDataValue{
+	//				CellType: LuckySheetDataCellType{
+	//					Fa: "General",
+	//					T:  cellTypeT,
+	//				},
+	//				Value:    colCellIntfac,
+	//				Monitor:  colCell,
+	//				Function: cellFormula,
+	//				//MergeCell: LuckySheetDataConfigMerge{},
+	//			},
+	//		})
+	//	}
+	//}
 
 	sheetData.Config.Columnlen = colWidthMap
 

+ 4 - 1
services/excel/lucky_sheet.go

@@ -1174,7 +1174,10 @@ func (item *LuckySheetData) ToExcel2() (downloadFilePath string, err error) {
 	f := excelize.NewFile()
 	// Create a new sheet.
 	sheetName := `Sheet1`
-	sheetIndex := f.NewSheet(sheetName)
+	sheetIndex, err := f.NewSheet(sheetName)
+	if err != nil {
+		return
+	}
 
 	//设置列宽度
 	for k, v := range tableData.RowWidthList {