Excel interop column width

I am using excel interop in creating excel. Now, I have to get the size of a column as basis of what the next column’s size would be. I tried the following code:

width = xlWorksheet.Range[xlWorksheet.Cells[1, 4], xlWorksheet.Cells[1, 11]].Width;
xlWorksheet.Columns[5].ColumnWidth = width;

width_of_first_col = xlWorksheet.Range[xlWorksheet.Cells[1, 1], xlWorksheet.Cells[1, 1]].Width;
xlWorksheet.Columns[6].ColumnWidth = width_of_first_col;

The result should be column 4 and column 5 have the same size, as well as column 1 and 6. But this is not true to what the exact result looks like.

What is the best thing to do to set the with of a cell to another cell. Thanks.

asked Sep 4, 2015 at 7:33

ThEpRoGrAmMiNgNoOb's user avatar

Excel manages width of columns in multiple ways.

  • The Columnwidth property returns or sets the width of columns as the number of characters of the normal font that can be accommodated in one column. Please refer to this link.
  • The width property gives the width in points of a range as specified here.

answered Dec 9, 2015 at 12:28

bedunadain's user avatar

Range.Width is a read-only property, which give you the width in points.

Range.ColumnWidth is a read/write property, which gives you the width in what I like to call character units. A character unit represents the width of the character 0 under the font type and size as defined by the Normal style of the workbook.

In your case, since you do not need to calculate the width in points, just use .ColumnWidth all along.

n = ColumnNumberOfYourChoice;
width = xlWorksheet.Range.Columns.Item[n].ColumnWidth;
xlWorksheet.Columns[5].ColumnWidth = width;

width_of_first_col = xlWorksheet.Range.Columns.Item[1].ColumnWidth;
xlWorksheet.Columns[6].ColumnWidth = width_of_first_col;

Note from the documentation:

If all columns in the range have the same width, the ColumnWidth property returns the width. If columns in the range have different widths, this property returns Null.

answered Jan 16, 2020 at 11:27

Ama's user avatar

AmaAma

1,31110 silver badges23 bronze badges

Olegaaator

14 / 14 / 0

Регистрация: 12.12.2010

Сообщений: 159

1

.NET 4.x

03.04.2012, 01:26. Показов 36464. Ответов 11

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Собственно. Создаю рабочий лист, кидаю данные.

C#
1
2
3
4
5
6
7
8
9
using Excel = Microsoft.Office.Interop.Excel;
 
Excel.Application newExcel = new Excel.Application();
Excel.Worksheet ws = (Excel.Worksheet)newExcel.Workbooks.Add().ActiveSheet;
newExcel.Visible = true;
 
ws.Cells[1, 1] = "af awfawfaf";
ws.Cells[1, 2] = "ыуаыпфцафцафцафца фвафац";
ws.Cells[3, 3] = "ыуа ыпац";

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



0



32 / 15 / 1

Регистрация: 06.05.2011

Сообщений: 56

03.04.2012, 01:30

2

Пробывал указывать ws.Columns.Width?



1



Olegaaator

14 / 14 / 0

Регистрация: 12.12.2010

Сообщений: 159

03.04.2012, 01:46

 [ТС]

3

Нашел.

C#
1
ws.StandardWidth = 30;

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

Добавлено через 3 минуты
DimonR91, спасибо, пока писал ты уже подкинул еще один вариант. Тогда вопрос.

C#
1
2
ws.StandardWidth = 30;
ws.Columns.ColumnWidth = 30;

В чем принципиальная разница?

Добавлено через 5 минут
Да, а как отправлять данные на второй лист в таблице? (и как эти листы переименовывать?)



1



DimonR91

32 / 15 / 1

Регистрация: 06.05.2011

Сообщений: 56

03.04.2012, 01:47

4

Может быть в том, что у

C#
1
ws.Columns[i].ColumnWidth = 30;

Можно задавать конкретный размер для каждой колонки)

Чтобы сделать конкретно ширину колонки под твой размер, устанавливать вручную для каждой клонки в зависимости от длины записи…



2



14 / 14 / 0

Регистрация: 12.12.2010

Сообщений: 159

03.04.2012, 01:58

 [ТС]

5

