summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cell.go55
-rw-r--r--cell_test.go54
-rw-r--r--comment.go3
-rw-r--r--xmlSharedStrings.go14
4 files changed, 115 insertions, 11 deletions
diff --git a/cell.go b/cell.go
index ae468e9..ea4e1d0 100644
--- a/cell.go
+++ b/cell.go
@@ -494,6 +494,54 @@ func (f *File) SetCellHyperLink(sheet, axis, link, linkType string) error {
return nil
}
+// GetCellRichText provides a function to get rich text of cell by given
+// worksheet.
+func (f *File) GetCellRichText(sheet, cell string) (runs []RichTextRun, err error) {
+ ws, err := f.workSheetReader(sheet)
+ if err != nil {
+ return
+ }
+ cellData, _, _, err := f.prepareCell(ws, sheet, cell)
+ if err != nil {
+ return
+ }
+ siIdx, err := strconv.Atoi(cellData.V)
+ if nil != err {
+ return
+ }
+ sst := f.sharedStringsReader()
+ if len(sst.SI) <= siIdx || siIdx < 0 {
+ return
+ }
+ si := sst.SI[siIdx]
+ for _, v := range si.R {
+ run := RichTextRun{
+ Text: v.T.Val,
+ }
+ if nil != v.RPr {
+ font := Font{}
+ font.Bold = v.RPr.B != nil
+ font.Italic = v.RPr.I != nil
+ if nil != v.RPr.U {
+ font.Underline = *v.RPr.U.Val
+ }
+ if nil != v.RPr.RFont {
+ font.Family = *v.RPr.RFont.Val
+ }
+ if nil != v.RPr.Sz {
+ font.Size = *v.RPr.Sz.Val
+ }
+ font.Strike = v.RPr.Strike != nil
+ if nil != v.RPr.Color {
+ font.Color = strings.TrimPrefix(v.RPr.Color.RGB, "FF")
+ }
+ run.Font = &font
+ }
+ runs = append(runs, run)
+ }
+ return
+}
+
// SetCellRichText provides a function to set cell with rich text by given
// worksheet. For example, set rich text on the A1 cell of the worksheet named
// Sheet1:
@@ -619,14 +667,15 @@ func (f *File) SetCellRichText(sheet, cell string, runs []RichTextRun) error {
fnt := textRun.Font
if fnt != nil {
rpr := xlsxRPr{}
+ trueVal := ""
if fnt.Bold {
- rpr.B = " "
+ rpr.B = &trueVal
}
if fnt.Italic {
- rpr.I = " "
+ rpr.I = &trueVal
}
if fnt.Strike {
- rpr.Strike = " "
+ rpr.Strike = &trueVal
}
if fnt.Underline != "" {
rpr.U = &attrValString{Val: &fnt.Underline}
diff --git a/cell_test.go b/cell_test.go
index c3c20f7..026189c 100644
--- a/cell_test.go
+++ b/cell_test.go
@@ -3,7 +3,9 @@ package excelize
import (
"fmt"
"path/filepath"
+ "reflect"
"strconv"
+ "strings"
"sync"
"testing"
"time"
@@ -221,7 +223,59 @@ func TestOverflowNumericCell(t *testing.T) {
// GOARCH=amd64 - all ok; GOARCH=386 - actual: "-2147483648"
assert.Equal(t, "8595602512225", val, "A1 should be 8595602512225")
}
+func TestGetCellRichText(t *testing.T) {
+ f := NewFile()
+ runsSource := []RichTextRun{
+ {
+ Text: "a\n",
+ },
+ {
+ Text: "b",
+ Font: &Font{
+ Underline: "single",
+ Color: "ff0000",
+ Bold: true,
+ Italic: true,
+ Family: "Times New Roman",
+ Size: 100,
+ Strike: true,
+ },
+ },
+ }
+ assert.NoError(t, f.SetCellRichText("Sheet1", "A1", runsSource))
+
+ runs, err := f.GetCellRichText("Sheet1", "A1")
+ assert.NoError(t, err)
+
+ assert.Equal(t, runsSource[0].Text, runs[0].Text)
+ assert.Nil(t, runs[0].Font)
+ assert.NotNil(t, runs[1].Font)
+
+ runsSource[1].Font.Color = strings.ToUpper(runsSource[1].Font.Color)
+ assert.True(t, reflect.DeepEqual(runsSource[1].Font, runs[1].Font), "should get the same font")
+
+ // Test get cell rich text when string item index overflow
+ f.Sheet["xl/worksheets/sheet1.xml"].SheetData.Row[0].C[0].V = "2"
+ runs, err = f.GetCellRichText("Sheet1", "A1")
+ assert.NoError(t, err)
+ assert.Equal(t, 0, len(runs))
+ // Test get cell rich text when string item index is negative
+ f.Sheet["xl/worksheets/sheet1.xml"].SheetData.Row[0].C[0].V = "-1"
+ runs, err = f.GetCellRichText("Sheet1", "A1")
+ assert.NoError(t, err)
+ assert.Equal(t, 0, len(runs))
+ // Test get cell rich text on invalid string item index
+ f.Sheet["xl/worksheets/sheet1.xml"].SheetData.Row[0].C[0].V = "x"
+ _, err = f.GetCellRichText("Sheet1", "A1")
+ assert.EqualError(t, err, "strconv.Atoi: parsing \"x\": invalid syntax")
+ // Test set cell rich text on not exists worksheet
+ _, err = f.GetCellRichText("SheetN", "A1")
+ assert.EqualError(t, err, "sheet SheetN is not exist")
+ // Test set cell rich text with illegal cell coordinates
+ _, err = f.GetCellRichText("Sheet1", "A")
+ assert.EqualError(t, err, `cannot convert cell "A" to coordinates: invalid cell name "A"`)
+}
func TestSetCellRichText(t *testing.T) {
f := NewFile()
assert.NoError(t, f.SetRowHeight("Sheet1", 1, 35))
diff --git a/comment.go b/comment.go
index 1ef3877..c897943 100644
--- a/comment.go
+++ b/comment.go
@@ -253,6 +253,7 @@ func (f *File) addComment(commentsXML, cell string, formatSet *formatComment) {
}
}
defaultFont := f.GetDefaultFont()
+ bold := ""
cmt := xlsxComment{
Ref: cell,
AuthorID: 0,
@@ -260,7 +261,7 @@ func (f *File) addComment(commentsXML, cell string, formatSet *formatComment) {
R: []xlsxR{
{
RPr: &xlsxRPr{
- B: " ",
+ B: &bold,
Sz: &attrValFloat{Val: float64Ptr(9)},
Color: &xlsxColor{
Indexed: 81,
diff --git a/xmlSharedStrings.go b/xmlSharedStrings.go
index f59119f..c9f311b 100644
--- a/xmlSharedStrings.go
+++ b/xmlSharedStrings.go
@@ -86,13 +86,13 @@ type xlsxRPr struct {
RFont *attrValString `xml:"rFont"`
Charset *attrValInt `xml:"charset"`
Family *attrValInt `xml:"family"`
- B string `xml:"b,omitempty"`
- I string `xml:"i,omitempty"`
- Strike string `xml:"strike,omitempty"`
- Outline string `xml:"outline,omitempty"`
- Shadow string `xml:"shadow,omitempty"`
- Condense string `xml:"condense,omitempty"`
- Extend string `xml:"extend,omitempty"`
+ B *string `xml:"b"`
+ I *string `xml:"i"`
+ Strike *string `xml:"strike"`
+ Outline *string `xml:"outline"`
+ Shadow *string `xml:"shadow"`
+ Condense *string `xml:"condense"`
+ Extend *string `xml:"extend"`
Color *xlsxColor `xml:"color"`
Sz *attrValFloat `xml:"sz"`
U *attrValString `xml:"u"`