xls icon indicating copy to clipboard operation
xls copied to clipboard

Custom number formats are not properly implemented

Open ryba-xek opened this issue 5 years ago • 0 comments

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()
}

ryba-xek avatar Oct 20 '20 11:10 ryba-xek