DimonR91, да да да, уже понял, что колонки в массиве перечисляются. с шириной все ясно. при каждом добавлении информации проверять ее длину стоки и если она больше — менять ширину столбца.

А вот как на другую вкладку в самом ms excel отправлять данные? И как эти вкладки переименовывать?



0



32 / 15 / 1

Регистрация: 06.05.2011

Сообщений: 56

03.04.2012, 02:03

6

http://wladm.narod.ru/C_Sharp/comexcel.html#2
Вот здесь вроде бы достаточно примеров.
Показано как с разными листами работать — тоже массив WorkSheet.
А вот как имена давать..хз что-то у меня пока не получается. Какое нибдуь свойство Name найти)



0



Olegaaator

14 / 14 / 0

Регистрация: 12.12.2010

Сообщений: 159

03.04.2012, 03:25

 [ТС]

7

разобралси.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Excel.Application newExcel = new Excel.Application();
            Excel.Worksheet ws = newExcel.Workbooks.Add().ActiveSheet;
            newExcel.Visible = true;
 
            ws = newExcel.Sheets.get_Item(2);
 
            ws.Name = "Имя листа";
 
            ws.Columns.ColumnWidth = 30;
 
            ws.Cells[1, 1] = "af awfawfaf";
            ws.Cells[1, 2] = "ыуаыпфцафцафцафца фвафац";
            ws.Cells[3, 3] = "ыуа ыпац";
 
            ws = newExcel.Sheets.get_Item(1);
 
            ws.Cells[1, 1] = "ыуа ыпац";



0



2 / 2 / 1

Регистрация: 12.11.2010

Сообщений: 38

18.04.2013, 13:26

8

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



0



0 / 0 / 0

Регистрация: 14.06.2013

Сообщений: 2

14.06.2013, 09:03

9

ws.Columns.EntireColumn.AutoFit();



0



Letos07

2 / 2 / 1

Регистрация: 12.11.2010

Сообщений: 38

18.06.2013, 14:31

10

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
dynamic excelApp;
            excelApp = AutomationFactory.CreateObject("Excel.Application");
            excelApp.Visible = true;
            dynamic workbook = excelApp.workbooks;
            workbook.Add();
            dynamic sheet = excelApp.ActiveSheet;
            sheet.Columns.EntireColumn.AutoFit();
            dynamic cell = null;
            int index = 1;
            for (int a = 1; a < 20; a++)
            {
                cell = sheet.Cells[index,];
                cell.Value = mas[a];
            }

Приложение Silverlight, ширина не устанавливается



0



0 / 0 / 0

Регистрация: 14.06.2013

Сообщений: 2

20.06.2013, 14:22

11

Нельзя поставить Autofit ячейки,если они еще не заполнены данными



0



Olesya1

0 / 0 / 0

Регистрация: 30.09.2015

Сообщений: 21

31.03.2018, 07:59

12

подскажите пожалуйста, как изменить высоту строк и сделать так что бы данные которые находились в данной ячейке были по размеру и не выходили за ее пределы??

C#
1
2
//тут меняет только ширину, а высоту как??
    w.Columns[1].ColumnWidth = 25;



0



Я использую стандартную библиотеку

using Excel = Microsoft.Office.Interop.Excel;

И вот как я создаю Excel, всего лишь небольшую часть кода:

//Excel.Application xlApp;
Excel.Workbook xlWorkBook;
Excel.Worksheet xlWorkSheet;
object misValue = System.Reflection.Missing.Value;
Excel._Application xlApp = new Excel.Application();

xlWorkBook = xlApp.Workbooks.Add(misValue);
xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

//add data 
xlWorkSheet.Cells[1, 1] = "";
xlWorkSheet.Cells[1, 2] = "Student1";
xlWorkSheet.Cells[1, 3] = "Student2";
xlWorkSheet.Cells[1, 4] = "Student3";

Проблема в том, что иногда размер ячейки может быть меньше размера текста. Я пробовал вот это:

Excel.Range chartRange;
chartRange.EntireColumn.ColumnWidth = 31.43;

Он работает нормально, но мне нужно установить это свойство для каждого столбца отдельно. Как я могу это сделать?

7 ответов

Лучший ответ

