Pārlūkot izejas kodu

fix:excel中间空行空列问题

Roc 2 gadi atpakaļ
vecāks
revīzija
0279f7914c
1 mainītis faili ar 297 papildinājumiem un 25 dzēšanām
  1. 297 25
      services/excel/lucky_sheet.go

+ 297 - 25
services/excel/lucky_sheet.go

@@ -297,9 +297,9 @@ func (item *LuckySheetData) GetTableDataByLuckySheetDataStr() (selfTableData Tab
 		rowHeightList = append(rowHeightList, tmpHeight)
 
 		tmpRowData, ok := tableDataMap[i]
+		// 如果没有该行数据,那么就默认添加空行数据处理
 		if !ok {
-			tableDataList = append(tableDataList, tmpTableColDataList)
-			continue
+			tmpRowData = make(map[int64]LuckySheetDataValue)
 		}
 
 		var j int64
@@ -329,9 +329,41 @@ func (item *LuckySheetData) GetTableDataByLuckySheetDataStr() (selfTableData Tab
 		tableDataList = append(tableDataList, tmpTableColDataList)
 	}
 
+	// 数据处理,移除上下左右空行空列
+	tableDataList, tableRemoveNum, rowHeightList, rowWidthList, tableDataMergeList := handleTableDataList(tableDataList, item.Config.Merge, rowHeightList, rowWidthList)
+
+	// 表格数据
+	{
+		// 移除空白单元格信息
+		selfTableData.RemoveTopRow = tableRemoveNum.RemoveTopRow
+		selfTableData.RemoveBottomRow = tableRemoveNum.RemoveBottomRow
+		selfTableData.RemoveLeftColumn = tableRemoveNum.RemoveLeftColumn
+		selfTableData.RemoveRightColumn = tableRemoveNum.RemoveRightColumn
+	}
+	selfTableData.TableDataList = tableDataList
+	selfTableData.RowWidthList = rowWidthList
+	selfTableData.RowHeightList = rowHeightList
+	selfTableData.MergeList = tableDataMergeList
+
+	return
+}
+
+// TableRemoveNum 上下左右移除的空行空列数量
+type TableRemoveNum struct {
+	RemoveTopRow      int `description:"移除表格上方的行数"`
+	RemoveBottomRow   int `description:"移除表格下方的行数"`
+	RemoveLeftColumn  int `description:"移除表格左侧的列数"`
+	RemoveRightColumn int `description:"移除表格右侧的列数"`
+}
+
+// handleTableDataList 表格数据处理(移除上下左右的空行空列)
+func handleTableDataList(tableDataList [][]LuckySheetDataValue, luckySheetDataConfigMergeList map[string]LuckySheetDataConfigMerge, rowHeightList, rowWidthList []float64) ([][]LuckySheetDataValue, TableRemoveNum, []float64, []float64, []TableDataMerge) {
+
+	var removeTopRow, removeBottomRow, removeLeftColumn, removeRightColumn int //上下左右需要移除的空行空列
+	tableDataMergeList := make([]TableDataMerge, 0)                            //待合并的单元格信息
+
 	//总共多少行
 	lenRow := len(tableDataList)
-
 	//移除上下空行
 	deleteRowIndexList := make([]int, 0)
 	if lenRow > 0 {
@@ -340,7 +372,7 @@ func (item *LuckySheetData) GetTableDataByLuckySheetDataStr() (selfTableData Tab
 		for rowIndex := 0; rowIndex < lenRow; rowIndex++ {
 			isDelete := true
 			for _, v := range tableDataList[rowIndex] {
-				if v.Monitor != `` {
+				if v.Monitor != `` || (v.MergeCell.Row != rowIndex && v.MergeCell.Row != 0) {
 					isDelete = false
 					flag = true
 					break
@@ -350,7 +382,7 @@ func (item *LuckySheetData) GetTableDataByLuckySheetDataStr() (selfTableData Tab
 				break
 			}
 			if isDelete {
-				selfTableData.RemoveTopRow++
+				removeTopRow++
 				deleteRowIndexList = append(deleteRowIndexList, rowIndex)
 			}
 		}
@@ -362,7 +394,7 @@ func (item *LuckySheetData) GetTableDataByLuckySheetDataStr() (selfTableData Tab
 		for rowIndex := lenRow - 1; rowIndex >= 0; rowIndex-- {
 			isDelete := true
 			for _, v := range tableDataList[rowIndex] {
-				if v.Monitor != `` || (v.MergeCell.Row != rowIndex && v.MergeCell.Row != 0) {
+				if v.Monitor != `` {
 					isDelete = false
 					flag = true
 					break
@@ -373,7 +405,7 @@ func (item *LuckySheetData) GetTableDataByLuckySheetDataStr() (selfTableData Tab
 			}
 			if isDelete {
 				deleteBottomRowIndexList = append(deleteBottomRowIndexList, rowIndex)
-				selfTableData.RemoveBottomRow++
+				removeBottomRow++
 			}
 		}
 
@@ -393,12 +425,12 @@ func (item *LuckySheetData) GetTableDataByLuckySheetDataStr() (selfTableData Tab
 		}
 	}
 
-	//移除前后空列
+	//移除左右空列
 	deleteColumnIndexList := make([]int, 0)
 	if len(tableDataList) > 0 {
 		var flag = false
 		lenColumn := len(tableDataList[0])
-		// 移除前方空列
+		// 移除左边空列
 		for columnIndex := 0; columnIndex < lenColumn; columnIndex++ {
 			isDelete := true
 			for _, v := range tableDataList {
@@ -406,7 +438,7 @@ func (item *LuckySheetData) GetTableDataByLuckySheetDataStr() (selfTableData Tab
 				if len(v) <= 0 {
 					continue
 				}
-				if v[columnIndex].Monitor != `` {
+				if v[columnIndex].Monitor != `` || (v[columnIndex].MergeCell.Column != columnIndex && v[columnIndex].MergeCell.Column != 0) {
 					isDelete = false
 					flag = true
 					break
@@ -416,18 +448,22 @@ func (item *LuckySheetData) GetTableDataByLuckySheetDataStr() (selfTableData Tab
 				break
 			}
 			if isDelete {
-				selfTableData.RemoveLeftColumn++
+				removeLeftColumn++
 				deleteColumnIndexList = append(deleteColumnIndexList, columnIndex)
 			}
 		}
 
-		// 移除方空列
+		// 移除方空列
 		flag = false
-		//后方
+		//右边
 		deleteTailColumnIndexList := make([]int, 0)
 		for columnIndex := lenColumn - 1; columnIndex >= 0; columnIndex-- {
 			isDelete := true
 			for _, v := range tableDataList {
+				//如果一列都没有,说明是上面几行是空行,没有数据
+				if len(v) <= 0 {
+					continue
+				}
 				if v[columnIndex].Monitor != `` || (v[columnIndex].MergeCell.Column != columnIndex && v[columnIndex].MergeCell.Column != 0) {
 					isDelete = false
 					flag = true
@@ -439,7 +475,7 @@ func (item *LuckySheetData) GetTableDataByLuckySheetDataStr() (selfTableData Tab
 			}
 			if isDelete {
 				deleteTailColumnIndexList = append(deleteTailColumnIndexList, columnIndex)
-				selfTableData.RemoveRightColumn++
+				removeRightColumn++
 			}
 		}
 
@@ -462,10 +498,9 @@ func (item *LuckySheetData) GetTableDataByLuckySheetDataStr() (selfTableData Tab
 	}
 
 	//处理合并单元格
-	tableDataMergeList := make([]TableDataMerge, 0)
-	for _, v := range item.Config.Merge {
-		indexRow := v.Row - selfTableData.RemoveTopRow
-		indexColumn := v.Column - selfTableData.RemoveLeftColumn
+	for _, v := range luckySheetDataConfigMergeList {
+		indexRow := v.Row - removeTopRow
+		indexColumn := v.Column - removeLeftColumn
 
 		tableDataMerge := TableDataMerge{
 			StartRowIndex:    indexRow,
@@ -476,13 +511,12 @@ func (item *LuckySheetData) GetTableDataByLuckySheetDataStr() (selfTableData Tab
 		tableDataMergeList = append(tableDataMergeList, tableDataMerge)
 	}
 
-	// 表格数据
-	selfTableData.TableDataList = tableDataList
-	selfTableData.RowWidthList = rowWidthList
-	selfTableData.RowHeightList = rowHeightList
-	selfTableData.MergeList = tableDataMergeList
-
-	return
+	return tableDataList, TableRemoveNum{
+		RemoveTopRow:      removeTopRow,
+		RemoveBottomRow:   removeBottomRow,
+		RemoveLeftColumn:  removeLeftColumn,
+		RemoveRightColumn: removeRightColumn,
+	}, rowHeightList, rowWidthList, tableDataMergeList
 }
 
 // handleCellVal 处理单元格数据
@@ -573,3 +607,241 @@ func HandleTableCell(oldTableData TableData) (newTableData TableData) {
 
 	return
 }
+
+// GetTableDataByLuckySheetDataStrBak 通过LuckySheet的string数据获取表格数据(备份:2022-08-23 10:30:32)
+func (item *LuckySheetData) GetTableDataByLuckySheetDataStrBak() (selfTableData TableData, err error) {
+	luckySheetCellDataList := item.CellData
+	// 表格数据
+	tableDataMap := make(map[int64]map[int64]LuckySheetDataValue)
+	// 最大行,最大列
+	var maxRow, maxCol int64
+	for _, v := range luckySheetCellDataList {
+		//fmt.Println("row:", v.Row, "=====col:", v.Col)
+		if v.Row > maxRow { //最大行
+			maxRow = v.Row
+		}
+		if v.Col > maxCol { //最大列
+			maxCol = v.Col
+		}
+		var tmpRow map[int64]LuckySheetDataValue
+
+		tmpRow, ok := tableDataMap[v.Row]
+		if ok {
+			tmpRow[v.Col] = v.Value
+		} else {
+			tmpRow = make(map[int64]LuckySheetDataValue)
+			tmpRow[v.Col] = v.Value
+		}
+		tableDataMap[v.Row] = tmpRow
+	}
+
+	tableDataList := make([][]LuckySheetDataValue, 0)
+	var i int64
+
+	// 单元格宽度
+	configColumnConf := item.Config.Columnlen
+	rowWidthMap := make(map[int]float64)
+	rowWidthList := make([]float64, 0) //
+
+	// 单元格高度
+	configRowConf := item.Config.Rowlen
+	rowHeightList := make([]float64, 0) //
+
+	for i = 0; i <= maxRow; i++ {
+		//列
+		tmpTableColDataList := make([]LuckySheetDataValue, 0)
+		// 每个单元格的高度
+		tmpHeight, ok := configRowConf[fmt.Sprint(i)]
+		if !ok {
+			tmpHeight = 0
+		}
+		rowHeightList = append(rowHeightList, tmpHeight)
+
+		tmpRowData, ok := tableDataMap[i]
+		// 如果没有该行数据,那么就默认添加空行数据处理
+		if !ok {
+			tmpRowData = make(map[int64]LuckySheetDataValue)
+		}
+
+		var j int64
+		for j = 0; j <= maxCol; j++ {
+			tmpTableColData, ok := tmpRowData[j]
+			if !ok {
+				tmpTableColData = LuckySheetDataValue{}
+			}
+
+			//单元格显示的数据处理
+			tmpTableColData.Monitor = handleCellVal(tmpTableColData)
+
+			tmpTableColDataList = append(tmpTableColDataList, tmpTableColData)
+
+			// 每个单元格的宽度
+			tmpWidth, ok := configColumnConf[fmt.Sprint(j)]
+			if !ok {
+				tmpWidth = 0
+			}
+			rowIndex := len(tmpTableColDataList) - 1
+			if _, ok2 := rowWidthMap[rowIndex]; !ok2 {
+				rowWidthList = append(rowWidthList, tmpWidth)
+			}
+			rowWidthMap[rowIndex] = tmpWidth
+		}
+
+		tableDataList = append(tableDataList, tmpTableColDataList)
+	}
+
+	//总共多少行
+	lenRow := len(tableDataList)
+
+	//移除上下空行
+	deleteRowIndexList := make([]int, 0)
+	if lenRow > 0 {
+		var flag = false
+		// 移除上方空列
+		for rowIndex := 0; rowIndex < lenRow; rowIndex++ {
+			isDelete := true
+			for _, v := range tableDataList[rowIndex] {
+				if v.Monitor != `` {
+					isDelete = false
+					flag = true
+					break
+				}
+			}
+			if flag {
+				break
+			}
+			if isDelete {
+				selfTableData.RemoveTopRow++
+				deleteRowIndexList = append(deleteRowIndexList, rowIndex)
+			}
+		}
+
+		// 移除下方空行
+		flag = false
+		//尾部
+		deleteBottomRowIndexList := make([]int, 0)
+		for rowIndex := lenRow - 1; rowIndex >= 0; rowIndex-- {
+			isDelete := true
+			for _, v := range tableDataList[rowIndex] {
+				if v.Monitor != `` || (v.MergeCell.Row != rowIndex && v.MergeCell.Row != 0) {
+					isDelete = false
+					flag = true
+					break
+				}
+			}
+			if flag {
+				break
+			}
+			if isDelete {
+				deleteBottomRowIndexList = append(deleteBottomRowIndexList, rowIndex)
+				selfTableData.RemoveBottomRow++
+			}
+		}
+
+		if len(deleteBottomRowIndexList) > 0 {
+			deleteRowIndexList = append(deleteRowIndexList, utils.RevSlice(deleteBottomRowIndexList)...)
+		}
+
+		lenDeleteRow := len(deleteRowIndexList)
+		if lenDeleteRow > 0 {
+			for rowIndex := lenDeleteRow - 1; rowIndex >= 0; rowIndex-- {
+				//表格数据
+				tableDataList = append(tableDataList[:deleteRowIndexList[rowIndex]], tableDataList[deleteRowIndexList[rowIndex]+1:]...) // 删除开头N个元素
+
+				//表格高度
+				rowHeightList = append(rowHeightList[:deleteRowIndexList[rowIndex]], rowHeightList[deleteRowIndexList[rowIndex]+1:]...) // 删除开头N个元素
+			}
+		}
+	}
+
+	//移除前后空列
+	deleteColumnIndexList := make([]int, 0)
+	if len(tableDataList) > 0 {
+		var flag = false
+		lenColumn := len(tableDataList[0])
+		// 移除前方空列
+		for columnIndex := 0; columnIndex < lenColumn; columnIndex++ {
+			isDelete := true
+			for _, v := range tableDataList {
+				//如果一列都没有,说明是上面几行是空行,没有数据
+				if len(v) <= 0 {
+					continue
+				}
+				if v[columnIndex].Monitor != `` {
+					isDelete = false
+					flag = true
+					break
+				}
+			}
+			if flag {
+				break
+			}
+			if isDelete {
+				selfTableData.RemoveLeftColumn++
+				deleteColumnIndexList = append(deleteColumnIndexList, columnIndex)
+			}
+		}
+
+		// 移除后方空列
+		flag = false
+		//后方
+		deleteTailColumnIndexList := make([]int, 0)
+		for columnIndex := lenColumn - 1; columnIndex >= 0; columnIndex-- {
+			isDelete := true
+			for _, v := range tableDataList {
+				if v[columnIndex].Monitor != `` || (v[columnIndex].MergeCell.Column != columnIndex && v[columnIndex].MergeCell.Column != 0) {
+					isDelete = false
+					flag = true
+					break
+				}
+			}
+			if flag {
+				break
+			}
+			if isDelete {
+				deleteTailColumnIndexList = append(deleteTailColumnIndexList, columnIndex)
+				selfTableData.RemoveRightColumn++
+			}
+		}
+
+		if len(deleteTailColumnIndexList) > 0 {
+			deleteColumnIndexList = append(deleteColumnIndexList, utils.RevSlice(deleteTailColumnIndexList)...)
+		}
+
+		lenDeleteColumn := len(deleteColumnIndexList)
+		if lenDeleteColumn > 0 {
+			for columnIndex := lenDeleteColumn - 1; columnIndex >= 0; columnIndex-- {
+				//表格数据
+				for k, v := range tableDataList {
+					tableDataList[k] = append(v[:deleteColumnIndexList[columnIndex]], v[deleteColumnIndexList[columnIndex]+1:]...) // 删除开头N个元素
+				}
+
+				//表格宽度
+				rowWidthList = append(rowWidthList[:deleteColumnIndexList[columnIndex]], rowWidthList[deleteColumnIndexList[columnIndex]+1:]...) // 删除开头N个元素
+			}
+		}
+	}
+
+	//处理合并单元格
+	tableDataMergeList := make([]TableDataMerge, 0)
+	for _, v := range item.Config.Merge {
+		indexRow := v.Row - selfTableData.RemoveTopRow
+		indexColumn := v.Column - selfTableData.RemoveLeftColumn
+
+		tableDataMerge := TableDataMerge{
+			StartRowIndex:    indexRow,
+			StartColumnIndex: indexColumn,
+			MergeRowNum:      v.Rs - 1,
+			MergeColumnNum:   v.Cs - 1,
+		}
+		tableDataMergeList = append(tableDataMergeList, tableDataMerge)
+	}
+
+	// 表格数据
+	selfTableData.TableDataList = tableDataList
+	selfTableData.RowWidthList = rowWidthList
+	selfTableData.RowHeightList = rowHeightList
+	selfTableData.MergeList = tableDataMergeList
+
+	return
+}