35 lines
1.4 KiB
Go
35 lines
1.4 KiB
Go
package sberhealth
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
)
|
|
|
|
// ReadXLS reads only the confirmed legacy Report sheet. Unexpected formats or
|
|
// sparse/oversized files fail explicitly, rather than becoming an empty channel.
|
|
// Parsing is done by biff.go (own BIFF8 reader): the third-party library used before
|
|
// shifted values in large exports because it mishandled strings split across CONTINUE
|
|
// records. No Excel/Python process is needed on the VPS.
|
|
func ReadXLS(data []byte) (rows [][]string, err error) {
|
|
defer func() {
|
|
if recover() != nil {
|
|
rows, err = nil, fmt.Errorf("СберЗдоровье: повреждённая книга XLS")
|
|
}
|
|
}()
|
|
if len(data) > maxDownload || len(data) < 512 || !bytes.HasPrefix(data, []byte{0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 0x1a, 0xe1}) {
|
|
return nil, fmt.Errorf("СберЗдоровье: нужен бинарный XLS из кабинета")
|
|
}
|
|
stream, err := workbookStream(data)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("СберЗдоровье: не удалось прочитать XLS (%v)", err)
|
|
}
|
|
sheets, err := parseBIFF8(stream)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("СберЗдоровье: не удалось прочитать XLS (%v)", err)
|
|
}
|
|
if len(sheets) != 1 || sheets[0].name != "Report" {
|
|
return nil, fmt.Errorf("СберЗдоровье: неизвестный лист или слишком много листов XLS")
|
|
}
|
|
return sheets[0].rows, nil
|
|
}
|