Обычно я делаю это в VB, и это проще, потому что Excel записывает макросы в VB. Поэтому я обычно захожу в Excel и сохраняю макрос, который хочу сделать.

Вот что я сделал сейчас и получил этот код:

Columns("E:E").ColumnWidth = 17.29;

Range("E3").Interior.Pattern = xlSolid;
Range("E3").Interior.PatternColorIndex = xlAutomatic;
Range("E3").Interior.Color = 65535;
Range("E3").Interior.TintAndShade = 0;
Range("E3").Interior.PatternTintAndShade = 0;

Думаю, можно сделать что-то вроде этого:

xlWorkSheet.Columns[5].ColumnWidth = 18;

Что касается вашего последнего вопроса, что вам нужно сделать, это прокрутить столбцы, которые вы хотите установить, их ширину:

for (int i = 1; i <= 10; i++) // this will apply it from col 1 to 10
{
    xlWorkSheet.Columns[i].ColumnWidth = 18;
}


50

Lee Taylor
13 Апр 2019 в 21:24

Я сделал это так:

var xlApp = new Excel.Application();
var xlWorkBook = xlApp.Workbooks.Add(System.Reflection.Missing.Value);
var xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.Item[1];
xlWorkSheet.Columns.AutoFit();

Таким образом, столбцы всегда соответствуют ширине текста внутри ячеек.

Надеюсь, это кому-то поможет!


37

hakan
8 Мар 2015 в 14:48

Эта ссылка объясняет, как применить стиль ячейки к диапазону ячеек: http: // msdn.microsoft.com/en-us/library/f1hh9fza.aspx

Смотрите этот фрагмент:

Microsoft.Office.Tools.Excel.NamedRange rangeStyles =
this.Controls.AddNamedRange(this.Range["A1"], "rangeStyles");

rangeStyles.Value2 = "'Style Test";
rangeStyles.Style = "NewStyle";
rangeStyles.Columns.AutoFit();


4

Rob J
15 Дек 2013 в 19:58

Я изменил ширину всех столбцов в моем случае как

            worksheet.Columns[1].ColumnWidth = 7;
            worksheet.Columns[2].ColumnWidth = 15;
            worksheet.Columns[3].ColumnWidth = 15;
            worksheet.Columns[4].ColumnWidth = 15;
            worksheet.Columns[5].ColumnWidth = 18;
            worksheet.Columns[6].ColumnWidth = 8;
            worksheet.Columns[7].ColumnWidth = 13;
            worksheet.Columns[8].ColumnWidth = 17;
            worksheet.Columns[9].ColumnWidth = 17;

Примечание. Столбцы на листе начинаются с 1, а не с 0, как в Arrary.


4

Saleem Kalro
19 Сен 2017 в 02:47

Используйте этот

 ((Excel.Range)oSheet.Cells[1, 1]).EntireColumn.ColumnWidth = 10;


4

Deepak Jha
17 Май 2019 в 09:25

Excel ColumnWidth из dataGridView:

           foreach (DataGridViewColumn co in dataGridView1.Columns)
           { worksheet.Columns[co.Index + 1].ColumnWidth = co.Width/8; }


1

Reza Feizi
29 Янв 2018 в 12:20

