update
This commit is contained in:
parent
1127e94c69
commit
f02a04cbdd
6
col.go
6
col.go
@ -4,7 +4,6 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -50,13 +49,14 @@ func (xf *XfRk) String(wb *WorkBook) string {
|
|||||||
if len(wb.Xfs) > idx {
|
if len(wb.Xfs) > idx {
|
||||||
fNo := wb.Xfs[idx].formatNo()
|
fNo := wb.Xfs[idx].formatNo()
|
||||||
if fNo >= 164 { // user defined format
|
if fNo >= 164 { // user defined format
|
||||||
if fmt := wb.Formats[fNo]; fmt != nil && strings.Contains(fmt.str, "YY") {
|
if fmt := wb.Formats[fNo]; fmt != nil {
|
||||||
i, f, isFloat := xf.Rk.number()
|
i, f, isFloat := xf.Rk.number()
|
||||||
if !isFloat {
|
if !isFloat {
|
||||||
f = float64(i)
|
f = float64(i)
|
||||||
}
|
}
|
||||||
t := timeFromExcelTime(f, wb.dateMode == 1)
|
t := timeFromExcelTime(f, wb.dateMode == 1)
|
||||||
return t.Format(time.RFC3339) //TODO it should be international
|
|
||||||
|
return t.Format(time.RFC3339) //TODO it should be international and format as the describled style
|
||||||
}
|
}
|
||||||
// see http://www.openoffice.org/sc/excelfileformat.pdf
|
// see http://www.openoffice.org/sc/excelfileformat.pdf
|
||||||
} else if 14 <= fNo && fNo <= 17 || fNo == 22 || 27 <= fNo && fNo <= 36 || 50 <= fNo && fNo <= 58 { // jp. date format
|
} else if 14 <= fNo && fNo <= 17 || fNo == 22 || 27 <= fNo && fNo <= 36 || 50 <= fNo && fNo <= 58 { // jp. date format
|
||||||
|
@ -24,13 +24,13 @@ func ExampleWorkBook_GetSheet() {
|
|||||||
if xlFile, err := Open("Table.xls", "utf-8"); err == nil {
|
if xlFile, err := Open("Table.xls", "utf-8"); err == nil {
|
||||||
if sheet1 := xlFile.GetSheet(0); sheet1 != nil {
|
if sheet1 := xlFile.GetSheet(0); sheet1 != nil {
|
||||||
fmt.Print("Total Lines ", sheet1.MaxRow, sheet1.Name)
|
fmt.Print("Total Lines ", sheet1.MaxRow, sheet1.Name)
|
||||||
col1 := sheet1.Rows[0].Cols[0]
|
col1 := sheet1.Row(0).Col(0)
|
||||||
col2 := sheet1.Rows[0].Cols[0]
|
col2 := sheet1.Row(0).Col(0)
|
||||||
for i := 0; i <= (int(sheet1.MaxRow)); i++ {
|
for i := 0; i <= (int(sheet1.MaxRow)); i++ {
|
||||||
row1 := sheet1.Rows[uint16(i)]
|
row1 := sheet1.Row(i)
|
||||||
col1 = row1.Cols[0]
|
col1 = row1.Col(0)
|
||||||
col2 = row1.Cols[1]
|
col2 = row1.Col(1)
|
||||||
fmt.Print("\n", col1.String(xlFile), ",", col2.String(xlFile))
|
fmt.Print("\n", col1, ",", col2)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
32
row.go
32
row.go
@ -10,7 +10,37 @@ type rowInfo struct {
|
|||||||
Flags uint32
|
Flags uint32
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Row the data of one row
|
||||||
type Row struct {
|
type Row struct {
|
||||||
|
wb *WorkBook
|
||||||
info *rowInfo
|
info *rowInfo
|
||||||
Cols map[uint16]contentHandler
|
cols map[uint16]contentHandler
|
||||||
|
}
|
||||||
|
|
||||||
|
//Col Get the Nth Col from the Row, if has not, return nil.
|
||||||
|
//Suggest use Has function to test it.
|
||||||
|
func (r *Row) Col(i int) string {
|
||||||
|
serial := uint16(i)
|
||||||
|
if ch, ok := r.cols[serial]; ok {
|
||||||
|
strs := ch.String(r.wb)
|
||||||
|
return strs[0]
|
||||||
|
} else {
|
||||||
|
for _, v := range r.cols {
|
||||||
|
if v.FirstCol() <= serial && v.LastCol() >= serial {
|
||||||
|
strs := v.String(r.wb)
|
||||||
|
return strs[serial-v.FirstCol()]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
//LastCol Get the number of Last Col of the Row.
|
||||||
|
func (r *Row) LastCol() int {
|
||||||
|
return int(r.info.Lcell)
|
||||||
|
}
|
||||||
|
|
||||||
|
//FirstCol Get the number of First Col of the Row.
|
||||||
|
func (r *Row) FirstCol() int {
|
||||||
|
return int(r.info.Fcell)
|
||||||
}
|
}
|
||||||
|
@ -277,10 +277,10 @@ func (w *WorkBook) ReadAllCells(max int) (res [][]string) {
|
|||||||
leng = max
|
leng = max
|
||||||
}
|
}
|
||||||
temp := make([][]string, leng)
|
temp := make([][]string, leng)
|
||||||
for k, row := range sheet.Rows {
|
for k, row := range sheet.rows {
|
||||||
data := make([]string, 0)
|
data := make([]string, 0)
|
||||||
if len(row.Cols) > 0 {
|
if len(row.cols) > 0 {
|
||||||
for _, col := range row.Cols {
|
for _, col := range row.cols {
|
||||||
if uint16(len(data)) <= col.LastCol() {
|
if uint16(len(data)) <= col.LastCol() {
|
||||||
data = append(data, make([]string, col.LastCol()-uint16(len(data))+1)...)
|
data = append(data, make([]string, col.LastCol()-uint16(len(data))+1)...)
|
||||||
}
|
}
|
||||||
|
20
worksheet.go
20
worksheet.go
@ -19,14 +19,20 @@ type WorkSheet struct {
|
|||||||
bs *boundsheet
|
bs *boundsheet
|
||||||
wb *WorkBook
|
wb *WorkBook
|
||||||
Name string
|
Name string
|
||||||
Rows map[uint16]*Row
|
rows map[uint16]*Row
|
||||||
//NOTICE: this is the max row number of the sheet, so it should be count -1
|
//NOTICE: this is the max row number of the sheet, so it should be count -1
|
||||||
MaxRow uint16
|
MaxRow uint16
|
||||||
parsed bool
|
parsed bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (w *WorkSheet) Row(i int) *Row {
|
||||||
|
row := w.rows[uint16(i)]
|
||||||
|
row.wb = w.wb
|
||||||
|
return row
|
||||||
|
}
|
||||||
|
|
||||||
func (w *WorkSheet) parse(buf io.ReadSeeker) {
|
func (w *WorkSheet) parse(buf io.ReadSeeker) {
|
||||||
w.Rows = make(map[uint16]*Row)
|
w.rows = make(map[uint16]*Row)
|
||||||
b := new(bof)
|
b := new(bof)
|
||||||
var bof_pre *bof
|
var bof_pre *bof
|
||||||
for {
|
for {
|
||||||
@ -181,12 +187,12 @@ func (w *WorkSheet) addRange(rang Ranger, ch contentHandler) {
|
|||||||
func (w *WorkSheet) addContent(row_num uint16, ch contentHandler) {
|
func (w *WorkSheet) addContent(row_num uint16, ch contentHandler) {
|
||||||
var row *Row
|
var row *Row
|
||||||
var ok bool
|
var ok bool
|
||||||
if row, ok = w.Rows[row_num]; !ok {
|
if row, ok = w.rows[row_num]; !ok {
|
||||||
info := new(rowInfo)
|
info := new(rowInfo)
|
||||||
info.Index = row_num
|
info.Index = row_num
|
||||||
row = w.addRow(info)
|
row = w.addRow(info)
|
||||||
}
|
}
|
||||||
row.Cols[ch.FirstCol()] = ch
|
row.cols[ch.FirstCol()] = ch
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *WorkSheet) addRow(info *rowInfo) (row *Row) {
|
func (w *WorkSheet) addRow(info *rowInfo) (row *Row) {
|
||||||
@ -194,11 +200,11 @@ func (w *WorkSheet) addRow(info *rowInfo) (row *Row) {
|
|||||||
w.MaxRow = info.Index
|
w.MaxRow = info.Index
|
||||||
}
|
}
|
||||||
var ok bool
|
var ok bool
|
||||||
if row, ok = w.Rows[info.Index]; ok {
|
if row, ok = w.rows[info.Index]; ok {
|
||||||
row.info = info
|
row.info = info
|
||||||
} else {
|
} else {
|
||||||
row = &Row{info: info, Cols: make(map[uint16]contentHandler)}
|
row = &Row{info: info, cols: make(map[uint16]contentHandler)}
|
||||||
w.Rows[info.Index] = row
|
w.rows[info.Index] = row
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
24
xls_test.go
24
xls_test.go
@ -7,20 +7,20 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func TestOpen(t *testing.T) {
|
func TestOpen(t *testing.T) {
|
||||||
if xlFile, err := Open("Book1.xls", "utf-8"); err == nil {
|
if xlFile, err := Open("expenses.xls", "utf-8"); err == nil {
|
||||||
if sheet1 := xlFile.GetSheet(0); sheet1 != nil {
|
if sheet1 := xlFile.GetSheet(0); sheet1 != nil {
|
||||||
fmt.Println("Total Lines ", sheet1.MaxRow, sheet1.Name)
|
fmt.Println("Total Lines ", sheet1.MaxRow, sheet1.Name)
|
||||||
for i := 0; i < int(sheet1.MaxRow); i++ {
|
for i := 0; i <= int(sheet1.MaxRow); i++ {
|
||||||
fmt.Printf("row %v point %v \n", i, sheet1.Rows[uint16(i)])
|
fmt.Printf("row %v point %v \n", i, sheet1.Row(i))
|
||||||
if sheet1.Rows[uint16(i)] == nil {
|
if sheet1.Row(i) == nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
row := sheet1.Rows[uint16(i)]
|
row := sheet1.Row(i)
|
||||||
for n, col := range row.Cols {
|
for index := row.FirstCol(); index < row.LastCol(); index++ {
|
||||||
fmt.Println(n, "==>", col.String(xlFile), " ")
|
fmt.Println(index, "==>", row.Col(index), " ")
|
||||||
}
|
}
|
||||||
// col1 := .Cols[0]
|
// col1 := .Cols[0]
|
||||||
// col2 := sheet1.Rows[uint16(i)].Cols[1]
|
// col2 := sheet1.Row(uint16(i)].Cols[1]
|
||||||
// fmt.Printf("\ncol1 %v \nCol2 %v \n", col1.String(xlFile), col2.String(xlFile))
|
// fmt.Printf("\ncol1 %v \nCol2 %v \n", col1.String(xlFile), col2.String(xlFile))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -42,16 +42,16 @@ func TestEuropeString(t *testing.T) {
|
|||||||
// for i := 0; i < xlFile.NumSheets(); i++ {
|
// for i := 0; i < xlFile.NumSheets(); i++ {
|
||||||
// fmt.Println(xlFile.GetSheet(i).Name)
|
// fmt.Println(xlFile.GetSheet(i).Name)
|
||||||
// sheet := xlFile.GetSheet(i)
|
// sheet := xlFile.GetSheet(i)
|
||||||
// row := sheet.Rows[1]
|
// row := sheet.Row(1]
|
||||||
// for i, col := range row.Cols {
|
// for i, col := range row.Cols {
|
||||||
// fmt.Println(i, col.String(xlFile))
|
// fmt.Println(i, col.String(xlFile))
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
// // sheet1 := xlFile.GetSheet(0)
|
// // sheet1 := xlFile.GetSheet(0)
|
||||||
// // fmt.Println(sheet1.Name)
|
// // fmt.Println(sheet1.Name)
|
||||||
// // fmt.Print(sheet1.Rows)
|
// // fmt.Print(sheet1.Row()
|
||||||
// // for k, row1 := range sheet1.Rows {
|
// // for k, row1 := range sheet1.Row({
|
||||||
// // // row1 := sheet1.Rows[1]
|
// // // row1 := sheet1.Row(1]
|
||||||
// // fmt.Printf("\n[%d]", k)
|
// // fmt.Printf("\n[%d]", k)
|
||||||
// // for _, col1 := range row1.Cols {
|
// // for _, col1 := range row1.Cols {
|
||||||
// // // col1 := row1.Cols[0]
|
// // // col1 := row1.Cols[0]
|
||||||
|
Loading…
Reference in New Issue
Block a user