Установите индекс Z-Order для объекта Shape в Aspose Cells для Java, чтобы отправить форму за текстом

Я добавил объект формы к существующему содержимому рабочего листа Excel, используя Aspose Cells для Java, например так:

Shape shape = worksheet.getShapes().addTextEffect(...);

Теперь я хотел бы отправить форму за текстом, который уже существовал на листе. Я посмотрел, есть метод setZOrderPosition для объекта Shape.

Однако он принимает целочисленное значение, и я не могу найти перечисление, магическое число или дозорный, который указывает Отправить на задний план, как у нас была константа msoSendToBack в объектных моделях VSTO/VBA. .

Кроме того, в их документации нет объяснения значений для этого метода: ">https://apireference.aspose.com/net/cells/aspose.cells.drawing/shape/properties/zorderposition

Итак, как и все другие API рисования, я предполагаю, что значение Z-порядка относится к Z-порядку другого содержимого на листе.

Итак, я попытался указать -1, чтобы обеспечить минимально возможное значение.

shape.setZOrderPosition(-1);

Это выдало IndexOutOfBoundsException или что-то подобное, из чего я делаю вывод, что допустимые значения для Z-Order отсчитываются от нуля.

Я указал значение 0, надеясь, что оно будет самым низким и будет работать, но оказалось, что это не так.

shape.setZOrderPosition(0);

Фигура по-прежнему перекрывает существующий текст.

Как правильно установить индекс Z-Order для объекта формы, чтобы он находился за текстом?


person Water Cooler v2    schedule 30.08.2017    source источник


Ответы (3)


Я думаю, вы должны установить прозрачность формы wordart на соответствующее значение, чтобы текст в этих ячейках отображался точно. См. следующий пример кода для справки: например Пример кода:

........

// Get the first default sheet
Worksheet sheet = workbook.getWorksheets().get(0);

// Add Watermark
Shape wordart = sheet.getShapes().addTextEffect(MsoPresetTextEffect.TEXT_EFFECT_1, "CONFIDENTIAL",
        "Arial Black", 50, false, true, 18, 8, 1, 1, 130, 800);

// Get the fill format of the word art
FillFormat wordArtFormat = wordart.getFill();

// Set the color
wordArtFormat.setOneColorGradient(Color.getRed(), 0.2, GradientStyleType.HORIZONTAL, 2);

// Set the transparency
wordArtFormat.setTransparency(0.9);

// Make the line invisible
LineFormat lineFormat = wordart.getLine();
lineFormat.setWeight(0.0);

..........

Я работаю разработчиком поддержки / евангелистом в Aspose.

person Amjad Sahi    schedule 30.08.2017
comment
Спасибо. Я уже сделал это. Мне было интересно, могу ли я установить индекс Z-Order для формы, потому что собственные сборки Office Interop и собственные сборки Office COM имеют API для этого. - person Water Cooler v2; 30.08.2017

Пожалуйста, используйте метод Shape.setZOrderPosition() для ваших нужд. Это будет работать, если вы также измените положение z-порядка всех или затронутых фигур.

См. следующий пример кода для справки. Я приложил изображение, которое показывает входной файл Excel, используемый в этом коде, и выходной файл Excel, сгенерированный кодом.

Как вы можете видеть внутри изображения, сердце теперь находится за текстовым полем.

Ява

//Load your workbook
Workbook wb = new Workbook(dirPath + "sample.xlsx");

//Access first worksheet
Worksheet ws = wb.getWorksheets().get(0);

//Get shape 1 and 2
Shape sh = ws.getShapes().get(0);
Shape sh1 = ws.getShapes().get(1);


//Set the Z-Order Position, first shape to 1 and second shape to 0
sh.setZOrderPosition(1);
sh1.setZOrderPosition(0);

//Save the workbook
wb.save(dirPath + "output.xlsx");

Скриншот введите здесь описание изображения

Примечание. Я работаю разработчиком-евангелистом в Aspose

