- Get cell value support

- Optimisation code use fmt package
- Update README
- Remove useless function
This commit is contained in:
Ri Xu 2016-08-30 21:54:28 +08:00
parent 0d60020f96
commit 3c4ad28db7
7 changed files with 94 additions and 43 deletions

View File

@ -16,8 +16,6 @@ Excelize is a library written in pure Golang and providing a set of function tha
### Installation
Golang version requirements 1.6.0 or higher.
```
go get github.com/Luxurioust/excelize
```

40
cell.go Normal file
View File

@ -0,0 +1,40 @@
package excelize
import (
"encoding/xml"
"strconv"
"strings"
)
// Get value from cell by given sheet index and axis in XLSX file
func GetCellValue(file []FileList, sheet string, axis string) string {
axis = strings.ToUpper(axis)
var xlsx xlsxWorksheet
row := getRowIndex(axis)
xAxis := row - 1
name := `xl/worksheets/` + strings.ToLower(sheet) + `.xml`
xml.Unmarshal([]byte(readXml(file, name)), &xlsx)
rows := len(xlsx.SheetData.Row)
if rows <= xAxis {
return ``
}
for _, v := range xlsx.SheetData.Row[xAxis].C {
if xlsx.SheetData.Row[xAxis].R == row {
if axis == v.R {
switch v.T {
case "s":
shardStrings := xlsxSST{}
xlsxSI := 0
xlsxSI, _ = strconv.Atoi(v.V)
xml.Unmarshal([]byte(readXml(file, `xl/sharedStrings.xml`)), &shardStrings)
return shardStrings.SI[xlsxSI].T
case "str":
return v.V
default:
return v.V
}
}
}
}
return ``
}

View File

@ -34,7 +34,7 @@ func SetCellInt(file []FileList, sheet string, axis string, value int) []FileLis
xAxis := row - 1
yAxis := titleToNumber(col)
name := fmt.Sprintf("xl/worksheets/%s.xml", strings.ToLower(sheet))
name := `xl/worksheets/` + strings.ToLower(sheet) + `.xml`
xml.Unmarshal([]byte(readXml(file, name)), &xlsx)
rows := xAxis + 1
@ -65,7 +65,7 @@ func SetCellStr(file []FileList, sheet string, axis string, value string) []File
xAxis := row - 1
yAxis := titleToNumber(col)
name := fmt.Sprintf("xl/worksheets/%s.xml", strings.ToLower(sheet))
name := `xl/worksheets/` + strings.ToLower(sheet) + `.xml`
xml.Unmarshal([]byte(readXml(file, name)), &xlsx)
rows := xAxis + 1

View File

