Просмотр исходного кода

access by name

add sheet map so we can access by name
frogs 13 лет назад
Родитель
Сommit
7f3a4b520b
1 измененных файлов с 17 добавлено и 7 удалено
  1. 17 7
      lib.go

+ 17 - 7
lib.go

@@ -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
 }