|
@@ -100,6 +100,7 @@ func (f *File) workSheetReader(sheet string) *xlsxWorksheet {
|
|
|
}
|
|
}
|
|
|
ok := f.checked[name]
|
|
ok := f.checked[name]
|
|
|
if !ok {
|
|
if !ok {
|
|
|
|
|
+ checkSheet(&xlsx)
|
|
|
checkRow(&xlsx)
|
|
checkRow(&xlsx)
|
|
|
f.checked[name] = true
|
|
f.checked[name] = true
|
|
|
}
|
|
}
|
|
@@ -226,7 +227,9 @@ func completeCol(xlsx *xlsxWorksheet, row int, cell int) {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// Completion row element tags of XML in a sheet.
|
|
|
|
|
|
|
+// completeRow provides function to check and fill each column element for a
|
|
|
|
|
+// single row and make that is continuous in a worksheet of XML by given row
|
|
|
|
|
+// index and axis.
|
|
|
func completeRow(xlsx *xlsxWorksheet, row, cell int) {
|
|
func completeRow(xlsx *xlsxWorksheet, row, cell int) {
|
|
|
currentRows := len(xlsx.SheetData.Row)
|
|
currentRows := len(xlsx.SheetData.Row)
|
|
|
if currentRows > 1 {
|
|
if currentRows > 1 {
|
|
@@ -235,6 +238,37 @@ func completeRow(xlsx *xlsxWorksheet, row, cell int) {
|
|
|
row = lastRow
|
|
row = lastRow
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+ for i := currentRows; i < row; i++ {
|
|
|
|
|
+ xlsx.SheetData.Row = append(xlsx.SheetData.Row, xlsxRow{
|
|
|
|
|
+ R: i + 1,
|
|
|
|
|
+ })
|
|
|
|
|
+ }
|
|
|
|
|
+ buffer := bytes.Buffer{}
|
|
|
|
|
+ for ii := currentRows; ii < row; ii++ {
|
|
|
|
|
+ start := len(xlsx.SheetData.Row[ii].C)
|
|
|
|
|
+ if start == 0 {
|
|
|
|
|
+ for iii := start; iii < cell; iii++ {
|
|
|
|
|
+ buffer.WriteString(toAlphaString(iii + 1))
|
|
|
|
|
+ buffer.WriteString(strconv.Itoa(ii + 1))
|
|
|
|
|
+ xlsx.SheetData.Row[ii].C = append(xlsx.SheetData.Row[ii].C, xlsxC{
|
|
|
|
|
+ R: buffer.String(),
|
|
|
|
|
+ })
|
|
|
|
|
+ buffer.Reset()
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// checkSheet provides function to fill each row element and make that is
|
|
|
|
|
+// continuous in a worksheet of XML.
|
|
|
|
|
+func checkSheet(xlsx *xlsxWorksheet) {
|
|
|
|
|
+ row := len(xlsx.SheetData.Row)
|
|
|
|
|
+ if row > 1 {
|
|
|
|
|
+ lastRow := xlsx.SheetData.Row[row-1].R
|
|
|
|
|
+ if lastRow >= row {
|
|
|
|
|
+ row = lastRow
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
sheetData := xlsxSheetData{}
|
|
sheetData := xlsxSheetData{}
|
|
|
existsRows := map[int]int{}
|
|
existsRows := map[int]int{}
|
|
|
for k, v := range xlsx.SheetData.Row {
|
|
for k, v := range xlsx.SheetData.Row {
|
|
@@ -250,24 +284,11 @@ func completeRow(xlsx *xlsxWorksheet, row, cell int) {
|
|
|
R: i + 1,
|
|
R: i + 1,
|
|
|
})
|
|
})
|
|
|
}
|
|
}
|
|
|
- buffer := bytes.Buffer{}
|
|
|
|
|
- for ii := 0; ii < row; ii++ {
|
|
|
|
|
- start := len(sheetData.Row[ii].C)
|
|
|
|
|
- if start == 0 {
|
|
|
|
|
- for iii := start; iii < cell; iii++ {
|
|
|
|
|
- buffer.WriteString(toAlphaString(iii + 1))
|
|
|
|
|
- buffer.WriteString(strconv.Itoa(ii + 1))
|
|
|
|
|
- sheetData.Row[ii].C = append(sheetData.Row[ii].C, xlsxC{
|
|
|
|
|
- R: buffer.String(),
|
|
|
|
|
- })
|
|
|
|
|
- buffer.Reset()
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
xlsx.SheetData = sheetData
|
|
xlsx.SheetData = sheetData
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// Replace xl/worksheets/sheet%d.xml XML tags to self-closing for compatible
|
|
|
|
|
|
|
+// replaceWorkSheetsRelationshipsNameSpace provides function to replace
|
|
|
|
|
+// xl/worksheets/sheet%d.xml XML tags to self-closing for compatible Microsoft
|
|
|
// Office Excel 2007.
|
|
// Office Excel 2007.
|
|
|
func replaceWorkSheetsRelationshipsNameSpace(workbookMarshal string) string {
|
|
func replaceWorkSheetsRelationshipsNameSpace(workbookMarshal string) string {
|
|
|
oldXmlns := `<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">`
|
|
oldXmlns := `<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">`
|
|
@@ -276,7 +297,8 @@ func replaceWorkSheetsRelationshipsNameSpace(workbookMarshal string) string {
|
|
|
return workbookMarshal
|
|
return workbookMarshal
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// Check XML tags and fix discontinuous case. For example:
|
|
|
|
|
|
|
+// checkRow provides function to check and fill each column element for all rows
|
|
|
|
|
+// and make that is continuous in a worksheet of XML. For example:
|
|
|
//
|
|
//
|
|
|
// <row r="15" spans="1:22" x14ac:dyDescent="0.2">
|
|
// <row r="15" spans="1:22" x14ac:dyDescent="0.2">
|
|
|
// <c r="A15" s="2" />
|
|
// <c r="A15" s="2" />
|