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 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; }
/** * gsf_outfile_open_pkg_add_rel: * @dir: #GsfOutfile * @name: target name * @content_type: non-%NULL content type * @parent: #GsfOutfile * @type: target type * * A convenience wrapper to create a child in @dir of @content_type then create * a @type relation to @parent * * Returns: (transfer full): the new part. **/ GsfOutput * gsf_outfile_open_pkg_add_rel (GsfOutfile *dir, char const *name, char const *content_type, GsfOutfile *parent, char const *type) { GsfOutput *part = gsf_outfile_new_child_full (dir, name, FALSE, "content-type", content_type, NULL); (void) gsf_outfile_open_pkg_relate (GSF_OUTFILE_OPEN_PKG (part), GSF_OUTFILE_OPEN_PKG (parent), type); return part; }