Лист Excel заполнен частично вручную, частично заполняется макросами. Когда документ заполнен полностью, необходимо следующее:
3.1.1. Взять шапку документа (ячейка A1 создана слиянием ячеек). Сделать в ней межстрочное расстояние "одинарный". Если делать на vba, обратить внимание на то, что ячейка создана слиянием - для нее может не работать то, что работает для обычных ячеек.
3.1.2. В остальном документе сделать расстояние "полуторный".
3.1.3. В разных частях документа требуется разное межстрочное расстояние.
Выравнивание межстрочного интервала в конечном документе
Сообщений 1 страница 16 из 16
Поделиться12010-11-30 00:46:36
Поделиться22010-12-07 02:16:59
Задача оказалась не из простых. Стандартными средствами её, видимо, не решить - Excel не поддерживает форматирования текста с использованием межстрочного интервала. Один из способов менять межстрочное расстояние - это задать ячейке (или объединенным ячейкам) выравнивание по вертикали значение "по высоте" и менять высоту строки, в которой находится ячейка. Приемлимо ли это в задаче? Стоит пробовать копать в эту сторону? Или же нельзя менять высоту строк или выравнивание по вертикали?
Поделиться32010-12-07 11:03:39
Максим,
да, либо Ваша мысль, либо сам пока вижу два варианта. Может быть, они Вас сподвигнут к чему-то оптимальному.
1. будем стремиться к частному решению, с помощью другой задачи (Вы частично уже решили "экспорт листа").
1.1. В задаче по экспорту листа нас остановило то, что экспорт производится вместе c таблицей, для сохранения
местоположения текста. Однако, в случае, когда все ячейки организованы слиянием, мы имеем, по факту, просто
один очень толстый столбец.
1.2. Мои конечные документы все имеют одну структуру: а) название (н-р, "Заключение", "Заявление"), центрированное по середине,
б) шапка (5-10 строк жирного текста), центрирован "по ширине", расстояние меж стоками одинарное, с) текст, центрирован "по ширине",
расстояние - полуторное. Т.е., будем считать, что конечный документ содержит только один столбец, в котором только три строки.
1.3. В таком случае, при экспорте в ворд, можно позволить себе извлечь все три ячейки в переменные,
вставить их в ворд без ячеек, и отформатировать так, как описано выше.
1.4. Если Вы примете в разработку этот вариант, допишу мелкие детали.
2. Основная проблема - непредсказуемость конечного количества строк в ячейке, т.к. их заполнение зависит
от других ячеек. Предлагаю, если это возможно, следующее.
2.1. Структура документа остается такой же, как описано в п.1.2.
2.2. В ячейках с шапкой и текстом необходимо посчитать количество строк, которые получились в ячейке при заданной ее ширине
(т.е., буквально, количество отображаемых на экране строк). Пусть первое число - Х строк для шапки, и У строк для текста.
Как заранее отформатированы ячейки - на Ваш выбор, предполагаю, что это будет "распределенный" или "по высоте".
2.3. Вычислить высоту ячеек шапки и текста. Пусть Hx и Hy.
2.3. Вычислить какое, в мм, получилось расстояние меж строк в шапке и тексте. Пусть r 1(Hx, X) и r2(Hy, Y).
2.3. Выяснить, чему равно стандартное вордовское расстояние "одинарный" и "полуторный" в миллиметрах, пусть А и В.
Полагаю, что это будет напрямую связано с размером шрифта, возможно, "одинарный" равен высоте шрифта.
Если так, то выяснить, какой размер шрифта в ячейке и тогда вычислить А и В. Думаю, стандарт
excel по умолчанию - именно "одинарный". Если так, то задачу на всем протяжении придется решать только для "текста" -
для "шапки" же все будет автоматически.
2.4. Вычислить дельты s=A-r1(Hx,X) и t=B-r2(Hy,y). (Далее рассуждаю только про "текст")
2.5. Если t по модулю меньше 0,1 B, то решено. Иначе в каждой строке ячейки "текст" ищем
любой пробел и вместо него вставляем любую букву высотой B. Перекрашиваем эту букву в цвет фона.
2.6. Можно сделать все и легче: не определять получившуюся высоту и не высчитывать дельты, а сразу
вставлять букву высотой B. Правда, иногда (как в случае шапки) это решение будет упускать возможность
случайного угадывания "сразу".
Поделиться42010-12-08 00:50:07
Первый предложенный Вами вариант, конечно, попроще и понадежнее будет. Второй вариант я уже брал в разработку, но попытки подсчитать количество строк провалились. Но теперь, раз допустимо проводить форматирование в ворде, я, конечно, реализую первый вариант. И сразу вопрос: ворд-документ надо будет сохранять? Или он будет использоваться только для печати правильно отформатированного документа, а сам документ храниться в Excel?
Поделиться52010-12-08 08:12:16
Да, Максим, нужно будет сохранять, но не открывать. Теперь, коль скоро мы остановились на этом рецепте, детали.
Мои конечные документы все имеют похожую структуру и оформление. Самый сложный документ такой:
0. Шрифт везде Times.
1. Название, берется из двух смежных ячеек (н-р, "Дело N" и "51"), по центру. 14 жирный.
2. Пустая строка.
3. Шапка, отступ 0,5 с обеих сторон (отступ не только первой строки, но всей шапки), по центру, расстояние "одинарный", 12, жирность различная, н-р, "Присваивается звание кандидата наук по специальности 09.00.11". Около 10 строк.
4. Пустая строка.
5. Текст, отступ 1,25 (только первых строк), 12, центрирован "по ширине", расстояние - полуторное.
6. Пустая строка.
7. Таблица из двух смежных ячеек. Жирная рамка вокруг каждой ячейки. Текст в ячейках "Специальность" и "01.05.98".
8. Пустая строка.
9. Строка подписи из 2 смежных ячеек: Иванов (слева, у края страницы) и Подпись (справа, у края страницы).
Поделиться62010-12-08 19:55:13
1. Где сохранять ворд-файл, в той же папке, что и excel-файл?
2. Как называть файл?
3. Какой размер шрифта должен быть у пустой строки?
4. Там где необходима различная жирность: жирные участки хранятся в отдельных ячейках? Их можно будет легко отличить от остального текста?
Если возможно, пришлите, пожалуйста, пример исходного Excel документа.
Отредактировано Ничипорчук Максим (2010-12-08 20:11:56)
Поделиться72010-12-09 18:20:59
Максим,
Файл-пример высылаю на общую почту - не нашел здесь возможности прикрепить его.
1. Да, сохраняем в той же папке.
2. Имя. Можно ли поставить проверку:
2.1. Если первая ячейка содержит текст "Дело №", тогда файл называется "deloZvanie".
2.2. Если первая же ячейка содержит текст "Служебная записка", тогда - "szOtdelKadrov".
3. Размер шрифта пустой строки - 12.
4. Нет. В рамках одной ячейки (как Вы увидите в примере) макросом я собираю текст разной жирности, в этом проблема. Как я разумею, здесь придется каждое слово (но не букву, жирность распределена по словам, кроме шифра специальности) проверять на жирность. Но это только в одной ячейке. Здесь не стоит привязывать код к конкретным словам (например, не стоит искать "кандидат наук"), т.к. пример я сваял из головы, файлы у нас многообразны.
Поделиться82010-12-10 02:20:11
Спасибо за файл - так намного яснее.
Посмотрите, что получилось:
http://depositfiles.com/files/5k3tfnuhb
Жду замечаний.
Поделиться92010-12-10 10:50:06
Максим,
по факту - все работает. По коду, есть просьбы: чтобы не приходилось код переделывать под каждый документ, некоторые моменты прошу универсализировать, если возможно, конечно.
1. Извлечь названия не жестко из ячейке B6, а из первой непустой ячейки первой страницы первого листа.
2. Текст формировать следующим образом: экспортировать в цикле все абзацы до конца - пусть детектором конца будут две пустые строки подряд, они будут всегда возникать перед таблицей (возможно, Вы придумаете более удачный детектор конца текста).
3. Делать "подпись" не жестко в 14, 5 см, а равнять ее по правому краю, который определять по ширине "текста".
Поделиться102010-12-10 21:50:15
1. Извлечь названия не жестко из ячейке B6, а из первой непустой ячейки первой страницы первого листа.
Название документа лежит в ячейке E4. Или все же речь идет о ячейке В6, и имеется ввиду шапка?
2. Текст формировать следующим образом: экспортировать в цикле все абзацы до конца - пусть детектором конца будут две пустые строки подряд, они будут всегда возникать перед таблицей (возможно, Вы придумаете более удачный детектор конца текста).
Здесь каждый абзац лежит в отдельной ячейке?
Поделиться112010-12-11 00:02:38
Максим,
1. Действительно, E4, убит. Я, имел в виду я название, а не шапку.
2. Несмотря на то, что ячейки могут быть абзацы, но это неважно, их копировать единым блоком. А в цикле пропускать именно ячейки.
Поделиться122010-12-12 17:47:12
1. Извлечь названия не жестко из ячейке B6, а из первой непустой ячейки первой страницы первого листа.
2. Текст формировать следующим образом: экспортировать в цикле все абзацы до конца - пусть детектором конца будут две пустые строки подряд, они будут всегда возникать перед таблицей (возможно, Вы придумаете более удачный детектор конца текста).
3. Делать "подпись" не жестко в 14, 5 см, а равнять ее по правому краю, который определять по ширине "текста".
Пункты 1 и 3 сделаны. Над пунктом 2 надо еще подумать - как не завязываться на конкретные ячейки, да и вообще подумать как отвязать все части документа от конкретных значений адресов ячеек, чтобы экспорт основывался только на определенном порядке частей документа: название, шапка, текст, таблица, подпись.
Поделиться132010-12-13 20:27:40
Максим,
по пункту 3 сейчас менее удачно, т.к. подпись вновь экспортируется с ячейками. Но Вы это уже не переделывайте, у меня остался старый Ваш вариант, скомпилирую.
По поводу пункта 2 - напишите, как решите, будете ли еще думать, видите ли свет в конце икселя.
Поделиться142010-12-13 22:12:13
Решение 3-го пункта без ячеек и четко заданного отступа:
' 5) Фамилия, подпись wdDoc.Paragraphs.Add With wdApp.Selection.Range .Font.Name = "Times New Roman" ' Шрифт .Font.Size = 12 ' Размер шрифта With .ParagraphFormat ' Вычислим позицию правого края текстовой области Dim DocWidth, Margins, Position As Integer DocWidth = wdDoc.PageSetup.PageWidth ' Ширина документа Margins = wdDoc.PageSetup.LeftMargin + wdDoc.PageSetup.RightMargin ' Сумма левого и правого полей Position = DocWidth - Margins .TabStops.Add Position:=Position, Alignment:=wdAlignTabRight, Leader:=wdTabLeaderSpaces End With End With wdApp.Selection.TypeText Text:=Cells(15, 1).Value wdApp.Selection.TypeText Text:=vbTab & "Подпись"
Поделиться152010-12-13 22:23:33
По поводу пункта 2 - напишите, как решите, будете ли еще думать, видите ли свет в конце икселя.
Насчет 2-го пункта пока толковых мыслей нет, как-то все завязывается на конкретный документ. Хочется что-то поуниверсальней. Я пока еще подумаю над этим.
А если есть еще какие-то задачи, то давайте - а то я некомфортно себя чувствую, когда надо только думать.
Поделиться162010-12-14 00:27:49
))) Это лучшее, что Вы могли сказать философу, Максим.
Вы сделали все, о чем мы договаривались, так что, огромная Вам благодарность. Все остальное - факультативно.
Эти задачи я собирался выложить в будущем для других желающих, они более объемные, так что, если только Вам действительно мучительно бездействие. Создаю еще две темы с задачами.