/* * write_row: * * @output: the stream * @sheet: the gnumeric sheet * @row: the row number * */ static void write_row (GsfOutput *output, Sheet *sheet, gint row, GnmRange *range) { char const *text = NULL; char *formatted_string = NULL; GnmCell *cell; GnmStyle const *style; GODateConventions const *date_conv = sheet->workbook ? workbook_date_conv (sheet->workbook) : NULL; gint col; for (col = range->start.col; col <= range->end.col; col++) { GnmRange const *merge_range; GnmCellPos pos; pos.col = col; pos.row = row; merge_range = gnm_sheet_merge_contains_pos (sheet, &pos); if (merge_range != NULL) { /* If cell is inside a merged region, we use the corner cell of the merged region: */ cell = sheet_cell_get (sheet, merge_range->start.col, merge_range->start.row); } else { cell = sheet_cell_get (sheet, col, row); } if (cell != NULL && cell->value) { text = value_peek_string (cell->value); pwcsv_print_encoded (output, text); style = sheet_style_get (sheet, col, row); GOFormat const *format = gnm_style_get_format (style); // set col_width to 16-something. This works around gnumeric quirk // where, in wider cells, it formats 9,3 as 9,300000000000001 formatted_string = format_value (format, cell->value, 16, date_conv); pwcsv_print_encoded (output, formatted_string); html_write_cell_content (output, cell, style, formatted_string); g_free (formatted_string); /* Without this, we're accumulating lots of heap memory on big spreadsheets. */ gnm_cell_unrender(cell); } else { gsf_output_puts (output, ",,,"); } } gsf_output_puts (output, "\n"); }
static void write_cell (GsfOutput *output, Sheet *sheet, gint row, gint col, html_version_t version, gboolean is_merge) { GnmCell *cell; GnmStyle const *style; guint r, g, b; style = sheet_style_get (sheet, col, row); if (style != NULL && version != HTML32 && version != HTML40 && gnm_style_get_pattern (style) != 0 && gnm_style_is_element_set (style, MSTYLE_COLOR_BACK)) { html_get_back_color (style, &r, &g, &b); gsf_output_printf (output, " bgcolor=\"#%02X%02X%02X\"", r, g, b); } cell = sheet_cell_get (sheet, col, row); if (cell != NULL) { switch (gnm_style_get_align_v (style)) { case GNM_VALIGN_TOP: gsf_output_puts (output, " valign=\"top\" "); break; case GNM_VALIGN_BOTTOM: gsf_output_puts (output, " valign=\"bottom\" "); break; case GNM_VALIGN_DISTRIBUTED: case GNM_VALIGN_CENTER: gsf_output_puts (output, " valign=\"center\" "); break; case GNM_VALIGN_JUSTIFY: gsf_output_puts (output, " valign=\"baseline\" "); break; default: break; } switch (gnm_style_default_halign (style, cell)) { case GNM_HALIGN_RIGHT: gsf_output_puts (output, " align=\"right\" "); break; case GNM_HALIGN_DISTRIBUTED: case GNM_HALIGN_CENTER: case GNM_HALIGN_CENTER_ACROSS_SELECTION: gsf_output_puts (output, " align=\"center\" "); break; case GNM_HALIGN_LEFT: gsf_output_puts (output, " align=\"left\" "); break; case GNM_HALIGN_JUSTIFY: gsf_output_puts (output, " align=\"justify\" "); break; default: break; } } if (version == HTML40 || version == HTML40F || version ==XHTML) { if (style != NULL) { gsf_output_printf (output, " style=\""); if (gnm_style_get_pattern (style) != 0 && gnm_style_is_element_set (style, MSTYLE_COLOR_BACK)) { html_get_back_color (style, &r, &g, &b); gsf_output_printf (output, "background:#%02X%02X%02X;", r, g, b); } if (cell != NULL) { gint size = (int) (gnm_style_get_font_size (style) + 0.5); gsf_output_printf (output, " font-size:%ipt;", size); html_get_text_color (cell, style, &r, &g, &b); if (r > 0 || g > 0 || b > 0) gsf_output_printf (output, " color:#%02X%02X%02X;", r, g, b); if (gnm_style_get_contents_hidden (style)) gsf_output_puts (output, " visibility:hidden;"); } if (is_merge) html_write_border_style_40_for_merged_cell (output, style, sheet, row, col); else html_write_border_style_40 (output, style); gsf_output_printf (output, "\""); } } gsf_output_printf (output, ">"); html_write_cell_content (output, cell, style, version); gsf_output_puts (output, "</td>\n"); }