Философия

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Философия » Задачи по Excel » Выравнивание межстрочного интервала в конечном документе


Выравнивание межстрочного интервала в конечном документе

Сообщений 1 страница 16 из 16

1

Лист Excel заполнен частично вручную, частично заполняется макросами. Когда документ заполнен полностью, необходимо следующее:
3.1.1. Взять шапку документа (ячейка A1 создана слиянием ячеек). Сделать в ней межстрочное расстояние "одинарный". Если делать на vba, обратить внимание на то, что ячейка создана слиянием - для нее может не работать то, что работает для обычных ячеек.
3.1.2. В остальном документе сделать расстояние "полуторный".
3.1.3. В разных частях документа требуется разное межстрочное расстояние.

0

2

Задача оказалась не из простых. Стандартными средствами её, видимо, не решить - Excel не поддерживает форматирования текста с использованием межстрочного интервала. Один из способов менять межстрочное расстояние - это задать ячейке (или объединенным ячейкам) выравнивание по вертикали значение "по высоте" и менять высоту строки, в которой находится ячейка. Приемлимо ли это в задаче? Стоит пробовать копать в эту сторону? Или же нельзя менять высоту строк или выравнивание по вертикали?

0

3

Максим,

да, либо Ваша мысль, либо сам пока вижу два варианта. Может быть, они Вас сподвигнут к чему-то оптимальному.

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. Правда, иногда (как в случае шапки) это решение будет упускать возможность
случайного угадывания "сразу".

0

4

Первый предложенный Вами вариант, конечно, попроще и понадежнее будет. Второй вариант я уже брал в разработку, но попытки подсчитать количество строк провалились. Но теперь, раз допустимо проводить форматирование в ворде, я, конечно, реализую первый вариант. И сразу вопрос: ворд-документ надо будет сохранять? Или он будет использоваться только для печати правильно отформатированного документа, а сам документ храниться в Excel?

0

5

Да, Максим, нужно будет сохранять, но не открывать. Теперь, коль скоро мы остановились на этом рецепте, детали.
Мои конечные документы все имеют похожую структуру и оформление. Самый сложный документ такой:

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 смежных ячеек: Иванов (слева, у края страницы) и Подпись (справа, у края страницы).

0

6

1. Где сохранять ворд-файл, в той же папке, что и excel-файл?
2. Как называть файл?
3. Какой размер шрифта должен быть у пустой строки?
4. Там где необходима различная жирность: жирные участки хранятся в отдельных ячейках? Их можно будет легко отличить от остального текста?

Если возможно, пришлите, пожалуйста, пример исходного Excel документа.

Отредактировано Ничипорчук Максим (2010-12-08 20:11:56)

0

7

Максим,

Файл-пример высылаю на общую почту - не нашел здесь возможности прикрепить его.

1. Да, сохраняем в той же папке.
2. Имя. Можно ли поставить проверку:
            2.1. Если первая ячейка содержит текст "Дело №", тогда файл называется "deloZvanie".
            2.2. Если первая же ячейка содержит текст "Служебная записка", тогда - "szOtdelKadrov".
3. Размер шрифта пустой строки - 12.
4. Нет. В рамках одной ячейки (как Вы увидите в примере) макросом я собираю текст разной жирности, в этом проблема. Как я разумею, здесь придется каждое слово (но не букву, жирность распределена по словам, кроме шифра специальности) проверять на жирность. Но это только в одной ячейке. Здесь не стоит привязывать код к конкретным словам (например, не стоит искать "кандидат наук"), т.к. пример я сваял из головы, файлы у нас многообразны.

0

8

Спасибо за файл - так намного яснее.

Посмотрите, что получилось:

http://depositfiles.com/files/5k3tfnuhb

Жду замечаний.

0

9

Максим,

по факту - все работает. По коду, есть просьбы: чтобы не приходилось код переделывать под каждый документ, некоторые моменты прошу универсализировать, если возможно, конечно.

1. Извлечь названия не жестко из ячейке B6, а из первой непустой ячейки первой страницы первого листа.
2. Текст формировать следующим образом: экспортировать в цикле все абзацы до конца - пусть детектором конца будут две пустые строки подряд, они будут всегда возникать перед таблицей (возможно, Вы придумаете более удачный детектор конца текста).
3. Делать "подпись" не жестко в 14, 5 см, а равнять ее по правому краю, который определять по ширине "текста".

0

10

Сергей написал(а):

1. Извлечь названия не жестко из ячейке B6, а из первой непустой ячейки первой страницы первого листа.

Название документа лежит в ячейке E4. Или все же речь идет о ячейке В6, и имеется ввиду шапка?

Сергей написал(а):

2. Текст формировать следующим образом: экспортировать в цикле все абзацы до конца - пусть детектором конца будут две пустые строки подряд, они будут всегда возникать перед таблицей (возможно, Вы придумаете более удачный детектор конца текста).

Здесь каждый абзац лежит в отдельной ячейке?

0

11

Максим,

1. Действительно, E4, убит. Я, имел в виду я название, а не шапку.
2. Несмотря на то, что ячейки могут быть абзацы, но это неважно, их копировать единым блоком. А в цикле пропускать именно ячейки.

0

12

Сергей написал(а):

1. Извлечь названия не жестко из ячейке B6, а из первой непустой ячейки первой страницы первого листа.
2. Текст формировать следующим образом: экспортировать в цикле все абзацы до конца - пусть детектором конца будут две пустые строки подряд, они будут всегда возникать перед таблицей (возможно, Вы придумаете более удачный детектор конца текста).
3. Делать "подпись" не жестко в 14, 5 см, а равнять ее по правому краю, который определять по ширине "текста".

Пункты 1 и 3 сделаны. Над пунктом 2 надо еще подумать - как не завязываться на конкретные ячейки, да и вообще подумать как отвязать все части документа от конкретных значений адресов ячеек, чтобы экспорт основывался только на определенном порядке частей документа: название, шапка, текст, таблица, подпись.

http://depositfiles.com/files/hzasby7un

0

13

Максим,

по пункту 3 сейчас менее удачно, т.к. подпись вновь экспортируется с ячейками. Но Вы это уже не переделывайте, у меня остался старый Ваш вариант, скомпилирую.
По поводу пункта 2 - напишите, как решите, будете ли еще думать, видите ли свет в конце икселя.

0

14

Решение 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 & "Подпись"

0

15

Ничипорчук Максим написал(а):

По поводу пункта 2 - напишите, как решите, будете ли еще думать, видите ли свет в конце икселя.

Насчет 2-го пункта пока толковых мыслей нет, как-то все завязывается на конкретный документ. Хочется что-то поуниверсальней. Я пока еще подумаю над этим.
А если есть еще какие-то задачи, то давайте - а то я некомфортно себя чувствую, когда надо только думать.

0

16

))) Это лучшее, что Вы могли сказать философу, Максим.
Вы сделали все, о чем мы договаривались, так что, огромная Вам благодарность. Все остальное - факультативно.
Эти задачи я собирался выложить в будущем для других желающих, они более объемные, так что, если только Вам действительно мучительно бездействие. Создаю еще две темы с задачами.

0


Вы здесь » Философия » Задачи по Excel » Выравнивание межстрочного интервала в конечном документе