У меня есть лист 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.
Вопрос в том, как получить напечатанную ширину диапазона в дюймах?