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 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; }
/** * gnm_sheet_slicer_regenerate: * @gss : #GnmSheetSlicer * * Do some work! * See what we need to do then think about when portions belong in the GODataSlicer base. * **/ void gnm_sheet_slicer_regenerate (GnmSheetSlicer *gss) { #if 0 GArray *permutation, *rows; unsigned int i, n; g_return_if_fail (IS_GNM_SHEET_SLICER (gss)); g_return_if_fail (IS_SHEET (gss->sheet)); g_return_if_fail (NULL != gss->base.cache); field_order = g_array_sized_new (FALSE, FALSE, sizeof (unsigned int), gss->base.all_fields->len); gss_append_field_indicies (gss, GDS_FIELD_TYPE_ROW, field_order); gss_append_field_indicies (gss, GDS_FIELD_TYPE_COL, field_order); n = go_data_cache_num_items (gss->base.cache); #endif }
static void gnm_sheet_slicer_test_sort (GnmSheetSlicer *gss) { /* quick test to sort the cache based on the row/col */ GArray *permutation, *field_order; unsigned int i, n; field_order = g_array_sized_new (FALSE, FALSE, sizeof (unsigned int), gss->base.all_fields->len); gss_append_field_indicies (gss, GDS_FIELD_TYPE_ROW, field_order); gss_append_field_indicies (gss, GDS_FIELD_TYPE_COL, field_order); n = go_data_cache_num_items (gss->base.cache); permutation = g_array_sized_new (FALSE, FALSE, sizeof (int), n); for (i = 0 ; i < n ; i++) g_array_append_val (permutation, i); go_data_cache_permute (gss->base.cache, field_order, permutation); go_data_cache_dump (gss->base.cache, field_order, permutation); g_array_free (field_order, TRUE); g_array_free (permutation, TRUE); }