static char const * xlsx_write_pivot_cache_definition (XLSXWriteState *state, GsfOutfile *wb_part, GODataCache const *cache, unsigned int cache_def_num) { GsfXMLOut *xml; int i, n; char const *record_id; char *name = g_strdup_printf ("pivotCacheDefinition%u.xml", cache_def_num); GsfOutput *cache_def_part = gsf_outfile_new_child_full (state->pivotCache.dir, name, FALSE, "content-type", "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml", NULL); char const *cache_def_id = gsf_outfile_open_pkg_relate (GSF_OUTFILE_OPEN_PKG (cache_def_part), GSF_OUTFILE_OPEN_PKG (wb_part), "http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotCacheDefinition"); record_id = xlsx_write_pivot_cache_records (state, cache, cache_def_part, cache_def_num); xml = gsf_xml_out_new (cache_def_part); gsf_xml_out_start_element (xml, "pivotCacheDefinition"); gsf_xml_out_add_cstr_unchecked (xml, "xmlns", ns_ss); gsf_xml_out_add_cstr_unchecked (xml, "xmlns:r", ns_rel); gsf_xml_out_add_cstr (xml, "r:id", record_id); if (cache->refreshed_by) gsf_xml_out_add_cstr (xml, "refreshedBy", cache->refreshed_by); if (cache->refreshed_on) { if (state->version == ECMA_376_2006) gsf_xml_out_add_float (xml, "refreshedDate", go_val_as_float (cache->refreshed_on), -1); else { GOFormat const *format = go_format_new_from_XL ("yyyy-mm-dd\"T\"hh:mm:ss"); gchar *date = format_value (format, cache->refreshed_on, NULL, -1, NULL); gsf_xml_out_add_cstr_unchecked (xml, "refreshedDateIso", date); g_free (date); go_format_unref (format); } } gsf_xml_out_add_int (xml, "createdVersion", cache->XL_created_ver); gsf_xml_out_add_int (xml, "refreshedVersion", cache->XL_refresh_ver); gsf_xml_out_add_uint (xml, "recordCount", go_data_cache_num_items (cache)); xlsx_add_bool (xml, "upgradeOnRefresh", cache->refresh_upgrades); xlsx_write_pivot_cache_source (state, xml, cache); gsf_xml_out_start_element (xml, "cacheFields"); n = go_data_cache_num_fields (cache); gsf_xml_out_add_uint (xml, "count", n); for (i = 0 ; i < n ; i++) xlsx_write_pivot_cache_field (state, xml, go_data_cache_get_field (cache, i)); gsf_xml_out_end_element (xml); /* </cacheFields> */ gsf_xml_out_end_element (xml); /* </pivotCacheDefinition> */ g_object_unref (xml); gsf_output_close (cache_def_part); g_object_unref (cache_def_part); g_free (name); return cache_def_id; }
static void xlsx_write_pivot_cache_field (XLSXWriteState *state, GsfXMLOut *xml, GODataCacheField const *field) { GOValArray const *vals; gsf_xml_out_start_element (xml, "cacheField"); gsf_xml_out_add_cstr (xml, "name", go_data_cache_field_get_name (field)->str); gsf_xml_out_add_int (xml, "numFmtId", 0); /* TODO */ if (NULL != (vals = go_data_cache_field_get_vals (field, FALSE))) xlsx_write_pivot_val_array (state, xml, vals, "sharedItems"); if (NULL != (vals = go_data_cache_field_get_vals (field, TRUE))) { int parent_group; GOValBucketer *bucketer = NULL; const char *group_by = NULL; g_object_get (G_OBJECT (field), "group-parent", &parent_group, "bucketer", &bucketer, NULL); gsf_xml_out_start_element (xml, "fieldGroup"); if (parent_group >= 0) gsf_xml_out_add_int (xml, "base", parent_group); gsf_xml_out_start_element (xml, "rangePr"); switch (bucketer->type) { case GO_VAL_BUCKET_SECOND : group_by = "seconds"; break; case GO_VAL_BUCKET_MINUTE : group_by = "minutes"; break; case GO_VAL_BUCKET_HOUR : group_by = "hours"; break; case GO_VAL_BUCKET_DAY_OF_YEAR : group_by = "days"; break; case GO_VAL_BUCKET_MONTH : group_by = "months"; break; case GO_VAL_BUCKET_CALENDAR_QUARTER : group_by = "quarters"; break; case GO_VAL_BUCKET_YEAR : group_by = "years"; break; default: /* default to linear */; case GO_VAL_BUCKET_SERIES_LINEAR :break; } if (group_by) gsf_xml_out_add_cstr_unchecked (xml, "groupBy", group_by); if (bucketer->type == GO_VAL_BUCKET_SERIES_LINEAR) { gsf_xml_out_add_float (xml, "startNum", bucketer->details.series.minimum, -1); gsf_xml_out_add_float (xml, "endNum", bucketer->details.series.maximum, -1); gsf_xml_out_add_float (xml, "groupInterval", bucketer->details.series.step, -1); } else { xlsx_write_date (state, xml, "startDate", bucketer->details.dates.minimum); xlsx_write_date (state, xml, "endDate", bucketer->details.dates.maximum); } gsf_xml_out_end_element (xml); /* </rangePr> */ xlsx_write_pivot_val_array (state, xml, vals, "groupItems"); gsf_xml_out_end_element (xml); /* </fieldGroup> */ } gsf_xml_out_end_element (xml); /* </cacheField> */ }
static char const * xlsx_write_pivot_cache_records (XLSXWriteState *state, GODataCache const *cache, GsfOutput *cache_def_part, unsigned int cache_records_num) { unsigned int i, j; GsfXMLOut *xml; char *name = g_strdup_printf ("pivotCacheRecords%u.xml", cache_records_num); GsfOutput *record_part = gsf_outfile_new_child_full (state->pivotCache.dir, name, FALSE, "content-type", "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml", NULL); char const *record_id = gsf_outfile_open_pkg_relate (GSF_OUTFILE_OPEN_PKG (record_part), GSF_OUTFILE_OPEN_PKG (cache_def_part), "http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotCacheRecords"); xml = gsf_xml_out_new (record_part); gsf_xml_out_start_element (xml, "pivotCacheRecords"); gsf_xml_out_add_cstr_unchecked (xml, "xmlns", ns_ss); gsf_xml_out_add_cstr_unchecked (xml, "xmlns:r", ns_rel); gsf_xml_out_add_int (xml, "count", go_data_cache_num_items (cache)); for (j = 0 ; j < go_data_cache_num_items (cache); j++) { gsf_xml_out_start_element (xml, "r"); for (i = 0 ; i < go_data_cache_num_fields (cache); i++) { GODataCacheField *field = go_data_cache_get_field (cache, i); switch (go_data_cache_field_ref_type (field)) { case GO_DATA_CACHE_FIELD_TYPE_INDEXED_I8 : case GO_DATA_CACHE_FIELD_TYPE_INDEXED_I16 : /* fallthrough */ case GO_DATA_CACHE_FIELD_TYPE_INDEXED_I32 : /* fallthrough */ gsf_xml_out_start_element (xml, "x"); gsf_xml_out_add_int (xml, "v", go_data_cache_get_index (cache, field, j)); gsf_xml_out_end_element (xml); break; case GO_DATA_CACHE_FIELD_TYPE_INLINE : xlsx_write_pivot_val (state, xml, go_data_cache_field_get_val (field, j)); break; case GO_DATA_CACHE_FIELD_TYPE_NONE : continue; } } gsf_xml_out_end_element (xml); /* </r> */ } gsf_xml_out_end_element (xml); /* </pivotCacheRecords> */ g_object_unref (xml); gsf_output_close (record_part); g_object_unref (record_part); g_free (name); return record_id; }
static void gog_dataset_sax_save (GogDataset const *set, GsfXMLOut *output, gpointer user) { GOData *dat; char *tmp; int i, last; gsf_xml_out_start_element (output, "data"); gog_dataset_dims (set, &i, &last); for ( ; i <= last ; i++) { dat = gog_dataset_get_dim (set, i); if (dat == NULL) continue; gsf_xml_out_start_element (output, "dimension"); gsf_xml_out_add_int (output, "id", i); gsf_xml_out_add_cstr (output, "type", G_OBJECT_TYPE_NAME (dat)); tmp = go_data_serialize (dat, user); gsf_xml_out_add_cstr (output, NULL, tmp); g_free (tmp); gsf_xml_out_end_element (output); /* </dimension> */ } gsf_xml_out_end_element (output); /* </data> */ }