Как напечатать изображение в оригинальном размере в Excel с помощью libxlsxwriter?

Я только начал использовать libxlsxwriter для создания листа Excel. Моя проблема в том, что я не знаю, как централизовать изображение и как печатать изображения в оригинальном размере. Просто рассмотрите набор, имеющий только 3 столбца и каждый столбец, имеющий разный размер, например 30,10,20. Мне нужно знать, что такое расчет, мне нужно найти значения смещения и масштаба.

lxw_image_options options = {.x_offset = 0,  .y_offset = 0,.x_scale  = 0.9, .y_scale  = 0.9};
worksheet_insert_image_opt(worksheet, row, 0, img_path, &options);

При этом мне нужно знать, сколько строк может содержать картинка. Только тогда я могу создать предстоящий набор без перекрытия.

2 ответа

Сколько строк держала картинка?

Я хочу представить свои выводы здесь, чтобы импровизировать результат.

int row=1;
lxw_image_options options = {.x_offset = 0,  .y_offset = 0};
worksheet_insert_image_opt(worksheet, row, 2,"logo.png", &options);
row+=(options.height/worksheet->default_row_pixels);        

Здесь я использовал переменную options.height, чтобы вычислить, сколько строк содержит картинка. Libxlsxwriter считал высоту из файла изображения в пикселях. Он использует опцию struct variable только для чтения инициализированной переменной, он никогда не будет ничего писать в наборе. Но я сделал это, добавив строку user_options->height=options->height; в функции worksheet_insert_image_opt на worksheet.c.

 lxw_error worksheet_insert_image_opt(lxw_worksheet *self,
                           lxw_row_t row_num, lxw_col_t col_num,
                           const char *filename,
                           lxw_image_options *user_options)
{
    FILE *image_stream;
    char *short_name;
    lxw_image_options *options;

    if (!filename) {
        LXW_WARN("worksheet_insert_image()/_opt(): "
                 "filename must be specified.");
        return LXW_ERROR_NULL_PARAMETER_IGNORED;
    }

    /* Check that the image file exists and can be opened. */
    image_stream = fopen(filename, "rb");
    if (!image_stream) {
        LXW_WARN_FORMAT1("worksheet_insert_image()/_opt(): "
                         "file doesn't exist or can't be opened: %s.",
                         filename);
        return LXW_ERROR_PARAMETER_VALIDATION;
    }

    /* Get the filename from the full path to add to the Drawing object. */
    short_name = lxw_basename(filename);
    if (!short_name) {
        LXW_WARN_FORMAT1("worksheet_insert_image()/_opt(): "
                         "couldn't get basename for file: %s.", filename);
        fclose(image_stream);
        return LXW_ERROR_PARAMETER_VALIDATION;
    }

    /* Create a new object to hold the image options. */
    options = calloc(1, sizeof(lxw_image_options));
    if (!options) {
        fclose(image_stream);
        return LXW_ERROR_MEMORY_MALLOC_FAILED;
    }

    if (user_options) {
        memcpy(options, user_options, sizeof(lxw_image_options));
        options->url = lxw_strdup(user_options->url);
        options->tip = lxw_strdup(user_options->tip);
    }

    /* Copy other options or set defaults. */
    options->filename = lxw_strdup(filename);
    options->short_name = lxw_strdup(short_name);
    options->stream = image_stream;
    options->row = row_num;
    options->col = col_num;

    if (!options->x_scale)
        options->x_scale = 1;

    if (!options->y_scale)
        options->y_scale = 1;

    if (_get_image_properties(options) == LXW_NO_ERROR) {
        user_options->height=options->height;
        STAILQ_INSERT_TAIL(self->image_data, options, list_pointers);
        return LXW_NO_ERROR;
    }
    else {
        free(options);
        return LXW_ERROR_IMAGE_DIMENSIONS;
    }
}

Вот как я рассчитывал строки. Если есть лучший способ, пожалуйста, дайте мне знать.

как печатать картинки по оригинальному размеру

libxlsxwriter вставляет изображения в файл xlsx в исходном размере на основе ширины, высоты и информации DPI в изображении. Он должен вставлять изображения точно так же, как если бы вы делали это в Excel через пользовательский интерфейс.

Однако изображения в OpenOffice или LibreOffice могут отображаться с неправильным размером. Это не проблема libxlsxwriter: то же самое происходит с Excel.

Чтобы вставить изображения в точных позициях, вам нужно знать размеры изображений в пикселях, а также DPI, поскольку Excel масштабируется в соответствии с его DPI по умолчанию (обычно 96). Вот пример вставки двух изображений в ряд:

/*
 * An example of inserting images with the libxlsxwriter library.
 */
#include "xlsxwriter.h"

int main() {

    /* Create a new workbook and add a worksheet. */
    lxw_workbook  *workbook   = workbook_new("demo.xlsx");
    lxw_worksheet *worksheet  = workbook_add_worksheet(workbook, NULL);
    lxw_image_options options = {.x_offset = 0, .y_offset = 0,
                                 .x_scale  = 1, .y_scale = 1};

    double default_dpi   = 96.0;
    double image_dpi     = 90.0;
    int32_t image_height = 138;
    int32_t image_offset = (int32_t)(image_height * default_dpi/image_dpi);

    /* Insert the first image. */
    worksheet_insert_image(worksheet, 1, 2, "logo.png");

    /* Insert the second image relative to the first. */
    options.y_offset += image_offset;
    worksheet_insert_image_opt(worksheet, 1, 2, "logo.png", &options);    

    workbook_close(workbook);

    return 0;
}

Выход:

Другие вопросы по тегам