Размер отпечатка диапазона Excel - PullRequest
0 голосов
/ 08 апреля 2019

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

Я пишуVSTO Addin с C #, чтобы установить масштаб и поле рабочего листа, чтобы назначенный диапазон всегда помещался на одной странице.

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

class Rapport
    {
        public static void RapportSetupPage()
        {
            Excel.Application excelObj = Globals.ThisAddIn.Application;
            Excel.Workbook wb = excelObj.ActiveWorkbook;
            Excel.Worksheet ws = wb.ActiveSheet;

            float topMargin= (float)(ws.PageSetup.TopMargin / 72 * 100);
            float botMargin = (float)(ws.PageSetup.BottomMargin / 72 * 100);
            float leftMargin = (float)(ws.PageSetup.LeftMargin / 72 * 100);
            float rightMargin = (float)(ws.PageSetup.RightMargin / 72 * 100);

            RectangleF rangeSize=new RectangleF(0, 0, (float)ws.Range["Impression_Page"].Width / 72 * 100, (float)ws.Range["Impression_Page"].Height / 72 * 100);

            PrinterSettings printerSet = new PrinterSettings();

            foreach (var pname in PrinterSettings.InstalledPrinters)
            {
                if (excelObj.ActivePrinter.Contains(pname.ToString()))
                {
                    printerSet.PrinterName = pname.ToString();
                }
            }

            PageSettings pageSet = new PageSettings(printerSet);
            RectangleF paperSize = new RectangleF();

            foreach (PaperSize psize in printerSet.PaperSizes)
            {
                if ((int)ws.PageSetup.PaperSize==psize.RawKind)
                {
                    pageSet.PaperSize = psize;
                    paperSize.Height = psize.Height;
                    paperSize.Width = psize.Width;         
                }
            }

            RectangleF printableArea = pageSet.PrintableArea;

            //Determine the minimum Margin
            topMargin = Math.Max(topMargin, printableArea.Y);
            botMargin = Math.Max(botMargin, paperSize.Height-printableArea.Bottom);
            leftMargin = Math.Max(leftMargin, printableArea.X);
            rightMargin = Math.Max(rightMargin, paperSize.Width-printableArea.Right );

            if (ws.PageSetup.CenterHorizontally)
            {
                leftMargin = Math.Max(leftMargin, rightMargin);
                rightMargin = leftMargin;
            }

            if (ws.PageSetup.CenterVertically)
            {
                topMargin = Math.Max(topMargin, botMargin);
                botMargin = topMargin;
            }

            printableArea.X = leftMargin;
            printableArea.Y = topMargin;
            printableArea.Width = paperSize.Width - leftMargin - rightMargin;
            printableArea.Height = paperSize.Height - topMargin - botMargin;

            float zoom = 0;

            if ((printableArea.Width/rangeSize.Width)<(printableArea.Height / rangeSize.Height))
            {
                zoom = printableArea.Width / rangeSize.Width;

            }
            else
            {
                zoom = printableArea.Height / rangeSize.Height;
            }


            if (ws.PageSetup.CenterHorizontally)
            {
                leftMargin = (paperSize.Width - rangeSize.Width * zoom)/2;
                rightMargin = leftMargin;
            }
            else
            {
                rightMargin= paperSize.Width - leftMargin - rangeSize.Width * zoom;
            }

            if (ws.PageSetup.CenterVertically)
            {
                topMargin = (paperSize.Height - rangeSize.Height * zoom) / 2;
                botMargin = topMargin;
            }
            else
            {
                botMargin = paperSize.Height - topMargin - rangeSize.Height * zoom;

            }

            ws.PageSetup.TopMargin= topMargin/100*72 ;
            ws.PageSetup.BottomMargin=botMargin/100*72;
            ws.PageSetup.LeftMargin=leftMargin/100*72;
            ws.PageSetup.RightMargin =rightMargin/100*72;
            ws.PageSetup.Zoom = zoom * 100;
            ws.PageSetup.FitToPagesTall = false;
            ws.PageSetup.FitToPagesWide = false;

        }

    }

Код работает, НО вычисленный левый и правый поля неверны.Все рассчитано относительно высоты страницы в порядке, и рассчитанный коэффициент масштабирования идеально.Но когда ширина страницы определяет коэффициент масштабирования, результаты не работают

Похоже, что соотношение ширины / высоты диапазона (в точках) не совпадает с отношением ширины / высотыпечатного результата.В моем случае ws.Range ["Impression_Page"]. Width = 553.5 и ws.Range ["Impression_Page"]. Высота составляет 766,5 для отношения 0,722.Если я распечатываю лист и физически измеряю результат, у меня коэффициент 0,759.

Вопрос в том, как получить напечатанную ширину диапазона в дюймах?

...