diff --git a/col.go b/col.go index 849382f..6d23f3d 100644 --- a/col.go +++ b/col.go @@ -183,6 +183,15 @@ func (c *LabelsstCol) String(wb *WorkBook) []string { return []string{wb.sst[int(c.Sst)]} } +type labelCol struct { + BlankCol + Str string +} + +func (c *labelCol) String(wb *WorkBook) []string { + return []string{c.Str} +} + type BlankCol struct { Col Xf uint16 diff --git a/workbook.go b/workbook.go index d80984d..2d2c1b0 100644 --- a/workbook.go +++ b/workbook.go @@ -4,6 +4,7 @@ import ( "bytes" "encoding/binary" "io" + "os" "unicode/utf16" ) @@ -59,6 +60,9 @@ func (w *WorkBook) addFont(font *FontInfo, buf io.ReadSeeker) { } func (w *WorkBook) addFormat(format *Format) { + if w.Formats == nil { + os.Exit(1) + } w.Formats[format.Head.Index] = format } @@ -132,10 +136,10 @@ func (wb *WorkBook) parseBof(buf io.ReadSeeker, b *bof, pre *bof, offset_pre int binary.Read(buf_item, binary.LittleEndian, f) wb.addFont(f, buf_item) case 0x41E: //FORMAT - f := new(Format) - binary.Read(buf_item, binary.LittleEndian, &f.Head) - f.str = wb.get_string(buf_item, f.Head.Size) - wb.addFormat(f) + font := new(Format) + binary.Read(buf_item, binary.LittleEndian, &font.Head) + font.str = wb.get_string(buf_item, font.Head.Size) + wb.addFormat(font) case 0x22: //DATEMODE binary.Read(buf_item, binary.LittleEndian, &wb.dateMode) } @@ -229,6 +233,7 @@ func (w *WorkBook) NumSheets() int { } //helper function to read all cells from file +//Notice: the max value is the limit of the max capacity of lines. func (w *WorkBook) ReadAllCells(max int) (res [][]string) { res = make([][]string, 0) for _, sheet := range w.sheets { diff --git a/worksheet.go b/worksheet.go index bad4cf9..6b49233 100644 --- a/worksheet.go +++ b/worksheet.go @@ -87,6 +87,13 @@ func (w *WorkSheet) parseBof(buf io.ReadSeeker, b *bof, pre *bof) *bof { case 0xFD: //LABELSST col = new(LabelsstCol) binary.Read(buf, binary.LittleEndian, col) + case 0x204: + c := new(labelCol) + binary.Read(buf, binary.LittleEndian, &c.BlankCol) + var count uint16 + binary.Read(buf, binary.LittleEndian, &count) + c.Str = w.wb.get_string(buf, count) + col = c case 0x201: //BLANK col = new(BlankCol) binary.Read(buf, binary.LittleEndian, col) diff --git a/xls.go b/xls.go index 2c93292..ebfcb2e 100644 --- a/xls.go +++ b/xls.go @@ -1,33 +1,25 @@ package xls import ( - "github.com/extrame/ole2" "io" - "io/ioutil" + "os" + + "github.com/extrame/ole2" ) //Open one xls file func Open(file string, charset string) (*WorkBook, error) { - if bts, err := ioutil.ReadFile(file); err == nil { - return parse(bts, charset) + if fi, err := os.Open(file); err == nil { + return OpenReader(fi, charset) } else { return nil, err } - } //Open xls file from reader -func OpenReader(reader io.ReadCloser, charset string) (*WorkBook, error) { - if bts, err := ioutil.ReadAll(reader); err == nil { - return parse(bts, charset) - } else { - return nil, err - } -} - -func parse(bts []byte, charset string) (wb *WorkBook, err error) { +func OpenReader(reader io.ReadSeeker, charset string) (wb *WorkBook, err error) { var ole *ole2.Ole - if ole, err = ole2.Open(bts, charset); err == nil { + if ole, err = ole2.Open(reader, charset); err == nil { var dir []*ole2.File if dir, err = ole.ListDir(); err == nil { var book *ole2.File diff --git a/xls_test.go b/xls_test.go index 8746bae..aee7f66 100644 --- a/xls_test.go +++ b/xls_test.go @@ -8,27 +8,58 @@ import ( ) 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(" ") + if xlFile, err := Open("reportComuni.xls", "utf-8"); err == nil { + if sheet1 := xlFile.GetSheet(0); sheet1 != nil { + fmt.Println("Total Lines ", sheet1.MaxRow, sheet1.Name) + for i := 0; i < int(sheet1.MaxRow); i++ { + fmt.Printf("row %v point %v \n", i, sheet1.Rows[uint16(i)]) + if sheet1.Rows[uint16(i)] == nil { + continue + } + row := sheet1.Rows[uint16(i)] + for n, col := range row.Cols { + fmt.Println(n, "==>", col.String(xlFile), " ") + } + // col1 := .Cols[0] + // col2 := sheet1.Rows[uint16(i)].Cols[1] + // fmt.Printf("\ncol1 %v \nCol2 %v \n", col1.String(xlFile), col2.String(xlFile)) + } } } } +func TestOpen1(t *testing.T) { + xlFile, _ := Open("000.xls", "") + for i := 0; i < xlFile.NumSheets(); i++ { + fmt.Println(xlFile.GetSheet(i).Name) + sheet := xlFile.GetSheet(i) + row := sheet.Rows[1] + for i, col := range row.Cols { + fmt.Println(i, col.String(xlFile)) + } + } + // 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) + wb := new(WorkBook) + wb.Formats = make(map[uint16]*Format) + wb.parseBof(buf, b, b, 0) } func TestMaxRow(t *testing.T) {