@ -1,7 +1,6 @@
package excelize
import (
"fmt"
"strconv"
"testing"
)
@ -10,7 +9,7 @@ func TestExcelize(t *testing.T) {
// Test update a XLSX file
file, err := OpenFile("./test/Workbook1.xlsx")
if err != nil {
fmt.Println(err)
t.Error(err)
}
file = SetCellInt(file, "SHEET2", "B2", 100)
file = SetCellStr(file, "SHEET2", "C11", "Knowns")
@ -19,21 +18,31 @@ func TestExcelize(t *testing.T) {
file = SetCellStr(file, "SHEET3", "b230", "10")
file = SetActiveSheet(file, 2)
if err != nil {
fmt.Println(err)
t.Error(err)
}
for i := 1; i <= 300; i++ {
file = SetCellStr(file, "SHEET3", fmt.Sprintf("c%d", i), strconv.Itoa(i))
file = SetCellStr(file, "SHEET3", "c"+strconv.Itoa(i), strconv.Itoa(i))
}
err = Save(file, "./test/Workbook_2.xlsx")
// Test create a XLSX file
file2 := CreateFile()
file2 = NewSheet(file2, 2, "SHEETxxx")
file2 = NewSheet(file2, 3, "asd")
file2 = NewSheet(file2, 2, "TestSheet2")
file2 = NewSheet(file2, 3, "TestSheet3")
file2 = SetCellInt(file2, "Sheet2", "A23", 10)
file2 = SetCellStr(file2, "SHEET1", "B20", "10")
err = Save(file2, "./test/Workbook_3.xlsx")
if err != nil {
fmt.Println(err)
t.Error(err)
}
// Test read cell value
file, err = OpenFile("./test/Workbook1.xlsx")
if err != nil {
t.Error(err)
}
GetCellValue(file, "Sheet2", "a5")
GetCellValue(file, "Sheet2", "D11")
GetCellValue(file, "Sheet2", "D12")
GetCellValue(file, "Sheet2", "E12")
}

View File

@ -29,7 +29,7 @@ func setContentTypes(file []FileList, index int) []FileList {
var content xlsxTypes
xml.Unmarshal([]byte(readXml(file, `[Content_Types].xml`)), &content)
content.Overrides = append(content.Overrides, xlsxOverride{
PartName: fmt.Sprintf("/xl/worksheets/sheet%d.xml", index),
PartName: `/xl/worksheets/sheet` + strconv.Itoa(index) + `.xml`,
ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml",
})
output, err := xml.MarshalIndent(content, "", "")
@ -50,7 +50,7 @@ func setSheet(file []FileList, index int) []FileList {
if err != nil {
fmt.Println(err)
}
path := fmt.Sprintf("xl/worksheets/sheet%d.xml", index)
path := `xl/worksheets/sheet` + strconv.Itoa(index) + `.xml`
return saveFileList(file, path, replaceRelationshipsID(replaceWorkSheetsRelationshipsNameSpace(string(output))))
}
@ -86,7 +86,7 @@ func addXlsxWorkbookRels(file []FileList, sheet int) []FileList {
rId := len(content.Relationships) + 1
content.Relationships = append(content.Relationships, xlsxWorkbookRelation{
Id: "rId" + strconv.Itoa(rId),
Target: fmt.Sprintf("worksheets/sheet%d.xml", sheet),
Target: `worksheets/sheet` + strconv.Itoa(sheet) + `.xml`,
Type: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet",
})
output, err := xml.MarshalIndent(content, "", "")
@ -150,7 +150,7 @@ func SetActiveSheet(file []FileList, index int) []FileList {
for i := 0; i < sheets; i++ {
xlsx := xlsxWorksheet{}
sheetIndex := i + 1
path := fmt.Sprintf("xl/worksheets/sheet%d.xml", sheetIndex)
path := `xl/worksheets/sheet` + strconv.Itoa(sheetIndex) + `.xml`
xml.Unmarshal([]byte(readXml(file, path)), &xlsx)
if index == sheetIndex {
if len(xlsx.SheetViews.SheetView) > 0 {

View File

@ -19,31 +19,3 @@ type xlsxDefault struct {
Extension string `xml:",attr"`
ContentType string `xml:",attr"`
}
func MakeDefaultContentTypes() (types xlsxTypes) {
types.Overrides = make([]xlsxOverride, 8)
types.Defaults = make([]xlsxDefault, 2)
types.Overrides[0].PartName = "/_rels/.rels"
types.Overrides[0].ContentType = "application/vnd.openxmlformats-package.relationships+xml"
types.Overrides[1].PartName = "/docProps/app.xml"
types.Overrides[1].ContentType = "application/vnd.openxmlformats-officedocument.extended-properties+xml"
types.Overrides[2].PartName = "/docProps/core.xml"
types.Overrides[2].ContentType = "application/vnd.openxmlformats-package.core-properties+xml"
types.Overrides[3].PartName = "/xl/_rels/workbook.xml.rels"
types.Overrides[3].ContentType = "application/vnd.openxmlformats-package.relationships+xml"
types.Overrides[4].PartName = "/xl/sharedStrings.xml"
types.Overrides[4].ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml"
types.Overrides[5].PartName = "/xl/styles.xml"
types.Overrides[5].ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml"
types.Overrides[6].PartName = "/xl/workbook.xml"
types.Overrides[6].ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"
types.Overrides[7].PartName = "/xl/theme/theme1.xml"
types.Overrides[7].ContentType = "application/vnd.openxmlformats-officedocument.theme+xml"
types.Defaults[0].Extension = "rels"
types.Defaults[0].ContentType = "application/vnd.openxmlformats-package.relationships+xml"
types.Defaults[1].Extension = "xml"
types.Defaults[1].ContentType = "application/xml"
return
}

32
xmlSharedStrings.go Normal file
View File

@ -0,0 +1,32 @@
package excelize
import (
"encoding/xml"
)
// xlsxSST directly maps the sst element from the namespace
// http://schemas.openxmlformats.org/spreadsheetml/2006/main currently
// I have not checked this for completeness - it does as much as I need.
type xlsxSST struct {
XMLName xml.Name `xml:"http://schemas.openxmlformats.org/spreadsheetml/2006/main sst"`
Count int `xml:"count,attr"`
UniqueCount int `xml:"uniqueCount,attr"`
SI []xlsxSI `xml:"si"`
}
// xlsxSI directly maps the si element from the namespace
// http://schemas.openxmlformats.org/spreadsheetml/2006/main -
// currently I have not checked this for completeness - it does as
// much as I need.
type xlsxSI struct {
T string `xml:"t"`
R []xlsxR `xml:"r"`
}
// xlsxR directly maps the r element from the namespace
// http://schemas.openxmlformats.org/spreadsheetml/2006/main -
// currently I have not checked this for completeness - it does as
// much as I need.
type xlsxR struct {
T string `xml:"t"`
}