forked from p30928647/excelize
Fixe issue generated file corrupted caused by incorrect default XML namespace attributes
This commit is contained in:
parent
af5e87dbcf
commit
7e429c5b46
|
@ -204,7 +204,7 @@ func main() {
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
Contributions are welcome! Open a pull request to fix a bug, or open an issue to discuss a new feature or change. XML is compliant with [part 1 of the 5th edition of the ECMA-376 Standard for Office Open XML](http://www.ecma-international.org/publications/standards/Ecma-376.htm).
|
Contributions are welcome! Open a pull request to fix a bug, or open an issue to discuss a new feature or change. XML is compliant with [part 1 of the 5th edition of the ECMA-376 Standard for Office Open XML](https://www.ecma-international.org/publications-and-standards/standards/ecma-376/).
|
||||||
|
|
||||||
## Licenses
|
## Licenses
|
||||||
|
|
||||||
|
|
|
@ -204,7 +204,7 @@ func main() {
|
||||||
|
|
||||||
## 社区合作
|
## 社区合作
|
||||||
|
|
||||||
欢迎您为此项目贡献代码,提出建议或问题、修复 Bug 以及参与讨论对新功能的想法。 XML 符合标准: [part 1 of the 5th edition of the ECMA-376 Standard for Office Open XML](http://www.ecma-international.org/publications/standards/Ecma-376.htm)。
|
欢迎您为此项目贡献代码,提出建议或问题、修复 Bug 以及参与讨论对新功能的想法。 XML 符合标准: [part 1 of the 5th edition of the ECMA-376 Standard for Office Open XML](https://www.ecma-international.org/publications-and-standards/standards/ecma-376/)。
|
||||||
|
|
||||||
## 开源许可
|
## 开源许可
|
||||||
|
|
||||||
|
|
|
@ -54,7 +54,7 @@ func TestOpenFile(t *testing.T) {
|
||||||
|
|
||||||
assert.NoError(t, f.SetCellStr("Sheet2", "C11", "Knowns"))
|
assert.NoError(t, f.SetCellStr("Sheet2", "C11", "Knowns"))
|
||||||
// Test max characters in a cell.
|
// Test max characters in a cell.
|
||||||
assert.NoError(t, f.SetCellStr("Sheet2", "D11", strings.Repeat("c", 32769)))
|
assert.NoError(t, f.SetCellStr("Sheet2", "D11", strings.Repeat("c", TotalCellChars+2)))
|
||||||
f.NewSheet(":\\/?*[]Maximum 31 characters allowed in sheet title.")
|
f.NewSheet(":\\/?*[]Maximum 31 characters allowed in sheet title.")
|
||||||
// Test set worksheet name with illegal name.
|
// Test set worksheet name with illegal name.
|
||||||
f.SetSheetName("Maximum 31 characters allowed i", "[Rename]:\\/?* Maximum 31 characters allowed in sheet title.")
|
f.SetSheetName("Maximum 31 characters allowed i", "[Rename]:\\/?* Maximum 31 characters allowed in sheet title.")
|
||||||
|
|
3
lib.go
3
lib.go
|
@ -349,6 +349,9 @@ func genXMLNamespace(attr []xml.Attr) string {
|
||||||
var rootElement string
|
var rootElement string
|
||||||
for _, v := range attr {
|
for _, v := range attr {
|
||||||
if lastSpace := getXMLNamespace(v.Name.Space, attr); lastSpace != "" {
|
if lastSpace := getXMLNamespace(v.Name.Space, attr); lastSpace != "" {
|
||||||
|
if lastSpace == NameSpaceXML {
|
||||||
|
lastSpace = "xml"
|
||||||
|
}
|
||||||
rootElement += fmt.Sprintf("%s:%s=\"%s\" ", lastSpace, v.Name.Local, v.Value)
|
rootElement += fmt.Sprintf("%s:%s=\"%s\" ", lastSpace, v.Name.Local, v.Value)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
|
@ -228,3 +228,9 @@ func TestStack(t *testing.T) {
|
||||||
assert.Equal(t, s.Peek(), nil)
|
assert.Equal(t, s.Peek(), nil)
|
||||||
assert.Equal(t, s.Pop(), nil)
|
assert.Equal(t, s.Pop(), nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGenXMLNamespace(t *testing.T) {
|
||||||
|
assert.Equal(t, genXMLNamespace([]xml.Attr{
|
||||||
|
{Name: xml.Name{Space: NameSpaceXML, Local: "space"}, Value: "preserve"},
|
||||||
|
}), `xml:space="preserve">`)
|
||||||
|
}
|
||||||
|
|
10
stream.go
10
stream.go
|
@ -40,8 +40,9 @@ type StreamWriter struct {
|
||||||
// generate new worksheet with large amounts of data. Note that after set
|
// generate new worksheet with large amounts of data. Note that after set
|
||||||
// rows, you must call the 'Flush' method to end the streaming writing
|
// rows, you must call the 'Flush' method to end the streaming writing
|
||||||
// process and ensure that the order of line numbers is ascending, the common
|
// process and ensure that the order of line numbers is ascending, the common
|
||||||
// API and stream API can't be work mixed to writing data on the worksheets.
|
// API and stream API can't be work mixed to writing data on the worksheets,
|
||||||
// For example, set data for worksheet of size 102400 rows x 50 columns with
|
// you can't get cell value when in-memory chunks data over 16MB. For
|
||||||
|
// example, set data for worksheet of size 102400 rows x 50 columns with
|
||||||
// numbers and style:
|
// numbers and style:
|
||||||
//
|
//
|
||||||
// file := excelize.NewFile()
|
// file := excelize.NewFile()
|
||||||
|
@ -111,7 +112,7 @@ func (f *File) NewStreamWriter(sheet string) (*StreamWriter, error) {
|
||||||
// AddTable creates an Excel table for the StreamWriter using the given
|
// AddTable creates an Excel table for the StreamWriter using the given
|
||||||
// coordinate area and format set. For example, create a table of A1:D5:
|
// coordinate area and format set. For example, create a table of A1:D5:
|
||||||
//
|
//
|
||||||
// err := sw.AddTable("A1", "D5", ``)
|
// err := sw.AddTable("A1", "D5", "")
|
||||||
//
|
//
|
||||||
// Create a table of F2:H6 with format set:
|
// Create a table of F2:H6 with format set:
|
||||||
//
|
//
|
||||||
|
@ -500,8 +501,7 @@ func (bw *bufferedWriter) Reader() (io.Reader, error) {
|
||||||
// buffer has grown large enough. Any error will be returned.
|
// buffer has grown large enough. Any error will be returned.
|
||||||
func (bw *bufferedWriter) Sync() (err error) {
|
func (bw *bufferedWriter) Sync() (err error) {
|
||||||
// Try to use local storage
|
// Try to use local storage
|
||||||
const chunk = 1 << 24
|
if bw.buf.Len() < StreamChunkSize {
|
||||||
if bw.buf.Len() < chunk {
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if bw.tmp == nil {
|
if bw.tmp == nil {
|
||||||
|
|
|
@ -40,7 +40,7 @@ func TestStreamWriter(t *testing.T) {
|
||||||
|
|
||||||
// Test max characters in a cell.
|
// Test max characters in a cell.
|
||||||
row := make([]interface{}, 1)
|
row := make([]interface{}, 1)
|
||||||
row[0] = strings.Repeat("c", 32769)
|
row[0] = strings.Repeat("c", TotalCellChars+2)
|
||||||
assert.NoError(t, streamWriter.SetRow("A1", row))
|
assert.NoError(t, streamWriter.SetRow("A1", row))
|
||||||
|
|
||||||
// Test leading and ending space(s) character characters in a cell.
|
// Test leading and ending space(s) character characters in a cell.
|
||||||
|
@ -100,6 +100,16 @@ func TestStreamWriter(t *testing.T) {
|
||||||
file.XLSX["xl/worksheets/sheet1.xml"] = MacintoshCyrillicCharset
|
file.XLSX["xl/worksheets/sheet1.xml"] = MacintoshCyrillicCharset
|
||||||
_, err = file.NewStreamWriter("Sheet1")
|
_, err = file.NewStreamWriter("Sheet1")
|
||||||
assert.EqualError(t, err, "xml decode error: XML syntax error on line 1: invalid UTF-8")
|
assert.EqualError(t, err, "xml decode error: XML syntax error on line 1: invalid UTF-8")
|
||||||
|
|
||||||
|
// Test read cell.
|
||||||
|
file = NewFile()
|
||||||
|
streamWriter, err = file.NewStreamWriter("Sheet1")
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.NoError(t, streamWriter.SetRow("A1", []interface{}{Cell{StyleID: styleID, Value: "Data"}}))
|
||||||
|
assert.NoError(t, streamWriter.Flush())
|
||||||
|
cellValue, err := file.GetCellValue("Sheet1", "A1")
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, "Data", cellValue)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestStreamTable(t *testing.T) {
|
func TestStreamTable(t *testing.T) {
|
||||||
|
|
|
@ -2187,17 +2187,16 @@ func (f *File) newFont(style *Style) *xlsxFont {
|
||||||
Family: &attrValInt{Val: intPtr(2)},
|
Family: &attrValInt{Val: intPtr(2)},
|
||||||
}
|
}
|
||||||
if style.Font.Bold {
|
if style.Font.Bold {
|
||||||
fnt.B = &style.Font.Bold
|
fnt.B = &attrValBool{Val: &style.Font.Bold}
|
||||||
}
|
}
|
||||||
if style.Font.Italic {
|
if style.Font.Italic {
|
||||||
fnt.I = &style.Font.Italic
|
fnt.I = &attrValBool{Val: &style.Font.Italic}
|
||||||
}
|
}
|
||||||
if *fnt.Name.Val == "" {
|
if *fnt.Name.Val == "" {
|
||||||
*fnt.Name.Val = f.GetDefaultFont()
|
*fnt.Name.Val = f.GetDefaultFont()
|
||||||
}
|
}
|
||||||
if style.Font.Strike {
|
if style.Font.Strike {
|
||||||
strike := true
|
fnt.Strike = &attrValBool{Val: &style.Font.Strike}
|
||||||
fnt.Strike = &strike
|
|
||||||
}
|
}
|
||||||
val, ok := fontUnderlineType[style.Font.Underline]
|
val, ok := fontUnderlineType[style.Font.Underline]
|
||||||
if ok {
|
if ok {
|
||||||
|
|
2
table.go
2
table.go
|
@ -35,7 +35,7 @@ func parseFormatTableSet(formatSet string) (*formatTable, error) {
|
||||||
// name, coordinate area and format set. For example, create a table of A1:D5
|
// name, coordinate area and format set. For example, create a table of A1:D5
|
||||||
// on Sheet1:
|
// on Sheet1:
|
||||||
//
|
//
|
||||||
// err := f.AddTable("Sheet1", "A1", "D5", ``)
|
// err := f.AddTable("Sheet1", "A1", "D5", "")
|
||||||
//
|
//
|
||||||
// Create a table of F2:H6 on Sheet2 with format set:
|
// Create a table of F2:H6 on Sheet2 with format set:
|
||||||
//
|
//
|
||||||
|
|
|
@ -91,6 +91,7 @@ const (
|
||||||
|
|
||||||
// Excel specifications and limits
|
// Excel specifications and limits
|
||||||
const (
|
const (
|
||||||
|
StreamChunkSize = 1 << 24
|
||||||
MaxFontFamilyLength = 31
|
MaxFontFamilyLength = 31
|
||||||
MaxFontSize = 409
|
MaxFontSize = 409
|
||||||
MaxFileNameLength = 207
|
MaxFileNameLength = 207
|
||||||
|
|
14
xmlStyles.go
14
xmlStyles.go
|
@ -83,13 +83,13 @@ type xlsxFonts struct {
|
||||||
// xlsxFont directly maps the font element. This element defines the
|
// xlsxFont directly maps the font element. This element defines the
|
||||||
// properties for one of the fonts used in this workbook.
|
// properties for one of the fonts used in this workbook.
|
||||||
type xlsxFont struct {
|
type xlsxFont struct {
|
||||||
B *bool `xml:"b,omitempty"`
|
B *attrValBool `xml:"b,omitempty"`
|
||||||
I *bool `xml:"i,omitempty"`
|
I *attrValBool `xml:"i,omitempty"`
|
||||||
Strike *bool `xml:"strike,omitempty"`
|
Strike *attrValBool `xml:"strike,omitempty"`
|
||||||
Outline *bool `xml:"outline,omitempty"`
|
Outline *attrValBool `xml:"outline,omitempty"`
|
||||||
Shadow *bool `xml:"shadow,omitempty"`
|
Shadow *attrValBool `xml:"shadow,omitempty"`
|
||||||
Condense *bool `xml:"condense,omitempty"`
|
Condense *attrValBool `xml:"condense,omitempty"`
|
||||||
Extend *bool `xml:"extend,omitempty"`
|
Extend *attrValBool `xml:"extend,omitempty"`
|
||||||
U *attrValString `xml:"u"`
|
U *attrValString `xml:"u"`
|
||||||
Sz *attrValFloat `xml:"sz"`
|
Sz *attrValFloat `xml:"sz"`
|
||||||
Color *xlsxColor `xml:"color"`
|
Color *xlsxColor `xml:"color"`
|
||||||
|
|
Loading…
Reference in New Issue