Skip to content

Custom number formats are not properly implemented #74

Open

Description

@ryba-xek

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions