forked from p30928647/excelize
Use conjunction with strings.Map to split Axis and update godoc.
This commit is contained in:
parent
cbfd657753
commit
2e8fa2d39c
2
cell.go
2
cell.go
|
@ -10,7 +10,7 @@ import (
|
||||||
func (f *File) GetCellValue(sheet string, axis string) string {
|
func (f *File) GetCellValue(sheet string, axis string) string {
|
||||||
axis = strings.ToUpper(axis)
|
axis = strings.ToUpper(axis)
|
||||||
var xlsx xlsxWorksheet
|
var xlsx xlsxWorksheet
|
||||||
row := getRowIndex(axis)
|
row, _ := strconv.Atoi(strings.Map(intOnlyMapF, axis))
|
||||||
xAxis := row - 1
|
xAxis := row - 1
|
||||||
name := `xl/worksheets/` + strings.ToLower(sheet) + `.xml`
|
name := `xl/worksheets/` + strings.ToLower(sheet) + `.xml`
|
||||||
xml.Unmarshal([]byte(f.readXML(name)), &xlsx)
|
xml.Unmarshal([]byte(f.readXML(name)), &xlsx)
|
||||||
|
|
16
excelize.go
16
excelize.go
|
@ -52,8 +52,8 @@ func (f *File) SetCellValue(sheet string, axis string, value interface{}) {
|
||||||
func (f *File) SetCellInt(sheet string, axis string, value int) {
|
func (f *File) SetCellInt(sheet string, axis string, value int) {
|
||||||
axis = strings.ToUpper(axis)
|
axis = strings.ToUpper(axis)
|
||||||
var xlsx xlsxWorksheet
|
var xlsx xlsxWorksheet
|
||||||
col := getColIndex(axis)
|
col := string(strings.Map(letterOnlyMapF, axis))
|
||||||
row := getRowIndex(axis)
|
row, _ := strconv.Atoi(strings.Map(intOnlyMapF, axis))
|
||||||
xAxis := row - 1
|
xAxis := row - 1
|
||||||
yAxis := titleToNumber(col)
|
yAxis := titleToNumber(col)
|
||||||
|
|
||||||
|
@ -77,8 +77,8 @@ func (f *File) SetCellInt(sheet string, axis string, value int) {
|
||||||
func (f *File) SetCellStr(sheet string, axis string, value string) {
|
func (f *File) SetCellStr(sheet string, axis string, value string) {
|
||||||
axis = strings.ToUpper(axis)
|
axis = strings.ToUpper(axis)
|
||||||
var xlsx xlsxWorksheet
|
var xlsx xlsxWorksheet
|
||||||
col := getColIndex(axis)
|
col := string(strings.Map(letterOnlyMapF, axis))
|
||||||
row := getRowIndex(axis)
|
row, _ := strconv.Atoi(strings.Map(intOnlyMapF, axis))
|
||||||
xAxis := row - 1
|
xAxis := row - 1
|
||||||
yAxis := titleToNumber(col)
|
yAxis := titleToNumber(col)
|
||||||
|
|
||||||
|
@ -196,8 +196,8 @@ func checkRow(xlsx xlsxWorksheet) xlsxWorksheet {
|
||||||
if lenCol < 1 {
|
if lenCol < 1 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
endR := getColIndex(v.C[lenCol-1].R)
|
endR := string(strings.Map(letterOnlyMapF, v.C[lenCol-1].R))
|
||||||
endRow := getRowIndex(v.C[lenCol-1].R)
|
endRow, _ := strconv.Atoi(strings.Map(intOnlyMapF, v.C[lenCol-1].R))
|
||||||
endCol := titleToNumber(endR) + 1
|
endCol := titleToNumber(endR) + 1
|
||||||
if lenCol < endCol {
|
if lenCol < endCol {
|
||||||
oldRow := xlsx.SheetData.Row[k].C
|
oldRow := xlsx.SheetData.Row[k].C
|
||||||
|
@ -213,7 +213,7 @@ func checkRow(xlsx xlsxWorksheet) xlsxWorksheet {
|
||||||
}
|
}
|
||||||
xlsx.SheetData.Row[k].C = tmp
|
xlsx.SheetData.Row[k].C = tmp
|
||||||
for _, y := range oldRow {
|
for _, y := range oldRow {
|
||||||
colAxis := titleToNumber(getColIndex(y.R))
|
colAxis := titleToNumber(string(strings.Map(letterOnlyMapF, y.R)))
|
||||||
xlsx.SheetData.Row[k].C[colAxis] = y
|
xlsx.SheetData.Row[k].C[colAxis] = y
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -223,7 +223,7 @@ func checkRow(xlsx xlsxWorksheet) xlsxWorksheet {
|
||||||
|
|
||||||
// UpdateLinkedValue fix linked values within a spreadsheet are not updating in
|
// UpdateLinkedValue fix linked values within a spreadsheet are not updating in
|
||||||
// Office Excel 2007 and 2010. This function will be remove value tag when met a
|
// Office Excel 2007 and 2010. This function will be remove value tag when met a
|
||||||
// cell have a linked value. Reference https://social.technet.microsoft.com/Forums/office/en-US/e16bae1f-6a2c-4325-8013-e989a3479066/excel-2010-linked-cells-not-updating?forum=excel
|
// cell have a linked value. Reference https://social.technet.microsoft.com/Forums/office/en-US/e16bae1f-6a2c-4325-8013-e989a3479066/excel-2010-linked-cells-not-updating?forum=excel
|
||||||
//
|
//
|
||||||
// Notice: after open XLSX file Excel will be update linked value and generate
|
// Notice: after open XLSX file Excel will be update linked value and generate
|
||||||
// new value and will prompt save file or not.
|
// new value and will prompt save file or not.
|
||||||
|
|
39
lib.go
39
lib.go
|
@ -7,8 +7,6 @@ import (
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
"math"
|
"math"
|
||||||
"regexp"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -28,9 +26,9 @@ func ReadZipReader(r *zip.Reader) (map[string]string, int, error) {
|
||||||
for _, v := range r.File {
|
for _, v := range r.File {
|
||||||
fileList[v.Name] = readFile(v)
|
fileList[v.Name] = readFile(v)
|
||||||
if len(v.Name) > 18 {
|
if len(v.Name) > 18 {
|
||||||
if v.Name[0:19] == "xl/worksheets/sheet" {
|
if v.Name[0:19] == `xl/worksheets/sheet` {
|
||||||
var xlsx xlsxWorksheet
|
var xlsx xlsxWorksheet
|
||||||
xml.Unmarshal([]byte(strings.Replace(fileList[v.Name], "<drawing r:id=", "<drawing rid=", -1)), &xlsx)
|
xml.Unmarshal([]byte(strings.Replace(fileList[v.Name], `<drawing r:id=`, `<drawing rid=`, -1)), &xlsx)
|
||||||
xlsx = checkRow(xlsx)
|
xlsx = checkRow(xlsx)
|
||||||
output, _ := xml.Marshal(xlsx)
|
output, _ := xml.Marshal(xlsx)
|
||||||
fileList[v.Name] = replaceRelationshipsID(replaceWorkSheetsRelationshipsNameSpace(string(output)))
|
fileList[v.Name] = replaceRelationshipsID(replaceWorkSheetsRelationshipsNameSpace(string(output)))
|
||||||
|
@ -44,7 +42,7 @@ func ReadZipReader(r *zip.Reader) (map[string]string, int, error) {
|
||||||
// Read XML content as string and replace drawing property in XML namespace of sheet
|
// Read XML content as string and replace drawing property in XML namespace of sheet
|
||||||
func (f *File) readXML(name string) string {
|
func (f *File) readXML(name string) string {
|
||||||
if content, ok := f.XLSX[name]; ok {
|
if content, ok := f.XLSX[name]; ok {
|
||||||
return strings.Replace(content, "<drawing r:id=", "<drawing rid=", -1)
|
return strings.Replace(content, `<drawing r:id=`, `<drawing rid=`, -1)
|
||||||
}
|
}
|
||||||
return ``
|
return ``
|
||||||
}
|
}
|
||||||
|
@ -91,24 +89,23 @@ func titleToNumber(s string) int {
|
||||||
return sum - 1
|
return sum - 1
|
||||||
}
|
}
|
||||||
|
|
||||||
// Split Excel sheet column title to string and integer, return XAxis
|
// letterOnlyMapF is used in conjunction with strings.Map to return
|
||||||
func getColIndex(axis string) string {
|
// only the characters A-Z and a-z in a string
|
||||||
r, err := regexp.Compile(`[^\D]`)
|
func letterOnlyMapF(rune rune) rune {
|
||||||
if err != nil {
|
switch {
|
||||||
log.Fatal(err)
|
case 'A' <= rune && rune <= 'Z':
|
||||||
|
return rune
|
||||||
|
case 'a' <= rune && rune <= 'z':
|
||||||
|
return rune - 32
|
||||||
}
|
}
|
||||||
return string(r.ReplaceAll([]byte(axis), []byte("")))
|
return -1
|
||||||
}
|
}
|
||||||
|
|
||||||
// Split Excel sheet column title to string and integer, return YAxis
|
// intOnlyMapF is used in conjunction with strings.Map to return only
|
||||||
func getRowIndex(axis string) int {
|
// the numeric portions of a string.
|
||||||
r, err := regexp.Compile(`[\D]`)
|
func intOnlyMapF(rune rune) rune {
|
||||||
if err != nil {
|
if rune >= 48 && rune < 58 {
|
||||||
log.Fatal(err)
|
return rune
|
||||||
}
|
}
|
||||||
row, err := strconv.Atoi(string(r.ReplaceAll([]byte(axis), []byte(""))))
|
return -1
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
return row
|
|
||||||
}
|
}
|
||||||
|
|
8
sheet.go
8
sheet.go
|
@ -9,8 +9,8 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewSheet provice function to greate a new sheet by given index, when
|
// NewSheet provice function to greate a new sheet by given index, when
|
||||||
// creating a new XLSX file, the default sheet will be create, when you
|
// creating a new XLSX file, the default sheet will be create, when you
|
||||||
// create a new file, you need to ensure that the index is continuous.
|
// create a new file, you need to ensure that the index is continuous.
|
||||||
func (f *File) NewSheet(index int, name string) {
|
func (f *File) NewSheet(index int, name string) {
|
||||||
// Update docProps/app.xml
|
// Update docProps/app.xml
|
||||||
f.setAppXML()
|
f.setAppXML()
|
||||||
|
@ -30,7 +30,7 @@ func (f *File) setContentTypes(index int) {
|
||||||
xml.Unmarshal([]byte(f.readXML(`[Content_Types].xml`)), &content)
|
xml.Unmarshal([]byte(f.readXML(`[Content_Types].xml`)), &content)
|
||||||
content.Overrides = append(content.Overrides, xlsxOverride{
|
content.Overrides = append(content.Overrides, xlsxOverride{
|
||||||
PartName: `/xl/worksheets/sheet` + strconv.Itoa(index) + `.xml`,
|
PartName: `/xl/worksheets/sheet` + strconv.Itoa(index) + `.xml`,
|
||||||
ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml",
|
ContentType: `application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml`,
|
||||||
})
|
})
|
||||||
output, err := xml.Marshal(content)
|
output, err := xml.Marshal(content)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -94,7 +94,7 @@ func (f *File) addXlsxWorkbookRels(sheet int) {
|
||||||
content.Relationships = append(content.Relationships, xlsxWorkbookRelation{
|
content.Relationships = append(content.Relationships, xlsxWorkbookRelation{
|
||||||
ID: ID.String(),
|
ID: ID.String(),
|
||||||
Target: target.String(),
|
Target: target.String(),
|
||||||
Type: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet",
|
Type: `http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet`,
|
||||||
})
|
})
|
||||||
output, err := xml.Marshal(content)
|
output, err := xml.Marshal(content)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -9,9 +9,9 @@ import (
|
||||||
const (
|
const (
|
||||||
// sheet state values as defined by
|
// sheet state values as defined by
|
||||||
// http://msdn.microsoft.com/en-us/library/office/documentformat.openxml.spreadsheet.sheetstatevalues.aspx
|
// http://msdn.microsoft.com/en-us/library/office/documentformat.openxml.spreadsheet.sheetstatevalues.aspx
|
||||||
sheetStateVisible = "visible"
|
sheetStateVisible = `visible`
|
||||||
sheetStateHidden = "hidden"
|
sheetStateHidden = `hidden`
|
||||||
sheetStateVeryHidden = "veryHidden"
|
sheetStateVeryHidden = `veryHidden`
|
||||||
)
|
)
|
||||||
|
|
||||||
// xmlxWorkbookRels contains xmlxWorkbookRelations
|
// xmlxWorkbookRels contains xmlxWorkbookRelations
|
||||||
|
|
Loading…
Reference in New Issue