提交 2e8fa2d3 编写于 作者: xurime's avatar xurime

Use conjunction with strings.Map to split Axis and update godoc.

上级 cbfd6577
...@@ -10,7 +10,7 @@ import ( ...@@ -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)
......
...@@ -52,8 +52,8 @@ func (f *File) SetCellValue(sheet string, axis string, value interface{}) { ...@@ -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) { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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.
......
...@@ -7,8 +7,6 @@ import ( ...@@ -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) { ...@@ -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) { ...@@ -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 { ...@@ -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(""))))
if err != nil {
log.Fatal(err)
} }
return row return -1
} }
...@@ -9,8 +9,8 @@ import ( ...@@ -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) { ...@@ -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) { ...@@ -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 ( ...@@ -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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册