См. Этот фрагмент: (C #)

    private Microsoft.Office.Interop.Excel.Application xla;
    Workbook wb;
    Worksheet ws;
    Range rg;
    ..........

        xla = new Microsoft.Office.Interop.Excel.Application();
        wb = xla.Workbooks.Add(XlSheetType.xlWorksheet);
        ws = (Worksheet)xla.ActiveSheet;
        rg = (Range)ws.Cells[1, 2];
        rg.ColumnWidth = 10;
        rg.Value2 = "Frequency";
        rg = (Range)ws.Cells[1, 3];
        rg.ColumnWidth = 15;
        rg.Value2 = "Impudence";
        rg = (Range)ws.Cells[1, 4];
        rg.ColumnWidth = 8;
        rg.Value2 = "Phase";


0

ram prasad
17 Дек 2015 в 14:11

  • Remove From My Forums
  • Question

  • How to set column width of column  with C#?

    After tried the following, no effect

    //((Excel.Range)oSheet.Columns["A", Missing]).ColumnWidth = 10;
                                //((Excel.Range)oSheet.Columns["B", Missing]).ColumnWidth = 10;
                                ((Excel.Range)oSheet.Cells[1, 1]).EntireColumn.ColumnWidth = 10;
                                ((Excel.Range)oSheet.Cells[1, 2]).EntireColumn.ColumnWidth = 10;


    資產一定是正數的嗎? -.-

Answers

  •             Excel.Worksheet esheet;
    
                esheet = (Excel.Worksheet)Globals.ThisWorkbook.Sheets[1];
    
                Excel.Range er = esheet.get_Range("A:A",System.Type.Missing);
    
                er.EntireColumn.ColumnWidth = 35;

    regards

    • Proposed as answer by

      Thursday, June 14, 2012 8:31 AM

    • Marked as answer by
      沈世鈞
      Thursday, June 21, 2012 8:05 AM

У меня есть сценарий aС#, который успешно открывает указанную книгу Excel, удаляет первую строку и сохраняет ее как формат csv.

У меня проблема, что CSV сохраняет стандартную ширину столбца 8.43. Я хотел бы изменить ширину столбца col J как 17.00 перед сохранением csv.

Может кто-нибудь, пожалуйста, сообщите, как я установил ширину полки Col J до 17.

Из-за процесса я не могу использовать VBA/Macros.

Я использую;

myWorkSheet.Columns["J:J"].ColumnWidth = 17.57;

Однако это приводит к тому, что объект не содержит определения для скриншота «ColumnWidth». enter image description here

Полный код ниже;

        public void DeleteRows(string OriginalFileName,String NewFileName)
{
Microsoft.Office.Interop.Excel.Application myApp;
Microsoft.Office.Interop.Excel.Workbook myWorkBook;
Microsoft.Office.Interop.Excel.Worksheet myWorkSheet;
Microsoft.Office.Interop.Excel.Range range;
myApp = new Microsoft.Office.Interop.Excel.Application();
myWorkBook = myApp.Workbooks.Open(OriginalFileName, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "t", false, false, 0, true, 1, 0);
myWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)myWorkBook.Worksheets.get_Item(1);
range = (Microsoft.Office.Interop.Excel.Range)myWorkSheet.Application.Rows[1, Type.Missing];
range.Select();
range.Delete(Microsoft.Office.Interop.Excel.XlDirection.xlUp);
//Microsoft.Office.Interop.Excel.Range ThisRange1 = myWorkSheet.get_Range("J:J",System.Type.Missing);
myWorkSheet.Columns["J:J"].ColumnWidth = 17.57; //ERRORLINE
myApp.DisplayAlerts = false;
myWorkSheet.SaveAs(NewFileName, Microsoft.Office.Interop.Excel.XlFileFormat.xlCSVWindows, Type.Missing, Type.Missing, false, false, false, XlSaveConflictResolution.xlLocalSessionChanges, Type.Missing, Type.Missing);
myWorkBook.Close(false);
myApp.Quit();
}

c# Изменение ширины колонки в Excel файле
В этой статье показано, как программно изменить ширину колонки в Excel файле с помощью языка c#
Создадим новый Excel файл, который содержит три колонки: ID, Name, Age.

Код:

Excel.Application exApp = new Excel.Application();
exApp.Workbooks.Add();
Worksheet workSheet = (Worksheet)exApp.ActiveSheet;
workSheet.Cells[1,1] = "ID";
workSheet.Cells[1,2] = "Name";
workSheet.Cells[1,3] = "Age";

Как изменить ширину всех колонок в Excel?
workSheet.Columns.ColumnWidth = 20;

atributy-xml-fajla_13.png

Как изменить ширину определенной колонки в Excel?

Например, изменим ширину второй колонки:

Код:

Excel.Range range = workSheet.Range["B1", System.Type.Missing];
range.EntireColumn.ColumnWidth = 25;

atributy-xml-fajla_2.png

Как изменить ширину нескольких колонок в Excel?

Например, изменим ширину первой и второй колонки:

Код:

Excel.Range range = workSheet.Range["A1:B1", System.Type.Missing];
range.EntireColumn.ColumnWidth = 25;

kak-dobavit-xml-fajl-v-solution-explorer_1.png

