Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/137: Рейтинг темы: голосов - 137, средняя оценка - 4.71
6 / 6 / 0
Регистрация: 26.02.2010
Сообщений: 26

Как сделать автоподбор высоты строки в Excel

05.06.2012, 18:11. Показов 26547. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер.
Столкнулся с такой бедой, в объединенную ячейку Excel вставляю текст, у ячейку установлен параметр "перенос по словам", но после вставки текст у нее не увеличивается высота. К сожалению это фича на уровне excelа. Он не позволяет автоматически изменять высоту строки для объединенной ячейке.

Вопрос, что тогда можно сделать?? Может быть кто нибудь сталкивался с подобной проблемой и как из нее выходил?
П.С. была идея конечно насчет VB скрипта, но я ее берегу на черный день.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.06.2012, 18:11
Ответы с готовыми решениями:

Как анимировать изменение высоты строки грида?
Я пытался применить int, double, size анимацию на свойство rowdefenition.heightproperty. Но все они выдавали ошибку, что нельзя применить...

Автоподбор ширины и высоты ячеек Excel
Добрый день, возникла проблема с работой из VB в excel. Проблема в следующем: 1. Из VB создается документ excel затем из формы VB...

Автоподбор высоты строки в диапазоне
Добрый день! Необходимо сделать следующее: Если какой-либо ячейке из диапазона A1:C50 количество символов > 17, то осуществляется...

4
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
05.06.2012, 18:38
Excel не поддерживает авто-перенос в объединенных ячейках.
Вот вырезано есть макрос на VB, его довольно просто переписать на C#.
1
6 / 6 / 0
Регистрация: 26.02.2010
Сообщений: 26
06.06.2012, 09:36  [ТС]
Цитата Сообщение от turbanoff Посмотреть сообщение
Excel не поддерживает авто-перенос в объединенных ячейках.
Вот здесь есть макрос на VB, его довольно просто переписать на C#.

