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 }