Можно ли рассчитать ширину столбца Excel с помощью .Net или OpenXml Framework без использования объектов System.Drawing Graphics и Bitmap? - PullRequest
1 голос
/ 21 января 2012

Я разрабатываю класс, который позволяет пользователям создавать электронные таблицы Excel на лету (используя API OpenXML), и мне нужно рассчитать ширину столбцов, чтобы они автоматически помещались в самую широкую ячейку в столбце.

У меня есть следующий код для расчета ширины каждого столбца (используя формулу здесь и этот учебник ):

private double CalculateColumnWidth(int textLength)
        {
            var font = new System.Drawing.Font("Calibri", 11);

            float digitMaximumWidth = 0;
            using(var graphics = Graphics.FromImage(new Bitmap(200, 200)))
            {
                for(var i = 0; i < 10; ++i)
                {
                    var digitWidth = graphics.MeasureString(i.ToString(), font).Width;
                    if (digitWidth > digitMaximumWidth)
                        digitMaximumWidth = digitWidth;
                }
            }

            return Math.Truncate((textLength * digitMaximumWidth + 5.0) / digitMaximumWidth * 256.0) / 256.0;
        }

Это работает нормально, тольковопрос: есть ли способ избавиться от объектов Bitmap и Graphics, которые мне не нужны для вычисления ширины столбца Excel?Почему объект Graphics необходим для этого?Спасибо заранее

1 Ответ

3 голосов
/ 30 января 2012

"Ширина столбца, измеренная как количество символов максимальной ширины цифр чисел 0, 1, 2,…, 9, отображаемых шрифтом обычного стиля. Имеется 4 пикселя отступов полей (по два с каждой стороны) , плюс 1 пиксельный отступ для линий сетки. Справка: http://msdn.microsoft.com/en-us/library/documentformat.openxml.spreadsheet.column.aspx

Вам необходимо вычислить ширину каждого числа от 0 до 10 и определить, какая из них имеет наибольшую ширину. Самый простой способ сделать это в .Net - использовать MeasureString в System.Drawing.Graphics, для одного из его конструкторов требуется допустимое растровое изображение. Если ваш основной процесс содержит окно, то есть вы являетесь приложением для рабочего стола Windows, вы можете создать графический объект без растрового изображения, используя:

Graphics graphics = Graphics.FromHwnd(Process.GetCurrentProcess().MainWindowHandle)

Также возможно использовать классы в System.Windows.Media части WPF, см .: /1092908/alternativy-system-drawing-dlya-ispolzovaniya-s-asp-net

...