Спасибо. Я подумал и сделал чуть по другому.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 public void AutoFit_MergeCell(string FirstCell, string SecondCell)
        {
            //FirstCell - объединенная ячейка, в которой хотим выставить высоту
            //SecondCell - обыкновенная ячейка, с такой же шириной как и у FirstCell
 
            //авто выставление высоты объединенных ячеек
            if (objSheet.get_Range(FirstCell, FirstCell).Value2 != null)    // скопировать текст из объединенной ячейки
            {
                objSheet.get_Range(SecondCell, SecondCell).Value2 =
                    objSheet.get_Range(FirstCell, FirstCell).Value2.ToString();
            }
 
            objSheet.get_Range(SecondCell, SecondCell).EntireRow.AutoFit(); //применить автовысоту
            double CellHeight = objSheet.get_Range(SecondCell, SecondCell).RowHeight;//узнать высоту
            objSheet.get_Range(SecondCell, SecondCell).Value2 = ""; //очистить ячейку 
 
            objSheet.get_Range(FirstCell, FirstCell).RowHeight = CellHeight; //и задать нужную высоту для объединенной ячейки
        }
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
06.06.2012, 13:03
Оказывается QA сайт Microsoft считается чужим форумом(
Выкладываю VB код здесь. Возможно кому-то еще пригодится.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
Sub test()
   SetRowHeights ThisWorkbook.Sheets("Sheet1")
 End Sub
 Sub SetRowHeights(Sh As Object)
 ' sets row heights in sheet Sh.
 ' Excel doesn't correctly set row height when merged cells have wrapped text
   Dim C As Range, rRow As Range
   Dim sHeight As Single
   Dim sBestHeight As Single
   Dim bUpdate As Boolean
   Dim bHid As Boolean
   Dim iHidCol As Integer
   Dim cSizer As Range
   
   ' switch off screen updating to speed up the process
   bUpdate = Application.ScreenUpdating
   Application.ScreenUpdating = False
   
   
   ' this process is only relevant to worksheets, not chart sheets
   If TypeName(Sh) = "Worksheet" Then
     If IsNull(Sh.UsedRange.WrapText) Or Sh.UsedRange.WrapText Then
       ' text wrapping done in some cells in the sheet
       Workbooks.Add xlWorksheet ' temporary workbook
       Set cSizer = Range("A1")  ' a cell to use as workspace
       
       For Each rRow In Sh.UsedRange.Rows
         If IsNull(rRow.WrapText) Or rRow.WrapText Then
           ' there are cells on this row with wrapped text
           If Not IsNull(rRow.MergeCells) Then
             ' no merged cells so can use Excel's autofit
             rRow.EntireRow.AutoFit
           Else
             ' row has merged cells and wrapped text
             sBestHeight = 12.75
             For Each C In rRow.Cells
               ' copy the content of the cell to a spare cell in Terms and Autofit there
               If C.Address = C.MergeArea.Range("A1").Address _
                    And C.WrapText And Not C.EntireColumn.Hidden Then
                 ' first of a merged cell, or a single cell, with wrapped text
                 ' and column not hidden
                 ' set the single cell in Terms to match the (merged) cell here
                 cSizer.Value = C.Text
                 cSizer.Font.Size = C.Font.Size
                 cSizer.Font.Bold = C.Font.Bold
                 ' Width is measured in Twips and we can find the width of the MergeArea
                 ' but we can only set the ColumnWidth which is measured in different units
                 ' so scale the Width appropriately
                 cSizer.EntireColumn.ColumnWidth = C.MergeArea.Width * cSizer.ColumnWidth / cSizer.Width
                 cSizer.WrapText = True
                 ' use AutoFit to find the right row height for this cell
                 cSizer.EntireRow.AutoFit
                 ' get the height
                 sHeight = cSizer.RowHeight
                 ' if the cell is merged vertically then we need less height than this
                 If C.MergeArea.Rows.Count > 1 Then
                   ' adjust height down for later rows
                   sHeight = sHeight - (C.MergeArea.Rows.Count - 1) * (C.Font.Size + 2.75)
                 End If
               Else
                 sHeight = C.Font.Size + 2.75
               End If
               ' take the greatest height for this row so far
               If sHeight > sBestHeight Then sBestHeight = sHeight
             Next
             ' if the row isn't the correct height
             If rRow.EntireRow.RowHeight <> sBestHeight Then
               ' set it to the correct height
               rRow.EntireRow.RowHeight = sBestHeight
             End If
           End If
         End If
       Next
       ' close the helper workbook
       ActiveWorkbook.Close False
     End If
   End If
   ' restore screenupdating to its previous state
   Application.ScreenUpdating = bUpdate
 End Sub
1
4 / 4 / 1
Регистрация: 20.02.2015
Сообщений: 24
10.12.2015, 18:12
Не знаю помогло ли кому вышеуказанные советы, вот как я это решил после пары часов мучений. Вот есть замечательная книга по работе с Excel в Delphi. http://citforum.ck.ua/programm... shtml#3.31
Собственно и переделал изложенное там под C#:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
 using Excel = Microsoft.Office.Interop.Excel;
 
 public void OurOutputToExcelFunc()
 {
    // объединим область ячеек  строки "вместе"
    excelRng = ExcelWorkSheet.get_Range("A" + row.ToString(), "F" + row.ToString());
    excelRng.Merge(true);
    excelRng.WrapText = true;     //об-но
    excelRng.Value = someString;
    //Вызов Просто укажите одну из объединенных ячеек области.
    AutoFitMergedCellRowHeight((ExcelApp.Cells[row, 1] as Excel.Range)); 
 }//OurOutputToExcelFunc
 
     private void AutoFitMergedCellRowHeight(Excel.Range rng)
     {
            double mergedCellRgWidth = 0;
            double rngWidth, possNewRowHeight;
 
            if (rng.MergeCells)
            {
                // здесь использована самописная функция перевода стиля R1C1 в A1                
                if (xlRCtoA1(rng.Row, rng.Column) == xlRCtoA1(rng.Range["A1"].Row, rng.Range["A1"].Column)) 
                {
                    rng = rng.MergeArea;
                    if (rng.Rows.Count == 1 && rng.WrapText == true)
                    {
                        (rng.Parent as Excel._Worksheet).Application.ScreenUpdating = false;
                        rngWidth = rng.Cells.Item[1, 1].ColumnWidth;
                        for (int i = 1; i <= rng.Columns.Count; ++i)
                        {
                            mergedCellRgWidth += rng.Cells.Item[1, i].ColumnWidth;                             
                        }//for
                        rng.MergeCells = false;
                        rng.Cells.Item[1, 1].ColumnWidth = mergedCellRgWidth;
                        rng.EntireRow.AutoFit();
                        possNewRowHeight = rng.RowHeight;
                        rng.Cells.Item[1, 1].ColumnWidth = rngWidth;
                        rng.MergeCells = true;
                        rng.RowHeight = possNewRowHeight;
                        (rng.Parent as Excel._Worksheet).Application.ScreenUpdating = true;
                    }//if
                }//if                
            }//if
         }//AutoFitMergedCellRowHeight        
 
      private string xlRCtoA1 (int ARow, int ACol, bool RowAbsolute = false, bool ColAbsolute = false)
      {
            int A1 = 'A' - 1;  // номер "A" минус 1 (65 - 1 = 64)
            int AZ = 'Z' - A1; // кол-во букв в англ. алфавите (90 - 64 = 26)
 
            int t, m;
            string S; 
 
            t = ACol / AZ; // целая часть
            m = (ACol % AZ); // остаток?
            if (m == 0) 
                t--;
            if (t > 0)
                S = Convert.ToString((char)(A1 + t));
            else S = String.Empty;
 
            if (m == 0)
                t = AZ;
            else t = m;
 
            S = S + (char)(A1 + t);
 
            //весь адрес.
            if (ColAbsolute)  S = '$' + S;
            if (RowAbsolute)  S = S + '$';
 
            S = S + ARow.ToString();
            return S;
      }//xlRCtoA1
Код особо не улучшал, у меня работает. Надеюсь кому-то сэкономит пару часов жизни.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.12.2015, 18:12
Помогаю со студенческими работами здесь

Автоподбор высоты строки, объединенных по вертикали ячеек средствами VBA
Доброго времени суток! Использую следующий макрос, но к сожалению выравнивание учитывает только наполнение каждой сроки, наполнение...

Как в екселе сделать программно автоподбор ширины ячейки?
уважаемые программисты!!! как в екселе сделать программно автоподбор ширины ячейки, чтобы вставляемые числа сужали ячейку до своего...

Можно ли на делфи сделать автоподбор на размер монитора
как можно сделать чтобы делфи при запуске программы автоматический настраивал под монитор с разными рассширениями

Как сделать подбор высоты в строках TDBGrid?
У меня есть длинный текст на выходе запроса и мне хочется видеть его в TDBGrid целиком, т.е. необходимо располагать его в нескольких...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru