|
![]() |
#1 |
1C
|
![]()
Добрый день!
помогите пожалуйста со следующей проблемой: как установить автовысоту строки в Excel при экспорте? Не получается сделать worksheet.range(xlRefTo).autoFit("20:20"); // 20 - номер строки ошибка: Метод 'autoFit' в COM-объекте класса 'Range' возвратил код ошибки 0x800A03EC (<неизвестно>), который означает: Метод AutoFit из класса Range завершен неверно. хотя работает следующий код: range = worksheet.range("20:20").comObject(); range.insert(-4121); просьба не предлагать сделать в шаблоне высоту строк побольше ![]() Спасибо |
|
![]() |
#2 |
Участник
|
По идее надо делать не совсем так.
А делать select этого Range А потом на range.autofit(true); |
|
![]() |
#3 |
Участник
|
а если быть совсем точным, то вот так.
r = excel.findRange("A1"); r = r.EntireRow(); r.AutoFit(); |
|
![]() |
#4 |
Участник
|
Для колонки соответственно
r = excel.findRange("A1"); r = r.EntireColumn(); r.AutoFit(); |
|
![]() |
#5 |
1C
|
Спасибо! Как сделать select? У range нет метода select (и у worksheet тоже). И как потом обратиться к selection?
|
|
![]() |
#6 |
Участник
|
Это старый ответ? select я имел в виду findRange
Код: Com Range; Com Row; ; range = worksheet.range(xlRefTo); row = range.EntireRow(); row.AutoFit(); |
|
![]() |
#7 |
1C
|
Странно... У меня нет метода EntireRow на range. А если написать
range.EntireRow(), то не компилмрует: Переменная не относится к типу CLASS. |
|
![]() |
#8 |
Участник
|
А чем вы пользуетесь? вы не написали. Но я так понял, что не ComExcelDocument_RU
Вот job, который отрабатывает у меня верно: static void Job17(Args _args) { ComExcelDocument_RU excel = new ComExcelDocument_RU(); COM r; ; excel.newFile("", false); excel.insertValue("A1", "Hello World! This is a test to see how long the range can be."); r = excel.findRange("A1"); r = r.EntireRow(); r.AutoFit(); r = excel.findRange("A1"); r = r.EntireColumn(); r.AutoFit(); excel.documentSaveAs("C:\\Temp.xls"); excel.quitApplication(true); excel.finalize(); } Правда я сначала еще в классе ComExcelDocument_RU изменил код доступа к методу findRange с protected на public. |
|
|
За это сообщение автора поблагодарили: zemlyn (1), Gustav (1). |
![]() |
#9 |
1C
|
Спасибо. Так действительно работает, но у нас другой класс. Так уж исторически сложилось.
оказывается, вот в чем была проблема: row = rangeCOM.EntireRow(); row.autoFit(); работает. rangeCOM.EntireRow().autoFit(); - не компилируется. |
|
![]() |
#10 |
Дмитрий Ерин
|
Цитата:
Сообщение от andy239
rangeCOM.EntireRow().autoFit(); - не компилируется.
![]() Аксаптовский компилятор заранее ничего не знает о методах COM-объектов (в частности о возвращаемых ими значениях). Поэтому ему невдомёк, что метод EntireRow() вернет вам экземпляр класса. Все проверки идут уже на этапе runtime. Кстати, по теме вопроса: будьте внимательны при использовании AutoFit() - он может не сработать, если используется объединение ячеек. В этом случае приходится выкручиваться извратными способами ![]()
__________________
![]() |
|
![]() |
#11 |
Участник
|
AutoFit() для объединенных ячеек
Цитата:
Сообщение от Ruff
Кстати, по теме вопроса: будьте внимательны при использовании AutoFit() - он может не сработать, если используется объединение ячеек. В этом случае приходится выкручиваться извратными способами
![]() ![]() |
|
![]() |
#12 |
Дмитрий Ерин
|
Цитата:
Сообщение от Plushy
Расскажите, пожалуйста, про эти самые извратные способы
![]() Суть в следующем: исходим из того, что autofit работает для обычных ячеек, но не работает для объединенных. Таким образом берем на листе (например, где-нибудь сбоку, за "полями") дополнительный столбец (без каких либо объединений), устанавливаем ему такую же ширину, как и у требуемой объединенной ячейки. И затем скрываем его. При экспорте заполняем одними и теми же данными как объединенную (видимую) ячейку, так и обычную ячейку скрытого столбца (в той же строке). И после этого выделяем всю строку и применяем к ней autofit. Высота скорректируется для всей строки, а благодаря равенству ширины требуемой и скрытой ячеек, текст аккуратно впишется в том числе и в объединенной ячейке. PS: Речь идет об объединении "по горизонтали", то есть в пределах одной строки. Как обстоит дело с объединением нескольких строк, не знаю - не сталкивался.
__________________
![]() |
|
|
За это сообщение автора поблагодарили: alex55 (1), wedmak_dk (1), star52 (1). |
![]() |
#13 |
Участник
|
Спасибо за идею!
Цитата:
Сообщение от Ruff
Возможно, решение неоптимальное, и уж точно некрасивое, но оно работает и просто реализуется. Скажу сразу, идею подсмотрел на одном из форумов, посвященных VBA.
Суть в следующем: исходим из того, что autofit работает для обычных ячеек, но не работает для объединенных. Таким образом берем на листе (например, где-нибудь сбоку, за "полями") дополнительный столбец (без каких либо объединений), устанавливаем ему такую же ширину, как и у требуемой объединенной ячейки. И затем скрываем его. При экспорте заполняем одними и теми же данными как объединенную (видимую) ячейку, так и обычную ячейку скрытого столбца (в той же строке). И после этого выделяем всю строку и применяем к ней autofit. Высота скорректируется для всей строки, а благодаря равенству ширины требуемой и скрытой ячеек, текст аккуратно впишется в том числе и в объединенной ячейке. PS: Речь идет об объединении "по горизонтали", то есть в пределах одной строки. Как обстоит дело с объединением нескольких строк, не знаю - не сталкивался. |
|
![]() |
#14 |
1C
|
Возникает естественный вопрос: а как вообще выгрузить значение в объединенную ячейку? Насколько я помню, это не работает, а просто летит с ошибкой "неизвестно". Используется DDEclient.poke()
|
|
![]() |
#15 |
Дмитрий Ерин
|
С помощью класса ComExcelDocument_RU (метода insertValue()) все отлично работает...
|
|
![]() |
#16 |
Участник
|
А вы в какую ячейку вставляете? я с DDEClient не работал, но с COM насколько я помню, без проблем вставлялось, если вставлять в ячейку левого верхнего края. А вы в какую пробовали вставлять?
|
|
![]() |
#17 |
1C
|
Именно так и пробовал. Спасибо.
|
|
![]() |
#18 |
Участник
|
я пытался написать макрос для атоматического изменения размера ячеек, по заданному объединению, но он ошибался...
|
|