dana-medical-site/internal/sberhealth/xls.go
2026-10-14 13:33:13 +00:00

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
}