Задать вопрос
@oleg0xff

Нужен пример работы с GSF для создания MS Structured Storage под Linux. Где найти?

Мне нужен пример для библиотеки GSF (https://developer.gnome.org/gsf/1.14
) как записать с ее помощью под Linux (Raspbian) файл формата MS Structured Storage c целью его последующего чтения из под MS Windows стандартными для MS Windows средствами. Документации более менее понтяно описываюшей данный процесс не нашел, но нашел программу в которой эта библиотека исползуеться для этих-же целей: https://github.com/GNOME/gnumeric . Посмотрел как они делают и сделал у себя вроде как также:
#include <iostream>
extern "C" {
#include <gsf/gsf.h>
#include<glib-object.h>
}

int main()
{
    gsf_init();

    const char * out_file_name = "storage.bin";
    GError *err;

    FILE *file = fopen(out_file_name, "wr");

    if (!file) {
        std::cout << "file open fail" << std::endl;
        exit(0);
    }

   GsfOutput *output = gsf_output_stdio_new_FILE (out_file_name, file, false);

   GsfOutfile *output_file_ole2 = gsf_outfile_msole_new(output);

   GsfOutput *output2 = gsf_outfile_new_child(output_file_ole2, "5555tteesstt",  false);
   int ret;

   GsfDocMetaData *docMetaData = gsf_doc_meta_data_new();
   GValue x = G_VALUE_INIT;

   g_value_init(&x, G_TYPE_STRING);
   g_value_set_string(&x, "Ttteeesssttt");
   gsf_doc_meta_data_insert(docMetaData, "zzzzz", &x);
   gsf_doc_meta_dump(docMetaData);

   ret = gsf_doc_meta_data_write_to_msole(docMetaData, output2, true);
   std::cout << "gsf_doc_meta_data_write_to_msole ret=" << ret << std::endl;

   ret = gsf_output_close(output2);
   g_object_unref(output2);
   std::cout << "ret=" << ret << std::endl;

   ret = gsf_output_close(output);
   g_object_unref(output);
   std::cout << "ret=" << ret << std::endl;

    return 0;
}

Но этот код не создает правильный файл: я не могу его потом открыть программой вроде SSViewer ( www.mitec.cz/ssv.html ). Более того, данные записываемые в output2 вообще не попадают в файл, буфер output2 отдельный от output и никуда не переноситься. Я могу записать буфер output2 в output с помошью функции gsf_output_write , физически данные в файле появляются, но он по-прежнему не открывается под MS Windows.

Буду признателен если кто то сможет подсказать где взять пример или более подробную документацию чем по ссылке что я приводил.
  • Вопрос задан
  • 361 просмотр
Подписаться 1 Оценить Комментировать
Решения вопроса 1
@oleg0xff Автор вопроса
Разобрался, вот пример кода который записывает файл в формате MS Structured Storage :
#include <iostream>
extern "C" {
#include <gsf/gsf.h>
#include<glib-object.h>
}

int main()
{
    gsf_init();

    const char *out_file_name = "storage.bin";

    FILE *file = fopen(out_file_name, "wr");

    if (!file) {
        std::cout << "file open fail" << std::endl;
        exit(0);
    }

    GsfOutput *output = gsf_output_stdio_new_FILE(out_file_name, file, true);

    GsfOutfile *output_file_ole2 = gsf_outfile_msole_new(output);

    GsfOutput *output2 = gsf_outfile_new_child(output_file_ole2, "5555tteesstt", false);
    gsf_output_puts(output2, "The quick brown fox is afraid of the cats.\n");


    ret = gsf_output_close(output2);
    g_object_unref(G_OBJECT(output2));

    gsf_output_close(GSF_OUTPUT(output_file_ole2));
    g_object_unref(G_OBJECT(output_file_ole2));

    ret = gsf_output_close(output);
    g_object_unref(G_OBJECT(output));

    gsf_shutdown();

    return 0;
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
leahch
@leahch Куратор тега Linux
3D специалист. Dолго, Dорого, Dерьмово.
Не уверен, что это именно то, что нужно, но посмотрите на https://poi.apache.org/
Правда это ява, но как минимум я на ней готовил excel документы и не только.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы