Default row height compatibility with Apache OpenOffice and Kingsoft WPS, unit test update and typo fixed
This commit is contained in:
parent
3c8c8c55c8
commit
88de2f8d51
2
cell.go
2
cell.go
|
@ -517,7 +517,7 @@ func (f *File) SetCellHyperLink(sheet, axis, link, linkType string) error {
|
||||||
// }
|
// }
|
||||||
// if err := f.SetCellRichText("Sheet1", "A1", []excelize.RichTextRun{
|
// if err := f.SetCellRichText("Sheet1", "A1", []excelize.RichTextRun{
|
||||||
// {
|
// {
|
||||||
// Text: "blod",
|
// Text: "bold",
|
||||||
// Font: &excelize.Font{
|
// Font: &excelize.Font{
|
||||||
// Bold: true,
|
// Bold: true,
|
||||||
// Color: "2354e8",
|
// Color: "2354e8",
|
||||||
|
|
|
@ -190,7 +190,7 @@ func TestSetCellRichText(t *testing.T) {
|
||||||
assert.NoError(t, f.SetColWidth("Sheet1", "A", "A", 44))
|
assert.NoError(t, f.SetColWidth("Sheet1", "A", "A", 44))
|
||||||
richTextRun := []RichTextRun{
|
richTextRun := []RichTextRun{
|
||||||
{
|
{
|
||||||
Text: "blod",
|
Text: "bold",
|
||||||
Font: &Font{
|
Font: &Font{
|
||||||
Bold: true,
|
Bold: true,
|
||||||
Color: "2354e8",
|
Color: "2354e8",
|
||||||
|
|
1
col.go
1
col.go
|
@ -25,6 +25,7 @@ import (
|
||||||
// Define the default cell size and EMU unit of measurement.
|
// Define the default cell size and EMU unit of measurement.
|
||||||
const (
|
const (
|
||||||
defaultColWidthPixels float64 = 64
|
defaultColWidthPixels float64 = 64
|
||||||
|
defaultRowHeight float64 = 15
|
||||||
defaultRowHeightPixels float64 = 20
|
defaultRowHeightPixels float64 = 20
|
||||||
EMU int = 9525
|
EMU int = 9525
|
||||||
)
|
)
|
||||||
|
|
18
drawing.go
18
drawing.go
|
@ -59,10 +59,10 @@ func (f *File) prepareChartSheetDrawing(xlsx *xlsxChartsheet, drawingID int, she
|
||||||
func (f *File) addChart(formatSet *formatChart, comboCharts []*formatChart) {
|
func (f *File) addChart(formatSet *formatChart, comboCharts []*formatChart) {
|
||||||
count := f.countCharts()
|
count := f.countCharts()
|
||||||
xlsxChartSpace := xlsxChartSpace{
|
xlsxChartSpace := xlsxChartSpace{
|
||||||
XMLNSc: NameSpaceDrawingMLChart,
|
XMLNSc: NameSpaceDrawingMLChart.Value,
|
||||||
XMLNSa: NameSpaceDrawingML,
|
XMLNSa: NameSpaceDrawingML.Value,
|
||||||
XMLNSr: SourceRelationship.Value,
|
XMLNSr: SourceRelationship.Value,
|
||||||
XMLNSc16r2: SourceRelationshipChart201506,
|
XMLNSc16r2: SourceRelationshipChart201506.Value,
|
||||||
Date1904: &attrValBool{Val: boolPtr(false)},
|
Date1904: &attrValBool{Val: boolPtr(false)},
|
||||||
Lang: &attrValString{Val: stringPtr("en-US")},
|
Lang: &attrValString{Val: stringPtr("en-US")},
|
||||||
RoundedCorners: &attrValBool{Val: boolPtr(false)},
|
RoundedCorners: &attrValBool{Val: boolPtr(false)},
|
||||||
|
@ -1143,8 +1143,8 @@ func (f *File) drawingParser(path string) (*xlsxWsDr, int) {
|
||||||
|
|
||||||
if f.Drawings[path] == nil {
|
if f.Drawings[path] == nil {
|
||||||
content := xlsxWsDr{}
|
content := xlsxWsDr{}
|
||||||
content.A = NameSpaceDrawingML
|
content.A = NameSpaceDrawingML.Value
|
||||||
content.Xdr = NameSpaceDrawingMLSpreadSheet
|
content.Xdr = NameSpaceDrawingMLSpreadSheet.Value
|
||||||
if _, ok = f.XLSX[path]; ok { // Append Model
|
if _, ok = f.XLSX[path]; ok { // Append Model
|
||||||
decodeWsDr := decodeWsDr{}
|
decodeWsDr := decodeWsDr{}
|
||||||
if err = f.xmlNewDecoder(bytes.NewReader(namespaceStrictToTransitional(f.readXML(path)))).
|
if err = f.xmlNewDecoder(bytes.NewReader(namespaceStrictToTransitional(f.readXML(path)))).
|
||||||
|
@ -1210,9 +1210,9 @@ func (f *File) addDrawingChart(sheet, drawingXML, cell string, width, height, rI
|
||||||
},
|
},
|
||||||
Graphic: &xlsxGraphic{
|
Graphic: &xlsxGraphic{
|
||||||
GraphicData: &xlsxGraphicData{
|
GraphicData: &xlsxGraphicData{
|
||||||
URI: NameSpaceDrawingMLChart,
|
URI: NameSpaceDrawingMLChart.Value,
|
||||||
Chart: &xlsxChart{
|
Chart: &xlsxChart{
|
||||||
C: NameSpaceDrawingMLChart,
|
C: NameSpaceDrawingMLChart.Value,
|
||||||
R: SourceRelationship.Value,
|
R: SourceRelationship.Value,
|
||||||
RID: "rId" + strconv.Itoa(rID),
|
RID: "rId" + strconv.Itoa(rID),
|
||||||
},
|
},
|
||||||
|
@ -1250,9 +1250,9 @@ func (f *File) addSheetDrawingChart(drawingXML string, rID int, formatSet *forma
|
||||||
},
|
},
|
||||||
Graphic: &xlsxGraphic{
|
Graphic: &xlsxGraphic{
|
||||||
GraphicData: &xlsxGraphicData{
|
GraphicData: &xlsxGraphicData{
|
||||||
URI: NameSpaceDrawingMLChart,
|
URI: NameSpaceDrawingMLChart.Value,
|
||||||
Chart: &xlsxChart{
|
Chart: &xlsxChart{
|
||||||
C: NameSpaceDrawingMLChart,
|
C: NameSpaceDrawingMLChart.Value,
|
||||||
R: SourceRelationship.Value,
|
R: SourceRelationship.Value,
|
||||||
RID: "rId" + strconv.Itoa(rID),
|
RID: "rId" + strconv.Itoa(rID),
|
||||||
},
|
},
|
||||||
|
|
2
merge.go
2
merge.go
|
@ -97,6 +97,7 @@ func (f *File) MergeCell(sheet, hcell, vcell string) error {
|
||||||
} else {
|
} else {
|
||||||
xlsx.MergeCells = &xlsxMergeCells{Cells: []*xlsxMergeCell{{Ref: ref}}}
|
xlsx.MergeCells = &xlsxMergeCells{Cells: []*xlsxMergeCell{{Ref: ref}}}
|
||||||
}
|
}
|
||||||
|
xlsx.MergeCells.Count = len(xlsx.MergeCells.Cells)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -146,6 +147,7 @@ func (f *File) UnmergeCell(sheet string, hcell, vcell string) error {
|
||||||
i++
|
i++
|
||||||
}
|
}
|
||||||
xlsx.MergeCells.Cells = xlsx.MergeCells.Cells[:i]
|
xlsx.MergeCells.Cells = xlsx.MergeCells.Cells[:i]
|
||||||
|
xlsx.MergeCells.Count = len(xlsx.MergeCells.Cells)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
17
rows.go
17
rows.go
|
@ -262,21 +262,24 @@ func (f *File) GetRowHeight(sheet string, row int) (float64, error) {
|
||||||
if row < 1 {
|
if row < 1 {
|
||||||
return defaultRowHeightPixels, newInvalidRowNumberError(row)
|
return defaultRowHeightPixels, newInvalidRowNumberError(row)
|
||||||
}
|
}
|
||||||
|
var ht = defaultRowHeight
|
||||||
xlsx, err := f.workSheetReader(sheet)
|
ws, err := f.workSheetReader(sheet)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return defaultRowHeightPixels, err
|
return ht, err
|
||||||
}
|
}
|
||||||
if row > len(xlsx.SheetData.Row) {
|
if ws.SheetFormatPr != nil {
|
||||||
return defaultRowHeightPixels, nil // it will be better to use 0, but we take care with BC
|
ht = ws.SheetFormatPr.DefaultRowHeight
|
||||||
}
|
}
|
||||||
for _, v := range xlsx.SheetData.Row {
|
if row > len(ws.SheetData.Row) {
|
||||||
|
return ht, nil // it will be better to use 0, but we take care with BC
|
||||||
|
}
|
||||||
|
for _, v := range ws.SheetData.Row {
|
||||||
if v.R == row && v.Ht != 0 {
|
if v.R == row && v.Ht != 0 {
|
||||||
return v.Ht, nil
|
return v.Ht, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Optimisation for when the row heights haven't changed.
|
// Optimisation for when the row heights haven't changed.
|
||||||
return defaultRowHeightPixels, nil
|
return ht, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// sharedStringsReader provides a function to get the pointer to the structure
|
// sharedStringsReader provides a function to get the pointer to the structure
|
||||||
|
|
|
@ -112,12 +112,12 @@ func TestRowHeight(t *testing.T) {
|
||||||
// Test get row height that rows index over exists rows.
|
// Test get row height that rows index over exists rows.
|
||||||
height, err = xlsx.GetRowHeight(sheet1, 5)
|
height, err = xlsx.GetRowHeight(sheet1, 5)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, defaultRowHeightPixels, height)
|
assert.Equal(t, defaultRowHeight, height)
|
||||||
|
|
||||||
// Test get row height that rows heights haven't changed.
|
// Test get row height that rows heights haven't changed.
|
||||||
height, err = xlsx.GetRowHeight(sheet1, 3)
|
height, err = xlsx.GetRowHeight(sheet1, 3)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, defaultRowHeightPixels, height)
|
assert.Equal(t, defaultRowHeight, height)
|
||||||
|
|
||||||
// Test set and get row height on not exists worksheet.
|
// Test set and get row height on not exists worksheet.
|
||||||
assert.EqualError(t, xlsx.SetRowHeight("SheetN", 1, 111.0), "sheet SheetN is not exist")
|
assert.EqualError(t, xlsx.SetRowHeight("SheetN", 1, 111.0), "sheet SheetN is not exist")
|
||||||
|
|
8
sheet.go
8
sheet.go
|
@ -1630,13 +1630,19 @@ func (f *File) relsReader(path string) *xlsxRelationships {
|
||||||
func prepareSheetXML(xlsx *xlsxWorksheet, col int, row int) {
|
func prepareSheetXML(xlsx *xlsxWorksheet, col int, row int) {
|
||||||
rowCount := len(xlsx.SheetData.Row)
|
rowCount := len(xlsx.SheetData.Row)
|
||||||
sizeHint := 0
|
sizeHint := 0
|
||||||
|
var ht float64
|
||||||
|
var customHeight bool
|
||||||
|
if xlsx.SheetFormatPr != nil {
|
||||||
|
ht = xlsx.SheetFormatPr.DefaultRowHeight
|
||||||
|
customHeight = true
|
||||||
|
}
|
||||||
if rowCount > 0 {
|
if rowCount > 0 {
|
||||||
sizeHint = len(xlsx.SheetData.Row[rowCount-1].C)
|
sizeHint = len(xlsx.SheetData.Row[rowCount-1].C)
|
||||||
}
|
}
|
||||||
if rowCount < row {
|
if rowCount < row {
|
||||||
// append missing rows
|
// append missing rows
|
||||||
for rowIdx := rowCount; rowIdx < row; rowIdx++ {
|
for rowIdx := rowCount; rowIdx < row; rowIdx++ {
|
||||||
xlsx.SheetData.Row = append(xlsx.SheetData.Row, xlsxRow{R: rowIdx + 1, C: make([]xlsxC, 0, sizeHint)})
|
xlsx.SheetData.Row = append(xlsx.SheetData.Row, xlsxRow{R: rowIdx + 1, CustomHeight: customHeight, Ht: ht, C: make([]xlsxC, 0, sizeHint)})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rowData := &xlsx.SheetData.Row[row-1]
|
rowData := &xlsx.SheetData.Row[row-1]
|
||||||
|
|
|
@ -441,7 +441,7 @@ func (f *File) AddSparkline(sheet string, opt *SparklineOption) (err error) {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
groups = &xlsxX14SparklineGroups{
|
groups = &xlsxX14SparklineGroups{
|
||||||
XMLNSXM: NameSpaceSpreadSheetExcel2006Main,
|
XMLNSXM: NameSpaceSpreadSheetExcel2006Main.Value,
|
||||||
SparklineGroups: []*xlsxX14SparklineGroup{group},
|
SparklineGroups: []*xlsxX14SparklineGroup{group},
|
||||||
}
|
}
|
||||||
if sparklineGroupsBytes, err = xml.Marshal(groups); err != nil {
|
if sparklineGroupsBytes, err = xml.Marshal(groups); err != nil {
|
||||||
|
@ -525,7 +525,7 @@ func (f *File) appendSparkline(ws *xlsxWorksheet, group *xlsxX14SparklineGroup,
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
groups = &xlsxX14SparklineGroups{
|
groups = &xlsxX14SparklineGroups{
|
||||||
XMLNSXM: NameSpaceSpreadSheetExcel2006Main,
|
XMLNSXM: NameSpaceSpreadSheetExcel2006Main.Value,
|
||||||
Content: decodeSparklineGroups.Content + string(sparklineGroupBytes),
|
Content: decodeSparklineGroups.Content + string(sparklineGroupBytes),
|
||||||
}
|
}
|
||||||
if sparklineGroupsBytes, err = xml.Marshal(groups); err != nil {
|
if sparklineGroupsBytes, err = xml.Marshal(groups); err != nil {
|
||||||
|
|
|
@ -13,12 +13,22 @@ package excelize
|
||||||
|
|
||||||
import "encoding/xml"
|
import "encoding/xml"
|
||||||
|
|
||||||
// Source relationship and namespace.
|
// Source relationship and namespace list, associated prefixes and schema in which it was
|
||||||
|
// introduced.
|
||||||
var (
|
var (
|
||||||
SourceRelationship = xml.Attr{Name: xml.Name{Local: "r", Space: "xmlns"}, Value: "http://schemas.openxmlformats.org/officeDocument/2006/relationships"}
|
SourceRelationship = xml.Attr{Name: xml.Name{Local: "r", Space: "xmlns"}, Value: "http://schemas.openxmlformats.org/officeDocument/2006/relationships"}
|
||||||
SourceRelationshipCompatibility = xml.Attr{Name: xml.Name{Local: "mc", Space: "xmlns"}, Value: "http://schemas.openxmlformats.org/markup-compatibility/2006"}
|
SourceRelationshipCompatibility = xml.Attr{Name: xml.Name{Local: "mc", Space: "xmlns"}, Value: "http://schemas.openxmlformats.org/markup-compatibility/2006"}
|
||||||
NameSpaceSpreadSheet = xml.Attr{Name: xml.Name{Local: "xmlns"}, Value: "http://schemas.openxmlformats.org/spreadsheetml/2006/main"}
|
SourceRelationshipChart20070802 = xml.Attr{Name: xml.Name{Local: "c14", Space: "xmlns"}, Value: "http://schemas.microsoft.com/office/drawing/2007/8/2/chart"}
|
||||||
NameSpaceSpreadSheetX14 = xml.Attr{Name: xml.Name{Local: "x14", Space: "xmlns"}, Value: "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"}
|
SourceRelationshipChart2014 = xml.Attr{Name: xml.Name{Local: "c16", Space: "xmlns"}, Value: "http://schemas.microsoft.com/office/drawing/2014/chart"}
|
||||||
|
SourceRelationshipChart201506 = xml.Attr{Name: xml.Name{Local: "c16r2", Space: "xmlns"}, Value: "http://schemas.microsoft.com/office/drawing/2015/06/chart"}
|
||||||
|
NameSpaceSpreadSheet = xml.Attr{Name: xml.Name{Local: "xmlns"}, Value: "http://schemas.openxmlformats.org/spreadsheetml/2006/main"}
|
||||||
|
NameSpaceSpreadSheetX14 = xml.Attr{Name: xml.Name{Local: "x14", Space: "xmlns"}, Value: "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"}
|
||||||
|
NameSpaceDrawingML = xml.Attr{Name: xml.Name{Local: "a", Space: "xmlns"}, Value: "http://schemas.openxmlformats.org/drawingml/2006/main"}
|
||||||
|
NameSpaceDrawingMLChart = xml.Attr{Name: xml.Name{Local: "c", Space: "xmlns"}, Value: "http://schemas.openxmlformats.org/drawingml/2006/chart"}
|
||||||
|
NameSpaceDrawingMLSpreadSheet = xml.Attr{Name: xml.Name{Local: "xdr", Space: "xmlns"}, Value: "http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing"}
|
||||||
|
NameSpaceSpreadSheetX15 = xml.Attr{Name: xml.Name{Local: "x15", Space: "xmlns"}, Value: "http://schemas.microsoft.com/office/spreadsheetml/2010/11/main"}
|
||||||
|
NameSpaceSpreadSheetExcel2006Main = xml.Attr{Name: xml.Name{Local: "xne", Space: "xmlns"}, Value: "http://schemas.microsoft.com/office/excel/2006/main"}
|
||||||
|
NameSpaceMacExcel2008Main = xml.Attr{Name: xml.Name{Local: "mx", Space: "xmlns"}, Value: "http://schemas.microsoft.com/office/mac/excel/2008/main"}
|
||||||
)
|
)
|
||||||
|
|
||||||
// Source relationship and namespace.
|
// Source relationship and namespace.
|
||||||
|
@ -37,15 +47,6 @@ const (
|
||||||
SourceRelationshipPivotCache = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotCacheDefinition"
|
SourceRelationshipPivotCache = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotCacheDefinition"
|
||||||
SourceRelationshipSharedStrings = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings"
|
SourceRelationshipSharedStrings = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings"
|
||||||
SourceRelationshipVBAProject = "http://schemas.microsoft.com/office/2006/relationships/vbaProject"
|
SourceRelationshipVBAProject = "http://schemas.microsoft.com/office/2006/relationships/vbaProject"
|
||||||
SourceRelationshipChart201506 = "http://schemas.microsoft.com/office/drawing/2015/06/chart"
|
|
||||||
SourceRelationshipChart20070802 = "http://schemas.microsoft.com/office/drawing/2007/8/2/chart"
|
|
||||||
SourceRelationshipChart2014 = "http://schemas.microsoft.com/office/drawing/2014/chart"
|
|
||||||
NameSpaceDrawingML = "http://schemas.openxmlformats.org/drawingml/2006/main"
|
|
||||||
NameSpaceDrawingMLChart = "http://schemas.openxmlformats.org/drawingml/2006/chart"
|
|
||||||
NameSpaceDrawingMLSpreadSheet = "http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing"
|
|
||||||
NameSpaceSpreadSheetX15 = "http://schemas.microsoft.com/office/spreadsheetml/2010/11/main"
|
|
||||||
NameSpaceSpreadSheetExcel2006Main = "http://schemas.microsoft.com/office/excel/2006/main"
|
|
||||||
NameSpaceMacExcel2008Main = "http://schemas.microsoft.com/office/mac/excel/2008/main"
|
|
||||||
NameSpaceXML = "http://www.w3.org/XML/1998/namespace"
|
NameSpaceXML = "http://www.w3.org/XML/1998/namespace"
|
||||||
NameSpaceXMLSchemaInstance = "http://www.w3.org/2001/XMLSchema-instance"
|
NameSpaceXMLSchemaInstance = "http://www.w3.org/2001/XMLSchema-instance"
|
||||||
StrictSourceRelationship = "http://purl.oclc.org/ooxml/officeDocument/relationships"
|
StrictSourceRelationship = "http://purl.oclc.org/ooxml/officeDocument/relationships"
|
||||||
|
|
Loading…
Reference in New Issue