|
|
@@ -55,7 +55,8 @@ type Sheet struct {
|
|
|
type File struct {
|
|
|
worksheets map[string]*zip.File
|
|
|
referenceTable []string
|
|
|
- Sheets []*Sheet
|
|
|
+ Sheets []*Sheet // sheet access by index
|
|
|
+ Sheet map[string]*Sheet // sheet access by name
|
|
|
}
|
|
|
|
|
|
// getRangeFromString is an internal helper function that converts
|
|
|
@@ -278,7 +279,7 @@ func readRowsFromSheet(Worksheet *xlsxWorksheet, reftable []string) []*Row {
|
|
|
// readSheetsFromZipFile is an internal helper function that loops
|
|
|
// over the Worksheets defined in the XSLXWorkbook and loads them into
|
|
|
// Sheet objects stored in the Sheets slice of a xlsx.File struct.
|
|
|
-func readSheetsFromZipFile(f *zip.File, file *File) ([]*Sheet, error) {
|
|
|
+func readSheetsFromZipFile(f *zip.File, file *File) ([]*Sheet, []string, error) {
|
|
|
var workbook *xlsxWorkbook
|
|
|
var error error
|
|
|
var rc io.ReadCloser
|
|
|
@@ -286,24 +287,26 @@ func readSheetsFromZipFile(f *zip.File, file *File) ([]*Sheet, error) {
|
|
|
workbook = new(xlsxWorkbook)
|
|
|
rc, error = f.Open()
|
|
|
if error != nil {
|
|
|
- return nil, error
|
|
|
+ return nil, nil, error
|
|
|
}
|
|
|
decoder = xml.NewDecoder(rc)
|
|
|
error = decoder.Decode(workbook)
|
|
|
if error != nil {
|
|
|
- return nil, error
|
|
|
+ return nil, nil, error
|
|
|
}
|
|
|
sheets := make([]*Sheet, len(workbook.Sheets.Sheet))
|
|
|
+ names := make([]string, len(workbook.Sheets.Sheet))
|
|
|
for i, rawsheet := range workbook.Sheets.Sheet {
|
|
|
worksheet, error := getWorksheetFromSheet(rawsheet, file.worksheets)
|
|
|
if error != nil {
|
|
|
- return nil, error
|
|
|
+ return nil, nil, error
|
|
|
}
|
|
|
sheet := new(Sheet)
|
|
|
sheet.Rows = readRowsFromSheet(worksheet, file.referenceTable)
|
|
|
sheets[i] = sheet
|
|
|
+ names[i] = rawsheet.Name
|
|
|
}
|
|
|
- return sheets, nil
|
|
|
+ return sheets, names, nil
|
|
|
}
|
|
|
|
|
|
// readSharedStringsFromZipFile() is an internal helper function to
|
|
|
@@ -341,6 +344,8 @@ func OpenFile(filename string) (x *File, e error) {
|
|
|
var reftable []string
|
|
|
var worksheets map[string]*zip.File
|
|
|
f, error = zip.OpenReader(filename)
|
|
|
+ var sheetMap map[string]*Sheet
|
|
|
+
|
|
|
if error != nil {
|
|
|
return nil, error
|
|
|
}
|
|
|
@@ -371,7 +376,7 @@ func OpenFile(filename string) (x *File, e error) {
|
|
|
return nil, error
|
|
|
}
|
|
|
file.referenceTable = reftable
|
|
|
- sheets, error := readSheetsFromZipFile(workbook, file)
|
|
|
+ sheets, names, error := readSheetsFromZipFile(workbook, file)
|
|
|
if error != nil {
|
|
|
return nil, error
|
|
|
}
|
|
|
@@ -381,6 +386,11 @@ func OpenFile(filename string) (x *File, e error) {
|
|
|
return nil, error
|
|
|
}
|
|
|
file.Sheets = sheets
|
|
|
+ sheetMap = make(map[string]*Sheet,len(names))
|
|
|
+ for i := 0; i < len(names); i++ {
|
|
|
+ sheetMap[names[i]] = sheets[i]
|
|
|
+ }
|
|
|
+ file.Sheet = sheetMap
|
|
|
f.Close()
|
|
|
return file, nil
|
|
|
}
|