int gnumeric_sheet_set_cell(GnumericSheetPtr sheet, int x, int y, GSheetCellPtr cell) { if (!cell->is_url) { if (cell->all) { gnumeric_sheet_set_cell_as_string(sheet,x,y,cell->all); return 0; } gnumeric_sheet_remove_cell(sheet,x,y); return 0; } if (cell->url&&cell->txt) { GnmFunc *func = gnm_func_lookup("hyperlink",((Sheet *)sheet)->workbook); if (!func) { fprintf(stderr,"hyperlink unknown\n"); exit(1); } GnmExpr const *expr = gnm_expr_new_funcall2(func, gnm_expr_new_constant(value_new_string(cell->url)), gnm_expr_new_constant(value_new_string(cell->txt))); GnmExprTop const *texpr = gnm_expr_top_new(expr); GnmCell *cell2 = sheet_cell_get((Sheet*)sheet,x,y); if (cell2==NULL) { cell2 = sheet_cell_create((Sheet*)sheet,x,y); } GnmValue *val = value_new_string(cell->txt); //sheet_cell_set_value(cell2,val); gnm_cell_set_expr_and_value(cell2,texpr,val,0); } return 0; }
/** * paste_cell: * @target_col: Column to put the cell into * @target_row: Row to put the cell into. * @src: A #GnmCelCopy with the content to paste * @paste_flags: Bit mask that describes the paste options. * * Pastes a cell in the spreadsheet. */ static void paste_cell (int target_col, int target_row, GnmCellCopy const *src, const struct paste_cell_data *dat) { Sheet *dst_sheet = dat->pt->sheet; int paste_flags = dat->pt->paste_flags; if (paste_flags & PASTE_OPER_MASK) paste_cell_with_operation (dst_sheet, target_col, target_row, &dat->rinfo, src, paste_flags); else { GnmCell *dst = sheet_cell_fetch (dst_sheet, target_col, target_row); if (NULL != src->texpr && (paste_flags & PASTE_CONTENTS)) { GnmExprTop const *relo = gnm_expr_top_relocate ( src->texpr, &dat->rinfo, FALSE); if (paste_flags & PASTE_TRANSPOSE) { GnmExprTop const *trelo = gnm_expr_top_transpose (relo ? relo : src->texpr); if (trelo) { if (relo) gnm_expr_top_unref (relo); relo = trelo; } } else if (!relo && gnm_expr_top_is_array_corner (src->texpr)) { /* We must not share array expressions. */ relo = gnm_expr_top_new (gnm_expr_copy (src->texpr->expr)); } gnm_cell_set_expr_and_value (dst, relo ? relo : src->texpr, value_dup (src->val), TRUE); if (NULL != relo) gnm_expr_top_unref (relo); } else { GnmValue *newval = NULL; GnmValue const *oldval = src->val; if (dat->translate_dates && oldval && VALUE_IS_FLOAT (oldval)) { GOFormat const *fmt = VALUE_FMT (oldval) ? VALUE_FMT (oldval) : gnm_style_get_format (gnm_cell_get_style (dst)); if (go_format_is_date (fmt) > 0) { gnm_float fnew = go_date_conv_translate (value_get_as_float (oldval), dat->cr->date_conv, workbook_date_conv (dst_sheet->workbook)); newval = value_new_float (fnew); value_set_fmt (newval, VALUE_FMT (oldval)); } } if (!newval) newval = value_dup (src->val); gnm_cell_set_value (dst, newval); } } }
static void add_cell (Sheet *sheet, const psiconv_sheet_cell psi_cell, const psiconv_formula_list psi_formulas, const GnmStyle * default_style) { GnmCell *cell; GnmValue *val; GnmExprTop const *expr = NULL; cell = sheet_cell_fetch (sheet, psi_cell->column, psi_cell->row); if (!cell) return; val = value_new_from_psi_cell (psi_cell); if (psi_cell->calculated) expr = expr_new_from_formula (psi_cell, psi_formulas); if (expr != NULL) { /* TODO : is there a notion of parse format ? * How does it store a user entered date ? */ if (val != NULL) gnm_cell_set_expr_and_value (cell, expr, val, TRUE); else gnm_cell_set_expr (cell, expr); } else if (val != NULL) { /* TODO : is there a notion of parse format ? * How does it store a user entered date ? */ gnm_cell_set_value (cell, val); } else { /* TODO : send this warning to iocontext with details of * which sheet and cell. */ g_warning ("Cell with no value or expression ?"); } if (expr) gnm_expr_top_unref (expr); /* TODO: Perhaps this must be moved above set_format */ set_style(sheet,psi_cell->row,psi_cell->column,psi_cell->layout, default_style); }
static gboolean sylk_rtd_c_parse (SylkReader *state, char *str) { GnmValue *val = NULL; GnmExprTop const *texpr = NULL; gboolean is_array = FALSE; int r = -1, c = -1, tmp; char *next; for (; *str != '\0' ; str = next) { next = sylk_next_token (str); switch (*str) { case 'X': if (sylk_parse_int (str+1, &tmp)) state->pp.eval.col = tmp - 1; break; case 'Y': if (sylk_parse_int (str+1, &tmp)) state->pp.eval.row = tmp - 1; break; case 'K': /* ;K value: Value of the cell. */ if (val != NULL) { sylk_read_warning (state, _("Multiple values in the same cell")); value_release (val); val = NULL; } val = sylk_parse_value (state, str+1); break; case 'E': if (texpr != NULL) { sylk_read_warning (state, _("Multiple expressions in the same cell")); gnm_expr_top_unref (texpr); } texpr = sylk_parse_expr (state, str+1); break; case 'M' : /* ;M exp: Expression stored with UL corner of matrix (;R ;C defines the lower right corner). If the ;M field is supported, the ;K record is ignored. Note that no ;E field is written. */ if (texpr != NULL) { sylk_read_warning (state, _("Multiple expressions in the same cell")); gnm_expr_top_unref (texpr); } texpr = sylk_parse_expr (state, str+1); is_array = TRUE; break; case 'I' : /* ;I: Inside a matrix or table (at row ;R, col ;C) C record for UL corner must precede this record. Note that any ;K field is ignored if the ;I field is supported. No ;E field is written out. */ is_array = TRUE; break; case 'C' : sylk_parse_int (str+1, &c); break; case 'R' : sylk_parse_int (str+1, &r); break; case 'A' : /* ;Aauthor:^[ :text 1) till end of line 2) excel extension */ sylk_parse_comment (state, str+1); break; case 'G' : /* ;G: Defines shared value (may not have an ;E for this record). */ case 'D' : /* ;D: Defines shared expression. */ case 'S' : /* ;S: Shared expression/value given at row ;R, col ;C. C record for ;R, ;C must precede this one. Note that no ;E or ;K fields are written here (not allowed on Excel macro sheets). */ case 'N' : /* ;N: Cell NOT protected/locked (if ;N present in ;ID record). */ case 'P' : /* ;P: Cell protected/locked (if ;N not present in ;ID record). Note if this occurs for any cell, we protect the entire sheet. */ case 'H' : /* ;H: Cell hidden. */ case 'T' : /* ;Tref,ref: UL corner of table (;R ;C defines the lower left corner). Note that the defined rectangle is the INSIDE of the table only. Formulas and input cells are above and to the left of this rectangle. The row and column input cells are given in by the two refs (possibly only one). Note that Excel's input refs are single cells only. */ default: break; } } if (val != NULL || texpr != NULL) { GnmCell *cell = sheet_cell_fetch (state->pp.sheet, state->pp.eval.col, state->pp.eval.row); if (is_array) { if (texpr) { GnmRange rg; rg.start = state->pp.eval; rg.end.col = c - 1; rg.end.row = r - 1; gnm_cell_set_array (state->pp.sheet, &rg, texpr); gnm_expr_top_unref (texpr); } if (NULL != val) gnm_cell_assign_value (cell, val); } else if (NULL != texpr) { if (NULL != val) gnm_cell_set_expr_and_value (cell, texpr, val, TRUE); else gnm_cell_set_expr (cell, texpr); gnm_expr_top_unref (texpr); } else if (NULL != val) gnm_cell_set_value (cell, val); } return TRUE; }