Как напечатать изображение в оригинальном размере в 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;
}
Выход: