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

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

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

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

Вопрос, что тогда можно сделать?? Может быть кто нибудь сталкивался с подобной проблемой и как из нее выходил?
П.С. была идея конечно насчет VB скрипта, но я ее берегу на черный день.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.06.2012, 18:11
Ответы с готовыми решениями:

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

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

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

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

4
Эксперт Java
4093 / 3827 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
05.06.2012, 18:38 2
Excel не поддерживает авто-перенос в объединенных ячейках.
Вот вырезано есть макрос на VB, его довольно просто переписать на C#.
1
6 / 6 / 0
Регистрация: 26.02.2010
Сообщений: 26
06.06.2012, 09:36  [ТС] 3
Цитата Сообщение от 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
4093 / 3827 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
06.06.2012, 13:03 4
Оказывается 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 5
Не знаю помогло ли кому вышеуказанные советы, вот как я это решил после пары часов мучений. Вот есть замечательная книга по работе с 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
10.12.2015, 18:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.12.2015, 18:12
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru