add one example
This commit is contained in:
parent
e7a933588c
commit
56699cbc55
2
col.go
2
col.go
@ -46,7 +46,7 @@ func (xf *XfRk) String(wb *WorkBook) string {
|
|||||||
switch wb.Xfs[21].formatNo() {
|
switch wb.Xfs[21].formatNo() {
|
||||||
case 27:
|
case 27:
|
||||||
if f, e := xf.Rk.Float(); e == nil {
|
if f, e := xf.Rk.Float(); e == nil {
|
||||||
t := TimeFromExcelTime(f, true)
|
t := timeFromExcelTime(f, true)
|
||||||
return t.Format("2006.01") //TODO it should be international
|
return t.Format("2006.01") //TODO it should be international
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
2
date.go
2
date.go
@ -69,7 +69,7 @@ func doTheFliegelAndVanFlandernAlgorithm(jd int) (day, month, year int) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Convert an excelTime representation (stored as a floating point number) to a time.Time.
|
// Convert an excelTime representation (stored as a floating point number) to a time.Time.
|
||||||
func TimeFromExcelTime(excelTime float64, date1904 bool) time.Time {
|
func timeFromExcelTime(excelTime float64, date1904 bool) time.Time {
|
||||||
var date time.Time
|
var date time.Time
|
||||||
var intPart int64 = int64(excelTime)
|
var intPart int64 = int64(excelTime)
|
||||||
// Excel uses Julian dates prior to March 1st 1900, and
|
// Excel uses Julian dates prior to March 1st 1900, and
|
||||||
|
35
workbook.go
35
workbook.go
@ -10,13 +10,14 @@ import (
|
|||||||
|
|
||||||
//xls workbook type
|
//xls workbook type
|
||||||
type WorkBook struct {
|
type WorkBook struct {
|
||||||
Is5ver bool
|
Is5ver bool
|
||||||
Type uint16
|
Type uint16
|
||||||
Codepage uint16
|
Codepage uint16
|
||||||
Xfs []st_xf_data
|
Xfs []st_xf_data
|
||||||
Fonts []Font
|
Fonts []Font
|
||||||
Formats map[uint16]*Format
|
Formats map[uint16]*Format
|
||||||
Sheets []*WorkSheet
|
//All the sheets from the workbook
|
||||||
|
sheets []*WorkSheet
|
||||||
Author string
|
Author string
|
||||||
rs io.ReadSeeker
|
rs io.ReadSeeker
|
||||||
sst []string
|
sst []string
|
||||||
@ -29,7 +30,7 @@ func newWorkBookFromOle2(rs io.ReadSeeker) *WorkBook {
|
|||||||
wb.Formats = make(map[uint16]*Format)
|
wb.Formats = make(map[uint16]*Format)
|
||||||
// wb.bts = bts
|
// wb.bts = bts
|
||||||
wb.rs = rs
|
wb.rs = rs
|
||||||
wb.Sheets = make([]*WorkSheet, 0)
|
wb.sheets = make([]*WorkSheet, 0)
|
||||||
wb.Parse(rs)
|
wb.Parse(rs)
|
||||||
return wb
|
return wb
|
||||||
}
|
}
|
||||||
@ -199,22 +200,32 @@ func (w *WorkBook) get_string_from_bytes(bts []byte, size uint16) string {
|
|||||||
|
|
||||||
func (w *WorkBook) addSheet(sheet *boundsheet, buf io.ReadSeeker) {
|
func (w *WorkBook) addSheet(sheet *boundsheet, buf io.ReadSeeker) {
|
||||||
name := w.get_string(buf, uint16(sheet.Name))
|
name := w.get_string(buf, uint16(sheet.Name))
|
||||||
w.Sheets = append(w.Sheets, &WorkSheet{bs: sheet, Name: name, wb: w})
|
w.sheets = append(w.sheets, &WorkSheet{bs: sheet, Name: name, wb: w})
|
||||||
}
|
}
|
||||||
|
|
||||||
//reading a sheet from the compress file to memory, you should call this before you try to get anything from sheet
|
//reading a sheet from the compress file to memory, you should call this before you try to get anything from sheet
|
||||||
func (w *WorkBook) PrepareSheet(sheet *WorkSheet) {
|
func (w *WorkBook) prepareSheet(sheet *WorkSheet) {
|
||||||
w.rs.Seek(int64(sheet.bs.Filepos), 0)
|
w.rs.Seek(int64(sheet.bs.Filepos), 0)
|
||||||
sheet.parse(w.rs)
|
sheet.parse(w.rs)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (w *WorkBook) GetSheet(num int) *WorkSheet {
|
||||||
|
if num < len(w.sheets) {
|
||||||
|
s := w.sheets[num]
|
||||||
|
w.prepareSheet(s)
|
||||||
|
return s
|
||||||
|
} else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//helper function to read all cells from file
|
//helper function to read all cells from file
|
||||||
func (w *WorkBook) ReadAllCells(max int) (res [][]string) {
|
func (w *WorkBook) ReadAllCells(max int) (res [][]string) {
|
||||||
res = make([][]string, 0)
|
res = make([][]string, 0)
|
||||||
for _, sheet := range w.Sheets {
|
for _, sheet := range w.sheets {
|
||||||
if len(res) < max {
|
if len(res) < max {
|
||||||
max = max - len(res)
|
max = max - len(res)
|
||||||
w.PrepareSheet(sheet)
|
w.prepareSheet(sheet)
|
||||||
if sheet.MaxRow != 0 {
|
if sheet.MaxRow != 0 {
|
||||||
leng := int(sheet.MaxRow) + 1
|
leng := int(sheet.MaxRow) + 1
|
||||||
if max < leng {
|
if max < leng {
|
||||||
|
@ -17,10 +17,11 @@ type boundsheet struct {
|
|||||||
|
|
||||||
//WorkSheet in one WorkBook
|
//WorkSheet in one WorkBook
|
||||||
type WorkSheet struct {
|
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
|
||||||
MaxRow uint16
|
MaxRow uint16
|
||||||
}
|
}
|
||||||
|
|
||||||
|
1
xls.go
1
xls.go
@ -47,7 +47,6 @@ func parse(bts []byte, charset string) (wb *WorkBook, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
67
xls_test.go
Normal file
67
xls_test.go
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
package xls
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestOpen(t *testing.T) {
|
||||||
|
xlFile, _ := Open("Table.xls", "")
|
||||||
|
sheet1 := xlFile.GetSheet(0)
|
||||||
|
fmt.Println(sheet1.Name)
|
||||||
|
fmt.Print(sheet1.Rows)
|
||||||
|
for k, row1 := range sheet1.Rows {
|
||||||
|
// row1 := sheet1.Rows[1]
|
||||||
|
fmt.Printf("\n[%d]", k)
|
||||||
|
for _, col1 := range row1.Cols {
|
||||||
|
// col1 := row1.Cols[0]
|
||||||
|
fmt.Print(col1.LastCol())
|
||||||
|
fmt.Print(" ")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestBof(t *testing.T) {
|
||||||
|
b := new(bof)
|
||||||
|
b.Id = 0x41E
|
||||||
|
b.Size = 55
|
||||||
|
buf := bytes.NewReader([]byte{0x07, 0x00, 0x19, 0x00, 0x01, 0x22, 0x00, 0xE5, 0xFF, 0x22, 0x00, 0x23, 0x00, 0x2C, 0x00, 0x23, 0x00, 0x23, 0x00, 0x30, 0x00, 0x2E, 0x00, 0x30, 0x00, 0x30, 0x00, 0x3B, 0x00, 0x22, 0x00, 0xE5, 0xFF, 0x22, 0x00, 0x5C, 0x00, 0x2D, 0x00, 0x23, 0x00, 0x2C, 0x20, 0x00})
|
||||||
|
new(WorkBook).parseBof(buf, b, b, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMaxRow(t *testing.T) {
|
||||||
|
xlFile, err := Open("Table.xls", "utf-8")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintf(os.Stderr, "Failure: %v\n", err)
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if sheet1 := xlFile.GetSheet(0); sheet1 != nil {
|
||||||
|
if sheet1.MaxRow != 11 {
|
||||||
|
t.Errorf("max row is error,is %d instead of 11", sheet1.MaxRow)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//read the content of first two cols in each row
|
||||||
|
func ExampleReadXls(t *testing.T) {
|
||||||
|
xlFile, err := Open("Table.xls", "utf-8")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintf(os.Stderr, "Failure: %v\n", err)
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if sheet1 := xlFile.GetSheet(0); sheet1 != nil {
|
||||||
|
fmt.Print("Total Lines ", sheet1.MaxRow, sheet1.Name)
|
||||||
|
col1 := sheet1.Rows[0].Cols[0]
|
||||||
|
col2 := sheet1.Rows[0].Cols[0]
|
||||||
|
for i := 0; i <= (int(sheet1.MaxRow)); i++ {
|
||||||
|
row1 := sheet1.Rows[uint16(i)]
|
||||||
|
col1 = row1.Cols[0]
|
||||||
|
col2 = row1.Cols[1]
|
||||||
|
fmt.Print("\n", col1.String(xlFile), ",", col2.String(xlFile))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user