xls
xls copied to clipboard
Custom number formats are not properly implemented
Custom number formats are not implemented
http://www.openoffice.org/sc/excelfileformat.pdf page 174
i use github.com/IntelligenceX/fileconversion/xls which contain a number of fixes, but still formats like '0"руб."' do not work well.
Here is my patched func (xf *XfRk) String(wb *WorkBook) from col.go
func (xf *XfRk) String(wb *WorkBook) string {
idx := int(xf.Index)
if len(wb.Xfs) > idx {
fNo := wb.Xfs[idx].formatNo()
if fNo >= 164 { // user defined format
if formatter := wb.Formats[fNo]; formatter != nil {
formatterLower := strings.ToLower(formatter.str)
if formatterLower == "general" ||
strings.Contains(formatter.str, "#") ||
strings.Contains(formatter.str, ".00") ||
strings.Contains(formatterLower, "m/y") ||
strings.Contains(formatterLower, "d/y") ||
strings.Contains(formatterLower, "m.y") ||
strings.Contains(formatterLower, "d.y") ||
strings.Contains(formatterLower, "h:") ||
strings.Contains(formatterLower, "д.г") {
//If format contains # or .00 then this is a number
return xf.Rk.String()
} else {
// http://www.openoffice.org/sc/excelfileformat.pdf page 174
var res []string
parts := strings.Split(formatter.str, "\"")
var inString bool
for _, part := range parts {
if inString {
res = append(res, part)
} else {
switch part {
case "":
res = append(res, part)
case "0": // Decimal
i, f, isFloat := xf.Rk.number()
if isFloat {
res = append(res, fmt.Sprintf("%.f", f)) // convert float to decimal
} else {
res = append(res, strconv.FormatInt(i, 10))
}
default:
panic(fmt.Sprintf("Unknown formater: '%s'", part))
}
}
inString = !inString
}
return strings.Join(res, "")
//i, f, isFloat := xf.Rk.number()
//if !isFloat {
// f = float64(i)
//}
//t := timeFromExcelTime(f, wb.dateMode == 1)
//
//return yymmdd.Format(t, formatter.str)
}
}
// see http://www.openoffice.org/sc/excelfileformat.pdf Page #174
} else if 14 <= fNo && fNo <= 17 || fNo == 22 || 27 <= fNo && fNo <= 36 || 50 <= fNo && fNo <= 58 { // jp. date format
i, f, isFloat := xf.Rk.number()
if !isFloat {
f = float64(i)
}
t := timeFromExcelTime(f, wb.dateMode == 1)
return t.Format(time.RFC3339) //TODO it should be international
}
}
return xf.Rk.String()
}