summaryrefslogtreecommitdiff
path: root/sheet.go
diff options
context:
space:
mode:
authorAlex Geer <monoflash@gmail.com>2019-12-19 19:30:48 +0300
committerxuri <xuri.me@gmail.com>2019-12-20 00:30:48 +0800
commitb1b3c0d15158abc71267da5893de020f047c3872 (patch)
tree53f9e5a1f42130825572a3c3eea39b2eb4d00f62 /sheet.go
parenta00ba75f0f294ce04bfe8d25703d13cd27d6284f (diff)
Fix #539 Fixed error opening excel file created in encoding d… (#540)
* Fixed issue #539 Fixed error opening excel file created in encoding different from UTF-8, added logging of possible errors when decoding XML if the function does not provide exit with an error * Added test for CharsetReader * Fixed #discussion_r359397878 Discussion: https://github.com/360EntSecGroup-Skylar/excelize/pull/540#discussion_r359397878 * Fixed go fmt * go mod tidy and removed unused imports * The code has been refactored
Diffstat (limited to 'sheet.go')
-rw-r--r--sheet.go78
1 files changed, 53 insertions, 25 deletions
diff --git a/sheet.go b/sheet.go
index 951baf9..42fd6b3 100644
--- a/sheet.go
+++ b/sheet.go
@@ -15,7 +15,9 @@ import (
"encoding/xml"
"errors"
"fmt"
+ "io"
"io/ioutil"
+ "log"
"os"
"path"
"reflect"
@@ -61,11 +63,16 @@ func (f *File) NewSheet(name string) int {
// contentTypesReader provides a function to get the pointer to the
// [Content_Types].xml structure after deserialization.
func (f *File) contentTypesReader() *xlsxTypes {
+ var err error
+
if f.ContentTypes == nil {
- var content xlsxTypes
- _ = xml.Unmarshal(namespaceStrictToTransitional(f.readXML("[Content_Types].xml")), &content)
- f.ContentTypes = &content
+ f.ContentTypes = new(xlsxTypes)
+ if err = f.xmlNewDecoder(bytes.NewReader(namespaceStrictToTransitional(f.readXML("[Content_Types].xml")))).
+ Decode(f.ContentTypes); err != nil && err != io.EOF {
+ log.Printf("xml decode error: %s", err)
+ }
}
+
return f.ContentTypes
}
@@ -81,11 +88,16 @@ func (f *File) contentTypesWriter() {
// workbookReader provides a function to get the pointer to the xl/workbook.xml
// structure after deserialization.
func (f *File) workbookReader() *xlsxWorkbook {
+ var err error
+
if f.WorkBook == nil {
- var content xlsxWorkbook
- _ = xml.Unmarshal(namespaceStrictToTransitional(f.readXML("xl/workbook.xml")), &content)
- f.WorkBook = &content
+ f.WorkBook = new(xlsxWorkbook)
+ if err = f.xmlNewDecoder(bytes.NewReader(namespaceStrictToTransitional(f.readXML("xl/workbook.xml")))).
+ Decode(f.WorkBook); err != nil && err != io.EOF {
+ log.Printf("xml decode error: %s", err)
+ }
}
+
return f.WorkBook
}
@@ -679,42 +691,51 @@ func (f *File) GetSheetVisible(name string) bool {
//
// result, err := f.SearchSheet("Sheet1", "[0-9]", true)
//
-func (f *File) SearchSheet(sheet, value string, reg ...bool) ([]string, error) {
+func (f *File) SearchSheet(sheet, value string, reg ...bool) (result []string, err error) {
var (
- regSearch bool
- result []string
+ xlsx *xlsxWorksheet
+ regSearch, r, ok bool
+ name string
+ output []byte
)
- for _, r := range reg {
+
+ for _, r = range reg {
regSearch = r
}
- xlsx, err := f.workSheetReader(sheet)
- if err != nil {
- return result, err
+ if xlsx, err = f.workSheetReader(sheet); err != nil {
+ return
}
- name, ok := f.sheetMap[trimSheetName(sheet)]
- if !ok {
- return result, nil
+ if name, ok = f.sheetMap[trimSheetName(sheet)]; !ok {
+ return
}
if xlsx != nil {
- output, _ := xml.Marshal(f.Sheet[name])
+ if output, err = xml.Marshal(f.Sheet[name]); err != nil {
+ return
+ }
f.saveFileList(name, replaceWorkSheetsRelationshipsNameSpaceBytes(output))
}
+
return f.searchSheet(name, value, regSearch)
}
// searchSheet provides a function to get coordinates by given worksheet name,
// cell value, and regular expression.
-func (f *File) searchSheet(name, value string, regSearch bool) ([]string, error) {
+func (f *File) searchSheet(name, value string, regSearch bool) (result []string, err error) {
var (
+ d *xlsxSST
+ decoder *xml.Decoder
inElement string
- result []string
r xlsxRow
+ token xml.Token
)
- d := f.sharedStringsReader()
- decoder := xml.NewDecoder(bytes.NewReader(f.readXML(name)))
+
+ d = f.sharedStringsReader()
+ decoder = f.xmlNewDecoder(bytes.NewReader(f.readXML(name)))
for {
- token, _ := decoder.Token()
- if token == nil {
+ if token, err = decoder.Token(); err != nil || token == nil {
+ if err == io.EOF {
+ err = nil
+ }
break
}
switch startElement := token.(type) {
@@ -750,7 +771,8 @@ func (f *File) searchSheet(name, value string, regSearch bool) ([]string, error)
default:
}
}
- return result, nil
+
+ return
}
// SetHeaderFooter provides a function to set headers and footers by given
@@ -1360,14 +1382,20 @@ func (f *File) UngroupSheets() error {
// relsReader provides a function to get the pointer to the structure
// after deserialization of xl/worksheets/_rels/sheet%d.xml.rels.
func (f *File) relsReader(path string) *xlsxRelationships {
+ var err error
+
if f.Relationships[path] == nil {
_, ok := f.XLSX[path]
if ok {
c := xlsxRelationships{}
- _ = xml.Unmarshal(namespaceStrictToTransitional(f.readXML(path)), &c)
+ if err = f.xmlNewDecoder(bytes.NewReader(namespaceStrictToTransitional(f.readXML(path)))).
+ Decode(&c); err != nil && err != io.EOF {
+ log.Printf("xml decode error: %s", err)
+ }
f.Relationships[path] = &c
}
}
+
return f.Relationships[path]
}