add hyperlink and formula cell support
This commit is contained in:
106
worksheet.go
106
worksheet.go
@@ -4,6 +4,8 @@ import (
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"unicode/utf16"
|
||||
)
|
||||
|
||||
type Boundsheet struct {
|
||||
@@ -36,10 +38,10 @@ func (w *WorkSheet) Parse(buf io.ReadSeeker) {
|
||||
}
|
||||
|
||||
func (w *WorkSheet) parseBof(buf io.ReadSeeker, bof *BOF, pre *BOF) *BOF {
|
||||
var col Coler
|
||||
var col interface{}
|
||||
switch bof.Id {
|
||||
case 0x0E5: //MERGEDCELLS
|
||||
// ws.mergedCells(buf)
|
||||
// case 0x0E5: //MERGEDCELLS
|
||||
// ws.mergedCells(buf)
|
||||
case 0x208: //ROW
|
||||
r := new(RowInfo)
|
||||
binary.Read(buf, binary.LittleEndian, r)
|
||||
@@ -68,8 +70,11 @@ func (w *WorkSheet) parseBof(buf io.ReadSeeker, bof *BOF, pre *BOF) *BOF {
|
||||
col = new(NumberCol)
|
||||
binary.Read(buf, binary.LittleEndian, col)
|
||||
case 0x06: //FORMULA
|
||||
col = new(FormulaCol)
|
||||
binary.Read(buf, binary.LittleEndian, col)
|
||||
c := new(FormulaCol)
|
||||
binary.Read(buf, binary.LittleEndian, &c.Header)
|
||||
c.Bts = make([]byte, bof.Size-20)
|
||||
binary.Read(buf, binary.LittleEndian, &c.Bts)
|
||||
col = c
|
||||
case 0x27e: //RK
|
||||
col = new(RkCol)
|
||||
binary.Read(buf, binary.LittleEndian, col)
|
||||
@@ -79,16 +84,86 @@ func (w *WorkSheet) parseBof(buf io.ReadSeeker, bof *BOF, pre *BOF) *BOF {
|
||||
case 0x201: //BLANK
|
||||
col = new(BlankCol)
|
||||
binary.Read(buf, binary.LittleEndian, col)
|
||||
case 0x1b8: //HYPERLINK
|
||||
var hy HyperLink
|
||||
binary.Read(buf, binary.LittleEndian, &hy.CellRange)
|
||||
|
||||
buf.Seek(20, 1)
|
||||
var flag uint32
|
||||
binary.Read(buf, binary.LittleEndian, &flag)
|
||||
var count uint32
|
||||
|
||||
if flag&0x14 != 0 {
|
||||
binary.Read(buf, binary.LittleEndian, &count)
|
||||
var bts = make([]uint16, count)
|
||||
binary.Read(buf, binary.LittleEndian, &bts)
|
||||
runes := utf16.Decode(bts[:len(bts)-1])
|
||||
hy.Description = string(runes)
|
||||
}
|
||||
if flag&0x80 != 0 {
|
||||
binary.Read(buf, binary.LittleEndian, &count)
|
||||
var bts = make([]uint16, count)
|
||||
binary.Read(buf, binary.LittleEndian, &bts)
|
||||
runes := utf16.Decode(bts[:len(bts)-1])
|
||||
hy.TargetFrame = string(runes)
|
||||
}
|
||||
if flag&0x1 != 0 {
|
||||
var guid [2]uint64
|
||||
binary.Read(buf, binary.BigEndian, &guid)
|
||||
if guid[0] == 0xE0C9EA79F9BACE11 && guid[1] == 0x8C8200AA004BA90B { //URL
|
||||
binary.Read(buf, binary.LittleEndian, &count)
|
||||
var bts = make([]uint16, count/2)
|
||||
binary.Read(buf, binary.LittleEndian, &bts)
|
||||
runes := utf16.Decode(bts[:len(bts)-1])
|
||||
hy.Url = string(runes)
|
||||
} else {
|
||||
log.Panicln("not support yet")
|
||||
}
|
||||
}
|
||||
if flag&0x8 != 0 {
|
||||
binary.Read(buf, binary.LittleEndian, &count)
|
||||
var bts = make([]uint16, count)
|
||||
binary.Read(buf, binary.LittleEndian, &bts)
|
||||
runes := utf16.Decode(bts[:len(bts)-1])
|
||||
hy.TextMark = string(runes)
|
||||
}
|
||||
|
||||
w.addRange(&hy.CellRange, &hy)
|
||||
|
||||
//
|
||||
// bts := make([]byte, 20)
|
||||
// binary.Read(buf, binary.LittleEndian, bts)
|
||||
|
||||
//
|
||||
|
||||
// if flag&0x80 != 0 {
|
||||
// binary.Read(buf, binary.LittleEndian, &count)
|
||||
// var bts = make([]uint16, count)
|
||||
// binary.Read(buf, binary.LittleEndian, &bts)
|
||||
// runes := utf16.Decode(bts)
|
||||
// hy.TargetFrame = string(runes)
|
||||
// }
|
||||
|
||||
default:
|
||||
fmt.Printf("Unknow %X,%d\n", bof.Id, bof.Size)
|
||||
buf.Seek(int64(bof.Size), 1)
|
||||
}
|
||||
if col != nil {
|
||||
w.addCell(col)
|
||||
w.add(col)
|
||||
}
|
||||
return bof
|
||||
}
|
||||
|
||||
func (w *WorkSheet) addCell(col Coler) {
|
||||
func (w *WorkSheet) add(content interface{}) {
|
||||
if ch, ok := content.(ContentHandler); ok {
|
||||
if col, ok := content.(Coler); ok {
|
||||
w.addCell(col, ch)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func (w *WorkSheet) addCell(col Coler, ch ContentHandler) {
|
||||
var row *Row
|
||||
var ok bool
|
||||
if row, ok = w.Rows[col.Row()]; !ok {
|
||||
@@ -96,7 +171,20 @@ func (w *WorkSheet) addCell(col Coler) {
|
||||
info.Index = col.Row()
|
||||
row = w.addRow(info)
|
||||
}
|
||||
row.Cols[col.FirstCol()] = col
|
||||
row.Cols[ch.FirstCol()] = ch
|
||||
}
|
||||
|
||||
func (w *WorkSheet) addRange(rang Ranger, ch ContentHandler) {
|
||||
var row *Row
|
||||
var ok bool
|
||||
for i := rang.FirstRow(); i <= rang.LastRow(); i++ {
|
||||
if row, ok = w.Rows[i]; !ok {
|
||||
info := new(RowInfo)
|
||||
info.Index = i
|
||||
row = w.addRow(info)
|
||||
}
|
||||
row.Cols[ch.FirstCol()] = ch
|
||||
}
|
||||
}
|
||||
|
||||
func (w *WorkSheet) addRow(info *RowInfo) (row *Row) {
|
||||
@@ -107,7 +195,7 @@ func (w *WorkSheet) addRow(info *RowInfo) (row *Row) {
|
||||
if row, ok = w.Rows[info.Index]; ok {
|
||||
row.info = info
|
||||
} else {
|
||||
row = &Row{info: info, Cols: make(map[uint16]Coler)}
|
||||
row = &Row{info: info, Cols: make(map[uint16]ContentHandler)}
|
||||
w.Rows[info.Index] = row
|
||||
}
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user