63 lines
1.1 KiB
Go
63 lines
1.1 KiB
Go
package parser
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/xuri/excelize/v2"
|
|
)
|
|
|
|
// ExcelParser extracts all sheets from Excel files as Markdown tables.
|
|
type ExcelParser struct{}
|
|
|
|
func (p *ExcelParser) SupportedExtensions() []string {
|
|
return []string{".xlsx", ".xls"}
|
|
}
|
|
|
|
func (p *ExcelParser) ParseToMarkdown(path string) (string, error) {
|
|
f, err := excelize.OpenFile(path)
|
|
if err != nil {
|
|
return "", fmt.Errorf("open excel: %w", err)
|
|
}
|
|
defer f.Close()
|
|
|
|
var sb strings.Builder
|
|
for _, sheet := range f.GetSheetList() {
|
|
rows, err := f.GetRows(sheet)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
if len(rows) == 0 {
|
|
continue
|
|
}
|
|
|
|
sb.WriteString(fmt.Sprintf("## Sheet: %s\n\n", sheet))
|
|
|
|
// Header row
|
|
sb.WriteString("| ")
|
|
for _, cell := range rows[0] {
|
|
sb.WriteString(cell + " | ")
|
|
}
|
|
sb.WriteString("\n|")
|
|
for range rows[0] {
|
|
sb.WriteString(" --- |")
|
|
}
|
|
sb.WriteString("\n")
|
|
|
|
// Data rows
|
|
for _, row := range rows[1:] {
|
|
sb.WriteString("| ")
|
|
for i := 0; i < len(rows[0]); i++ {
|
|
if i < len(row) {
|
|
sb.WriteString(row[i])
|
|
}
|
|
sb.WriteString(" | ")
|
|
}
|
|
sb.WriteString("\n")
|
|
}
|
|
sb.WriteString("\n")
|
|
}
|
|
|
|
return sb.String(), nil
|
|
}
|