person shakeel    schedule 31.08.2017
comment
Дело в том, как мне установить Z-порядок фигуры так, чтобы фигура шла за текстом? Этот метод предположительно устанавливает индексы Z-Order для объектов, таких как фигуры, диаграммы и т. д., а не для основного текста. Другая проблема с этим методом заключается в следующем: я должен перечислить все фигуры на листе и повлиять на их z-порядок, если мне нужно установить z-порядок элемента. - person Water Cooler v2; 12.09.2017
comment
Эту функцию необходимо улучшить, чтобы при установке z-порядка элемента вам не приходилось перечислять все фигуры. Пожалуйста, создайте сообщение для улучшения или запроса новой функции на форумах Aspose.Cells. - person shakeel; 13.09.2017
comment
Это подводит меня к еще одному интересному моменту. В течение последних 15 дней я пытался создать учетную запись на веб-сайте Aspose, чтобы участвовать в ваших онлайн-форумах, но он возвращает код состояния HTTP 500 с просьбой повторить попытку позже. Вот почему я публикую эти вопросы здесь, в SO. - person Water Cooler v2; 13.09.2017
comment
Прошу прощения за доставленное неудобство. В следующий раз, когда вы попытаетесь создать учетную запись, пожалуйста, удалите весь кеш или используйте совершенно новый профиль, и я надеюсь, что это решит вашу проблему с созданием учетной записи. Кроме того, мы сделаем некоторые улучшения, и в следующих версиях установка z-порядка будет проще. - person shakeel; 13.09.2017
comment
Мы добавим новый метод, например Shape.ToFrontOrBack(), для его поддержки. Надеюсь, он будет доступен в сентябрьском релизе. - person shakeel; 14.09.2017
comment
Спасибо большое. :-) - person Water Cooler v2; 14.09.2017
comment
У меня есть еще одна просьба для ваших последующих выпусков. Огромная проблема заключается в том, что метод экземпляра ShapeCollection.addTextEffect требует от разработчика указания, с какой строки и какого столбца должен начинаться верхний левый край фигуры. Это представляет собой чрезвычайно сложную проблему, поскольку столбцы и строки на листе могут иметь разную ширину и высоту, некоторые из них могут быть скрыты, некоторые завернуты, чтобы соответствовать тексту, а некоторые расширены, а некоторые заблокированы. Со всеми этими вариациями становится трудно определить, с какой строки и столбца должна начинаться следующая фигура, которую нужно нарисовать. продолжение.. - person Water Cooler v2; 14.09.2017
comment
продолжение из предыдущего комментария... Было бы намного проще, если бы API просто попросил нас сообщить ему смещения по осям X и Y (в пикселях) от верхнего левого края области рабочего листа, где нужно начать рисовать фигуру. Это огромная боль. Не могли бы вы сделать дополнительный API, который запрашивает координаты пикселей, а не номера строк и столбцов? - person Water Cooler v2; 14.09.2017
comment
Мы рассмотрим его и добавим метод, который принимает параметры в пикселях, если это возможно. Спасибо. - person shakeel; 14.09.2017
comment
Эта функция уже доступна в методах Shape.setLeftToCorner и Shape.setTopToCorner. Сначала вы создадите фигуру с параметрами 0, 0, затем вы будете использовать эти методы для изменения их положения на рабочем листе с пикселями. - person shakeel; 15.09.2017
comment
См. этот код для справки. ------// Добавить форму водяного знака wordArt = sheet.getShapes().addWordArt(PresetWordArtStyle.WORD_ART_STYLE_1,Word Art,0,0,0,0,100,100); wordArt.setLeftToCorner(100); wordArt.setTopToCorner(100); - person shakeel; 15.09.2017
comment
Спасибо, Шакил. Попробую и отчитаюсь. - person Water Cooler v2; 15.09.2017

Aspose.Cells реализовал эту функцию (например, Отправить форму спереди или сзади) в версии 17.9, которую вы можете загрузить из раздела загрузок веб-сайта Aspose. Вот пример кода для справки.

Ява

Workbook workbook = new Workbook();

Worksheet sheet = workbook.getWorksheets().get(0);

ShapeCollection shapes = workbook.getWorksheets().get(0).getShapes(); 

//Add first textbox
sheet.getTextBoxes().add(3, 3, 100, 100);

TextBox tb1 = sheet.getTextBoxes().get(0);
tb1.setText("This is first textbox.");

System.out.println(tb1.getZOrderPosition());

//Add second textbox
sheet.getTextBoxes().add(5, 3, 100, 100);

TextBox tb2 = sheet.getTextBoxes().get(1);
tb2.setText("This is second textbox.");

System.out.println(tb2.getZOrderPosition());

//Add second textbox
sheet.getTextBoxes().add(7, 3, 100, 100);

TextBox tb3 = sheet.getTextBoxes().get(2);
tb3.setText("This is third textbox.");

System.out.println(tb3.getZOrderPosition());

//Bring first textbox to front
tb1.toFrontOrBack(3);

//Send third textbox to back
tb3.toFrontOrBack(-1);

workbook.save(dirPath + "output.xlsx");

Примечание. Я работаю разработчиком-евангелистом в Aspose

person shakeel    schedule 25.09.2017