docs: function write_ws_bin_cell(ba, cell, R, C, opts, ws) {
  	if(cell.v === undefined) return "";
  	var vv = "";
  	switch(cell.t) {
  		case 'b': vv = cell.v ? "1" : "0"; break;
  		case 'd': // no BrtCellDate :(
  			cell = dup(cell);
  			cell.z = cell.z || SSF._table[14];
  			cell.v = datenum(parseDate(cell.v)); cell.t = 'n';
  			break;
  		/* falls through */
  		case 'n': case 'e': vv = ''+cell.v; break;
  		default: vv = cell.v; break;
  	}
  	var o = ({r:R, c:C});
  	/* TODO: cell style */
  	o.s = get_cell_style(opts.cellXfs, cell, opts);
  	if(cell.l) ws['!links'].push([encode_cell(o), cell.l]);
  	if(cell.c) ws['!comments'].push([encode_cell(o), cell.c]);
  	switch(cell.t) {
  		case 's': case 'str':
  			if(opts.bookSST) {
  				vv = get_sst_id(opts.Strings, (cell.v), opts.revStrings);
  				o.t = "s"; o.v = vv;
  				write_record(ba, "BrtCellIsst", write_BrtCellIsst(cell, o));
  			} else {
  				o.t = "str";
  				write_record(ba, "BrtCellSt", write_BrtCellSt(cell, o));
  			}
  			return;
  		case 'n':
  			/* TODO: determine threshold for Real vs RK */
  			if(cell.v == (cell.v | 0) && cell.v > -1000 && cell.v < 1000) write_record(ba, "BrtCellRk", write_BrtCellRk(cell, o));
  			else write_record(ba, "BrtCellReal", write_BrtCellReal(cell, o));
  			return;
  		case 'b':
  			o.t = "b";
  			write_record(ba, "BrtCellBool", write_BrtCellBool(cell, o));
  			return;
  		case 'e': /* TODO: error */ o.t = "e"; break;
  	}
  	write_record(ba, "BrtCellBlank", write_BrtCellBlank(cell, o));
  }