forked from p30928647/excelize
resolve #276, add OfficeOpenXML-XMLSchema-Strict mode support
This commit is contained in:
parent
d8a34af384
commit
1c45425f12
2
chart.go
2
chart.go
|
@ -1097,7 +1097,7 @@ func (f *File) drawingParser(drawingXML string, content *xlsxWsDr) int {
|
||||||
_, ok := f.XLSX[drawingXML]
|
_, ok := f.XLSX[drawingXML]
|
||||||
if ok { // Append Model
|
if ok { // Append Model
|
||||||
decodeWsDr := decodeWsDr{}
|
decodeWsDr := decodeWsDr{}
|
||||||
_ = xml.Unmarshal([]byte(f.readXML(drawingXML)), &decodeWsDr)
|
_ = xml.Unmarshal(namespaceStrictToTransitional(f.readXML(drawingXML)), &decodeWsDr)
|
||||||
content.R = decodeWsDr.R
|
content.R = decodeWsDr.R
|
||||||
cNvPrID = len(decodeWsDr.OneCellAnchor) + len(decodeWsDr.TwoCellAnchor) + 1
|
cNvPrID = len(decodeWsDr.OneCellAnchor) + len(decodeWsDr.TwoCellAnchor) + 1
|
||||||
for _, v := range decodeWsDr.OneCellAnchor {
|
for _, v := range decodeWsDr.OneCellAnchor {
|
||||||
|
|
|
@ -100,7 +100,7 @@ func (f *File) workSheetReader(sheet string) *xlsxWorksheet {
|
||||||
}
|
}
|
||||||
if f.Sheet[name] == nil {
|
if f.Sheet[name] == nil {
|
||||||
var xlsx xlsxWorksheet
|
var xlsx xlsxWorksheet
|
||||||
_ = xml.Unmarshal(f.readXML(name), &xlsx)
|
_ = xml.Unmarshal(namespaceStrictToTransitional(f.readXML(name)), &xlsx)
|
||||||
if f.checked == nil {
|
if f.checked == nil {
|
||||||
f.checked = make(map[string]bool)
|
f.checked = make(map[string]bool)
|
||||||
}
|
}
|
||||||
|
|
16
lib.go
16
lib.go
|
@ -183,3 +183,19 @@ func parseFormatSet(formatSet string) []byte {
|
||||||
}
|
}
|
||||||
return []byte("{}")
|
return []byte("{}")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// namespaceStrictToTransitional provides a method to convert Strict and
|
||||||
|
// Transitional namespaces.
|
||||||
|
func namespaceStrictToTransitional(content []byte) []byte {
|
||||||
|
var namespaceTranslationDic = map[string]string{
|
||||||
|
StrictSourceRelationship: SourceRelationship,
|
||||||
|
StrictSourceRelationshipChart: SourceRelationshipChart,
|
||||||
|
StrictSourceRelationshipComments: SourceRelationshipComments,
|
||||||
|
StrictSourceRelationshipImage: SourceRelationshipImage,
|
||||||
|
StrictNameSpaceSpreadSheet: NameSpaceSpreadSheet,
|
||||||
|
}
|
||||||
|
for s, n := range namespaceTranslationDic {
|
||||||
|
content = bytes.Replace(content, []byte(s), []byte(n), -1)
|
||||||
|
}
|
||||||
|
return content
|
||||||
|
}
|
||||||
|
|
12
picture.go
12
picture.go
|
@ -185,7 +185,7 @@ func (f *File) addSheetRelationships(sheet, relType, target, targetMode string)
|
||||||
_, ok = f.XLSX[rels]
|
_, ok = f.XLSX[rels]
|
||||||
if ok {
|
if ok {
|
||||||
ID.Reset()
|
ID.Reset()
|
||||||
_ = xml.Unmarshal([]byte(f.readXML(rels)), &sheetRels)
|
_ = xml.Unmarshal(namespaceStrictToTransitional(f.readXML(rels)), &sheetRels)
|
||||||
rID = len(sheetRels.Relationships) + 1
|
rID = len(sheetRels.Relationships) + 1
|
||||||
ID.WriteString("rId")
|
ID.WriteString("rId")
|
||||||
ID.WriteString(strconv.Itoa(rID))
|
ID.WriteString(strconv.Itoa(rID))
|
||||||
|
@ -211,7 +211,7 @@ func (f *File) deleteSheetRelationships(sheet, rID string) {
|
||||||
}
|
}
|
||||||
var rels = "xl/worksheets/_rels/" + strings.TrimPrefix(name, "xl/worksheets/") + ".rels"
|
var rels = "xl/worksheets/_rels/" + strings.TrimPrefix(name, "xl/worksheets/") + ".rels"
|
||||||
var sheetRels xlsxWorkbookRels
|
var sheetRels xlsxWorkbookRels
|
||||||
_ = xml.Unmarshal([]byte(f.readXML(rels)), &sheetRels)
|
_ = xml.Unmarshal(namespaceStrictToTransitional(f.readXML(rels)), &sheetRels)
|
||||||
for k, v := range sheetRels.Relationships {
|
for k, v := range sheetRels.Relationships {
|
||||||
if v.ID == rID {
|
if v.ID == rID {
|
||||||
sheetRels.Relationships = append(sheetRels.Relationships[:k], sheetRels.Relationships[k+1:]...)
|
sheetRels.Relationships = append(sheetRels.Relationships[:k], sheetRels.Relationships[k+1:]...)
|
||||||
|
@ -328,7 +328,7 @@ func (f *File) addDrawingRelationships(index int, relType, target, targetMode st
|
||||||
_, ok := f.XLSX[rels]
|
_, ok := f.XLSX[rels]
|
||||||
if ok {
|
if ok {
|
||||||
ID.Reset()
|
ID.Reset()
|
||||||
_ = xml.Unmarshal([]byte(f.readXML(rels)), &drawingRels)
|
_ = xml.Unmarshal(namespaceStrictToTransitional(f.readXML(rels)), &drawingRels)
|
||||||
rID = len(drawingRels.Relationships) + 1
|
rID = len(drawingRels.Relationships) + 1
|
||||||
ID.WriteString("rId")
|
ID.WriteString("rId")
|
||||||
ID.WriteString(strconv.Itoa(rID))
|
ID.WriteString(strconv.Itoa(rID))
|
||||||
|
@ -448,7 +448,7 @@ func (f *File) getSheetRelationshipsTargetByID(sheet, rID string) string {
|
||||||
}
|
}
|
||||||
var rels = "xl/worksheets/_rels/" + strings.TrimPrefix(name, "xl/worksheets/") + ".rels"
|
var rels = "xl/worksheets/_rels/" + strings.TrimPrefix(name, "xl/worksheets/") + ".rels"
|
||||||
var sheetRels xlsxWorkbookRels
|
var sheetRels xlsxWorkbookRels
|
||||||
_ = xml.Unmarshal([]byte(f.readXML(rels)), &sheetRels)
|
_ = xml.Unmarshal(namespaceStrictToTransitional(f.readXML(rels)), &sheetRels)
|
||||||
for _, v := range sheetRels.Relationships {
|
for _, v := range sheetRels.Relationships {
|
||||||
if v.ID == rID {
|
if v.ID == rID {
|
||||||
return v.Target
|
return v.Target
|
||||||
|
@ -488,7 +488,7 @@ func (f *File) GetPicture(sheet, cell string) (string, []byte) {
|
||||||
return "", nil
|
return "", nil
|
||||||
}
|
}
|
||||||
decodeWsDr := decodeWsDr{}
|
decodeWsDr := decodeWsDr{}
|
||||||
_ = xml.Unmarshal([]byte(f.readXML(drawingXML)), &decodeWsDr)
|
_ = xml.Unmarshal(namespaceStrictToTransitional(f.readXML(drawingXML)), &decodeWsDr)
|
||||||
|
|
||||||
cell = strings.ToUpper(cell)
|
cell = strings.ToUpper(cell)
|
||||||
fromCol := string(strings.Map(letterOnlyMapF, cell))
|
fromCol := string(strings.Map(letterOnlyMapF, cell))
|
||||||
|
@ -523,7 +523,7 @@ func (f *File) getDrawingRelationships(rels, rID string) *xlsxWorkbookRelation {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
var drawingRels xlsxWorkbookRels
|
var drawingRels xlsxWorkbookRels
|
||||||
_ = xml.Unmarshal([]byte(f.readXML(rels)), &drawingRels)
|
_ = xml.Unmarshal(namespaceStrictToTransitional(f.readXML(rels)), &drawingRels)
|
||||||
for _, v := range drawingRels.Relationships {
|
for _, v := range drawingRels.Relationships {
|
||||||
if v.ID == rID {
|
if v.ID == rID {
|
||||||
return &v
|
return &v
|
||||||
|
|
8
sheet.go
8
sheet.go
|
@ -51,7 +51,7 @@ func (f *File) NewSheet(name string) int {
|
||||||
func (f *File) contentTypesReader() *xlsxTypes {
|
func (f *File) contentTypesReader() *xlsxTypes {
|
||||||
if f.ContentTypes == nil {
|
if f.ContentTypes == nil {
|
||||||
var content xlsxTypes
|
var content xlsxTypes
|
||||||
_ = xml.Unmarshal([]byte(f.readXML("[Content_Types].xml")), &content)
|
_ = xml.Unmarshal(namespaceStrictToTransitional(f.readXML("[Content_Types].xml")), &content)
|
||||||
f.ContentTypes = &content
|
f.ContentTypes = &content
|
||||||
}
|
}
|
||||||
return f.ContentTypes
|
return f.ContentTypes
|
||||||
|
@ -71,7 +71,7 @@ func (f *File) contentTypesWriter() {
|
||||||
func (f *File) workbookReader() *xlsxWorkbook {
|
func (f *File) workbookReader() *xlsxWorkbook {
|
||||||
if f.WorkBook == nil {
|
if f.WorkBook == nil {
|
||||||
var content xlsxWorkbook
|
var content xlsxWorkbook
|
||||||
_ = xml.Unmarshal([]byte(f.readXML("xl/workbook.xml")), &content)
|
_ = xml.Unmarshal(namespaceStrictToTransitional(f.readXML("xl/workbook.xml")), &content)
|
||||||
f.WorkBook = &content
|
f.WorkBook = &content
|
||||||
}
|
}
|
||||||
return f.WorkBook
|
return f.WorkBook
|
||||||
|
@ -162,7 +162,7 @@ func (f *File) setWorkbook(name string, rid int) {
|
||||||
func (f *File) workbookRelsReader() *xlsxWorkbookRels {
|
func (f *File) workbookRelsReader() *xlsxWorkbookRels {
|
||||||
if f.WorkBookRels == nil {
|
if f.WorkBookRels == nil {
|
||||||
var content xlsxWorkbookRels
|
var content xlsxWorkbookRels
|
||||||
_ = xml.Unmarshal([]byte(f.readXML("xl/_rels/workbook.xml.rels")), &content)
|
_ = xml.Unmarshal(namespaceStrictToTransitional(f.readXML("xl/_rels/workbook.xml.rels")), &content)
|
||||||
f.WorkBookRels = &content
|
f.WorkBookRels = &content
|
||||||
}
|
}
|
||||||
return f.WorkBookRels
|
return f.WorkBookRels
|
||||||
|
@ -267,7 +267,7 @@ func (f *File) GetActiveSheetIndex() int {
|
||||||
buffer.WriteString("xl/worksheets/sheet")
|
buffer.WriteString("xl/worksheets/sheet")
|
||||||
buffer.WriteString(strings.TrimPrefix(v.ID, "rId"))
|
buffer.WriteString(strings.TrimPrefix(v.ID, "rId"))
|
||||||
buffer.WriteString(".xml")
|
buffer.WriteString(".xml")
|
||||||
_ = xml.Unmarshal([]byte(f.readXML(buffer.String())), &xlsx)
|
_ = xml.Unmarshal(namespaceStrictToTransitional(f.readXML(buffer.String())), &xlsx)
|
||||||
for _, sheetView := range xlsx.SheetViews.SheetView {
|
for _, sheetView := range xlsx.SheetViews.SheetView {
|
||||||
if sheetView.TabSelected {
|
if sheetView.TabSelected {
|
||||||
ID, _ := strconv.Atoi(strings.TrimPrefix(v.ID, "rId"))
|
ID, _ := strconv.Atoi(strings.TrimPrefix(v.ID, "rId"))
|
||||||
|
|
|
@ -999,7 +999,7 @@ func is12HourTime(format string) bool {
|
||||||
func (f *File) stylesReader() *xlsxStyleSheet {
|
func (f *File) stylesReader() *xlsxStyleSheet {
|
||||||
if f.Styles == nil {
|
if f.Styles == nil {
|
||||||
var styleSheet xlsxStyleSheet
|
var styleSheet xlsxStyleSheet
|
||||||
_ = xml.Unmarshal([]byte(f.readXML("xl/styles.xml")), &styleSheet)
|
_ = xml.Unmarshal(namespaceStrictToTransitional(f.readXML("xl/styles.xml")), &styleSheet)
|
||||||
f.Styles = &styleSheet
|
f.Styles = &styleSheet
|
||||||
}
|
}
|
||||||
return f.Styles
|
return f.Styles
|
||||||
|
@ -2757,7 +2757,7 @@ func getPaletteColor(color string) string {
|
||||||
// structure after deserialization.
|
// structure after deserialization.
|
||||||
func (f *File) themeReader() *xlsxTheme {
|
func (f *File) themeReader() *xlsxTheme {
|
||||||
var theme xlsxTheme
|
var theme xlsxTheme
|
||||||
_ = xml.Unmarshal([]byte(f.readXML("xl/theme/theme1.xml")), &theme)
|
_ = xml.Unmarshal(namespaceStrictToTransitional(f.readXML("xl/theme/theme1.xml")), &theme)
|
||||||
return &theme
|
return &theme
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
BIN
test/Book1.xlsx
BIN
test/Book1.xlsx
Binary file not shown.
|
@ -13,24 +13,29 @@ import "encoding/xml"
|
||||||
|
|
||||||
// Source relationship and namespace.
|
// Source relationship and namespace.
|
||||||
const (
|
const (
|
||||||
SourceRelationship = "http://schemas.openxmlformats.org/officeDocument/2006/relationships"
|
SourceRelationship = "http://schemas.openxmlformats.org/officeDocument/2006/relationships"
|
||||||
SourceRelationshipChart = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart"
|
SourceRelationshipChart = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart"
|
||||||
SourceRelationshipComments = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments"
|
SourceRelationshipComments = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments"
|
||||||
SourceRelationshipImage = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image"
|
SourceRelationshipImage = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image"
|
||||||
SourceRelationshipTable = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/table"
|
SourceRelationshipTable = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/table"
|
||||||
SourceRelationshipDrawingML = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing"
|
SourceRelationshipDrawingML = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing"
|
||||||
SourceRelationshipDrawingVML = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing"
|
SourceRelationshipDrawingVML = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing"
|
||||||
SourceRelationshipHyperLink = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink"
|
SourceRelationshipHyperLink = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink"
|
||||||
SourceRelationshipWorkSheet = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet"
|
SourceRelationshipWorkSheet = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet"
|
||||||
SourceRelationshipChart201506 = "http://schemas.microsoft.com/office/drawing/2015/06/chart"
|
SourceRelationshipChart201506 = "http://schemas.microsoft.com/office/drawing/2015/06/chart"
|
||||||
SourceRelationshipChart20070802 = "http://schemas.microsoft.com/office/drawing/2007/8/2/chart"
|
SourceRelationshipChart20070802 = "http://schemas.microsoft.com/office/drawing/2007/8/2/chart"
|
||||||
SourceRelationshipChart2014 = "http://schemas.microsoft.com/office/drawing/2014/chart"
|
SourceRelationshipChart2014 = "http://schemas.microsoft.com/office/drawing/2014/chart"
|
||||||
SourceRelationshipCompatibility = "http://schemas.openxmlformats.org/markup-compatibility/2006"
|
SourceRelationshipCompatibility = "http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
NameSpaceDrawingML = "http://schemas.openxmlformats.org/drawingml/2006/main"
|
NameSpaceDrawingML = "http://schemas.openxmlformats.org/drawingml/2006/main"
|
||||||
NameSpaceDrawingMLChart = "http://schemas.openxmlformats.org/drawingml/2006/chart"
|
NameSpaceDrawingMLChart = "http://schemas.openxmlformats.org/drawingml/2006/chart"
|
||||||
NameSpaceDrawingMLSpreadSheet = "http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing"
|
NameSpaceDrawingMLSpreadSheet = "http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing"
|
||||||
NameSpaceSpreadSheet = "http://schemas.openxmlformats.org/spreadsheetml/2006/main"
|
NameSpaceSpreadSheet = "http://schemas.openxmlformats.org/spreadsheetml/2006/main"
|
||||||
NameSpaceXML = "http://www.w3.org/XML/1998/namespace"
|
NameSpaceXML = "http://www.w3.org/XML/1998/namespace"
|
||||||
|
StrictSourceRelationship = "http://purl.oclc.org/ooxml/officeDocument/relationships"
|
||||||
|
StrictSourceRelationshipChart = "http://purl.oclc.org/ooxml/officeDocument/relationships/chart"
|
||||||
|
StrictSourceRelationshipComments = "http://purl.oclc.org/ooxml/officeDocument/relationships/comments"
|
||||||
|
StrictSourceRelationshipImage = "http://purl.oclc.org/ooxml/officeDocument/relationships/image"
|
||||||
|
StrictNameSpaceSpreadSheet = "http://purl.oclc.org/ooxml/spreadsheetml/main"
|
||||||
)
|
)
|
||||||
|
|
||||||
var supportImageTypes = map[string]string{".gif": ".gif", ".jpg": ".jpeg", ".jpeg": ".jpeg", ".png": ".png"}
|
var supportImageTypes = map[string]string{".gif": ".gif", ".jpg": ".jpeg", ".jpeg": ".jpeg", ".png": ".png"}
|
||||||
|
|
Loading…
Reference in New Issue