Explorar el Código

Restore File.Sheet and File.Sheets to their respective meanings to ensure API stability.

Geoffrey J. Teale hace 11 años
padre
commit
d1581978ed
Se han modificado 7 ficheros con 45 adiciones y 22 borrados
  1. 10 4
      file.go
  2. 18 5
      file_test.go
  3. 13 9
      lib.go
  4. 1 1
      lib_test.go
  5. 1 1
      macExcel_test.go
  6. 1 1
      macNumbers_test.go
  7. 1 1
      wpsBlankLine_test.go

+ 10 - 4
file.go

@@ -17,14 +17,16 @@ type File struct {
 	referenceTable *RefTable
 	Date1904       bool
 	styles         *xlsxStyles
-	Sheets        map[string]*Sheet
+	Sheets       []*Sheet
+	Sheet        map[string]*Sheet
 }
 
 
 // Create a new File
 func NewFile() (file *File) {
 	file = &File{};
-	file.Sheets = make(map[string]*Sheet)
+	file.Sheet = make(map[string]*Sheet)
+	file.Sheets = make([]*Sheet, 0)
 	return
 }
 
@@ -39,6 +41,7 @@ func OpenFile(filename string) (*File, error) {
 	return ReadZip(f)
 }
 
+// Save the File to an xlsx file at the provided path.
 func (f *File) Save(path string) (err error) {
 	var parts map[string]string
 	var target *os.File
@@ -79,7 +82,8 @@ func (f *File) Save(path string) (err error) {
 // Add a new Sheet, with the provided name, to a File
 func (f *File) AddSheet(sheetName string) (sheet *Sheet) {
 	sheet = &Sheet{}
-	f.Sheets[sheetName] = sheet
+	f.Sheet[sheetName] = sheet
+	f.Sheets = append(f.Sheets, sheet)
 	return sheet
 }
 
@@ -98,6 +102,8 @@ func (f *File) makeWorkbook() xlsxWorkbook {
 }
 
 
+// Construct a map of file name to XML content representing the file
+// in terms of the structure of an XLSX file.
 func (f *File) MarshallParts() (map[string]string, error) {
 	var parts map[string]string
 	var refTable *RefTable = NewSharedStringRefTable()
@@ -119,7 +125,7 @@ func (f *File) MarshallParts() (map[string]string, error) {
 	workbook = f.makeWorkbook()
 	sheetIndex := 1
 
-	for sheetName, sheet := range f.Sheets {
+	for sheetName, sheet := range f.Sheet {
 		xSheet := sheet.makeXLSXSheet(refTable)
 		rId := fmt.Sprintf("rId%d", sheetIndex)
 		sheetId := strconv.Itoa(sheetIndex)

+ 18 - 5
file_test.go

@@ -136,7 +136,7 @@ func (l *FileSuite) TestReadWorkbookRelationsFromZipFile(c *C) {
 	xlsxFile, err = OpenFile("testfile.xlsx")
 	c.Assert(err, IsNil)
 	c.Assert(len(xlsxFile.Sheets), Equals, 3)
-	sheet, ok := xlsxFile.Sheets["Tabelle1"]
+	sheet, ok := xlsxFile.Sheet["Tabelle1"]
 	c.Assert(ok, Equals, true)
 	c.Assert(sheet, NotNil)
 }
@@ -150,7 +150,7 @@ func (l *FileSuite) TestGetStyleFromZipFile(c *C) {
 	sheetCount := len(xlsxFile.Sheets)
 	c.Assert(sheetCount, Equals, 3)
 
-	tabelle1 := xlsxFile.Sheets["Tabelle1"]
+	tabelle1 := xlsxFile.Sheet["Tabelle1"]
 
 	row0 := tabelle1.Rows[0]
 	cellFoo := row0.Cells[0]
@@ -190,7 +190,7 @@ func (l *FileSuite) TestCreateSheet(c *C) {
 	c.Assert(xlsxFile, NotNil)
 	sheetLen := len(xlsxFile.Sheets)
 	c.Assert(sheetLen, Equals, 3)
-	sheet = xlsxFile.Sheets["Tabelle1"]
+	sheet = xlsxFile.Sheet["Tabelle1"]
 	rowLen := len(sheet.Rows)
 	c.Assert(rowLen, Equals, 2)
 	row = sheet.Rows[0]
@@ -208,7 +208,20 @@ func (l *FileSuite) TestAddSheet(c *C) {
 	sheet := f.AddSheet("MySheet")
 	c.Assert(sheet, NotNil)
 	c.Assert(len(f.Sheets), Equals, 1)
-	c.Assert(f.Sheets["MySheet"], Equals, sheet)
+	c.Assert(f.Sheet["MySheet"], Equals, sheet)
+}
+
+// Test that we can get the Nth sheet
+func (l *FileSuite) TestNthSheet(c *C) {
+	var f *File
+
+	f = NewFile()
+	sheet := f.AddSheet("MySheet")
+	sheetByIndex := f.Sheets[0]
+	sheetByName := f.Sheet["MySheet"]
+	c.Assert(sheetByIndex, NotNil)
+	c.Assert(sheetByIndex, Equals, sheet)
+	c.Assert(sheetByIndex, Equals, sheetByName)
 }
 
 // Test that we can create a Workbook and marshal it to XML. 
@@ -392,7 +405,7 @@ func (l *FileSuite) TestSaveFile(c *C) {
 	c.Assert(xlsxFile, NotNil)
 	c.Assert(len(xlsxFile.Sheets), Equals, 2)
 
-	sheet1, ok := xlsxFile.Sheets["MySheet"]
+	sheet1, ok := xlsxFile.Sheet["MySheet"]
 	c.Assert(ok, Equals, true)
 	c.Assert(len(sheet1.Rows), Equals, 1)
 	row1 = sheet1.Rows[0]

+ 13 - 9
lib.go

@@ -416,7 +416,7 @@ func readSheetFromFile(sc chan *indexedSheet, index int, rsheet xlsxSheet, fi *F
 // 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, sheetXMLMap map[string]string) (map[string]*Sheet, error) {
+func readSheetsFromZipFile(f *zip.File, file *File, sheetXMLMap map[string]string) (map[string]*Sheet, []*Sheet, error) {
 	var workbook *xlsxWorkbook
 	var error error
 	var rc io.ReadCloser
@@ -425,16 +425,17 @@ func readSheetsFromZipFile(f *zip.File, file *File, sheetXMLMap map[string]strin
 	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
 	}
 	file.Date1904 = workbook.WorkbookPr.Date1904
 	sheetCount = len(workbook.Sheets.Sheet)
-	sheets := make(map[string]*Sheet, sheetCount)
+	sheetsByName := make(map[string]*Sheet, sheetCount)
+	sheets := make([]*Sheet, sheetCount)
 	sheetChan := make(chan *indexedSheet, sheetCount)
 	for i, rawsheet := range workbook.Sheets.Sheet {
 		go readSheetFromFile(sheetChan, i, rawsheet, file, sheetXMLMap)
@@ -442,11 +443,12 @@ func readSheetsFromZipFile(f *zip.File, file *File, sheetXMLMap map[string]strin
 	for j := 0; j < sheetCount; j++ {
 		sheet := <-sheetChan
 		if sheet.Error != nil {
-			return nil, sheet.Error
+			return nil, nil, sheet.Error
 		}
-		sheets[workbook.Sheets.Sheet[sheet.Index].Name] = sheet.Sheet
+		sheetsByName[workbook.Sheets.Sheet[sheet.Index].Name] = sheet.Sheet
+		sheets[j] = sheet.Sheet
 	}
-	return sheets, nil
+	return sheetsByName, sheets, nil
 }
 
 // readSharedStringsFromZipFile() is an internal helper function to
@@ -592,7 +594,8 @@ func ReadZipReader(r *zip.Reader) (*File, error) {
 	var reftable *RefTable
 	var sharedStrings *zip.File
 	var sheetXMLMap map[string]string
-	var sheets map[string]*Sheet
+	var sheetsByName map[string]*Sheet
+	var sheets []*Sheet
 	var style *xlsxStyles
 	var styles *zip.File
 	var v *zip.File
@@ -638,7 +641,7 @@ func ReadZipReader(r *zip.Reader) (*File, error) {
 
 		file.styles = style
 	}
-	sheets, err = readSheetsFromZipFile(workbook, file, sheetXMLMap)
+	sheetsByName, sheets, err = readSheetsFromZipFile(workbook, file, sheetXMLMap)
 	if err != nil {
 		return nil, err
 	}
@@ -647,6 +650,7 @@ func ReadZipReader(r *zip.Reader) (*File, error) {
 		readerErr.Err = "No sheets found in XLSX File"
 		return nil, readerErr
 	}
+	file.Sheet = sheetsByName
 	file.Sheets = sheets
 	return file, nil
 }

+ 1 - 1
lib_test.go

@@ -21,7 +21,7 @@ func (l *LibSuite) TestReadWorkbookRelationsFromZipFileWithFunnyNames(c *C) {
 
 	xlsxFile, err = OpenFile("testrels.xlsx")
 	c.Assert(err, IsNil)
-	bob := xlsxFile.Sheets["Bob"]
+	bob := xlsxFile.Sheet["Bob"]
 	row1 := bob.Rows[0]
 	cell1 := row1.Cells[0]
 	c.Assert(cell1.String(), Equals, "I am Bob")

+ 1 - 1
macExcel_test.go

@@ -16,6 +16,6 @@ func (m *MacExcelSuite) TestMacExcel(c *C) {
 	xlsxFile, err := OpenFile("macExcelTest.xlsx")
 	c.Assert(err, IsNil)
 	c.Assert(xlsxFile, NotNil)
-	s := xlsxFile.Sheets["普通技能"].Cell(0, 0).String()
+	s := xlsxFile.Sheet["普通技能"].Cell(0, 0).String()
 	c.Assert(s, Equals, "编号")
 }

+ 1 - 1
macNumbers_test.go

@@ -14,7 +14,7 @@ func (m *MacNumbersSuite) TestMacNumbers(c *C) {
 	xlsxFile, err := OpenFile("macNumbersTest.xlsx")
 	c.Assert(err, IsNil)
 	c.Assert(xlsxFile, NotNil)
-	sheet, ok := xlsxFile.Sheets["主动技能"]
+	sheet, ok := xlsxFile.Sheet["主动技能"]
 	c.Assert(ok, Equals, true)
 	s := sheet.Cell(0, 0).String()
 	c.Assert(s, Equals, "编号")

+ 1 - 1
wpsBlankLine_test.go

@@ -14,7 +14,7 @@ func (w *WpsBlankLineSuite) TestWpsBlankLine(c *C) {
 	xlsxFile, err := OpenFile("wpsBlankLineTest.xlsx")
 	c.Assert(err, IsNil)
 	c.Assert(xlsxFile, NotNil)
-	sheet := xlsxFile.Sheets["Sheet1"]
+	sheet := xlsxFile.Sheet["Sheet1"]
 	row := sheet.Rows[0]
 	cell := row.Cells[0]
 	s := cell.String()