Диапазон колонок задаётся с помощью свойства Range.

Автоматическое изменение ширины колонок

Если ширина колонок заранее неизвестна, то тогда Вы можете воспользоваться методом AutoFit, например:
workSheet.Columns.AutoFit();
В данном примере ширина вычисляется автоматически на основе длины значения, которое содержится внутри ячейки. Поэтому метод AutoFit вызываться после того, как лист будет заполнен данными.

kak-peredat-dannye-mezhdu-formami-v-c_1.png

Finally i get Solution……

SaveFileDialog fileTerminal = new SaveFileDialog();
{
fileTerminal.Title = «Select File To Upload»;
fileTerminal.FileName = lblHeader.Text.Replace(» «, «») + «_» + TodayDateinTimeZone().ToString(«ddMMyyyyhhmmss»);
fileTerminal.Filter = «xlsx files(*.xlsx)|*.xlsx|xls files(*.xls)|*.xls|All files(*.*)|*.*»;
fileTerminal.FilterIndex = 2;
fileTerminal.InitialDirectory = @»C:»;
fileTerminal.RestoreDirectory = true;
if (fileTerminal.ShowDialog() == DialogResult.OK)
{
int columnCount = 0;
string filename = fileTerminal.FileName;
Excel.Application xlApp = default(Excel.Application);
Excel.Workbook xlWorkBook = default(Excel.Workbook);
Excel.Worksheet xlWorkSheet = default(Excel.Worksheet);
object misValue = System.Reflection.Missing.Value;
xlApp = new Microsoft.Office.Interop.Excel.ApplicationClass();
xlWorkBook = xlApp.Workbooks.Add(misValue);
xlWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
int i = 0;
int j = 0;

xlWorkSheet.Cells[1, 5] = lblHeader.Text.ToString();
for (int y = 1; y <= dtTempExcel.Columns.Count; y++)
{
xlWorkSheet.Cells[3, y] = dtTempExcel.Columns[y — 1].ColumnName;
}
for (i = 0; i <= dtTempExcel.Rows.Count — 1; i++)
{
for (j = 0; j <= dtTempExcel.Columns.Count — 1; j++)
{
DataGridViewCell cell = dgvAgentDetails[j, i];

// xlWorkSheet.Cells[i + 4, j + 1] = dtTempExcel.Rows[j][i].ToString();
xlWorkSheet.Cells[i + 4, j + 1] = cell.Value;
}
}
xlWorkSheet.get_Range(xlWorkSheet.Cells[3, 1], xlWorkSheet.Cells[3, dgvAgentDetails.Columns.Count]).Interior.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Yellow);
xlWorkSheet.get_Range(xlWorkSheet.Cells[1, 1], xlWorkSheet.Cells[1, dgvAgentDetails.Columns.Count]).Font.Bold = 40;
xlWorkSheet.get_Range(xlWorkSheet.Cells[3, 1], xlWorkSheet.Cells[1, dgvAgentDetails.Columns.Count]).Font.Bold = 20;
xlWorkSheet.get_Range(xlWorkSheet.Cells[3, 1], xlWorkSheet.Cells[1, dgvAgentDetails.Columns.Count]).EntireColumn.AutoFit();
xlWorkBook.SaveAs(filename.ToString(), Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
xlWorkBook.Close(true, misValue, misValue);
xlApp.Quit();
releaseObject(xlWorkSheet);
releaseObject(xlWorkBook);
releaseObject(xlApp);
}
}

private void releaseObject(object obj)
{
try
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
obj = null;
}
catch (Exception exp)
{
obj = null;
MessageBox.Show(«Exception Occured while releasing object » + exp.ToString(), Common.MSGBOX_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Error);
Database.LogData(GlobalVar.getAgentID.ToString(), GlobalVar.getTerminalID.ToString(), GlobalVar.getIpAddress.ToString(),
GlobalVar.getTerminalType.ToString(), «X», «ControlPanel», «releaseObject», exp.Message.ToString(), GlobalVar.getSequenceId);
}
finally
{
GC.Collect();
}
}

Like this post? Please share to your friends:
  • Excel intermediate что это
  • Excel interior что это
  • Excel interior cell color
  • Excel instr на русском
  • Excel inserting a table