NPOI не меняет настройки печати листа
Всем доброго времени суток!
Мне необходимо сформировать отчет в виде документа Excel. Для этого решил использовать NPOI. В целом все хорошо и довольно удобно, но мне требуется вывести сгенерированный отчет на печать. При этом мне нужно, чтобы по ширине отчет вписывался в одну страницу. В примерах NPOI сказано, что для этого нужно использовать sheet.PrintSetup.FitWidth = 1;. Но это не работает для .xlsx документов. Есть ли какие еще способы это сделать?
Вот примерно так я файл генерирую:
var workbook = new XSSFWorkbook();
//fonts
IFont boldFont = workbook.CreateFont();
boldFont.IsBold = true;
//styles
ICellStyle styleLeftBold = workbook.CreateCellStyle();
styleLeftBold.Alignment = HorizontalAlignment.Left;
styleLeftBold.VerticalAlignment = VerticalAlignment.Bottom;
styleLeftBold.SetFont(boldFont);
ICellStyle styleRightBold = workbook.CreateCellStyle();
styleRightBold.Alignment = HorizontalAlignment.Right;
styleRightBold.VerticalAlignment = VerticalAlignment.Bottom;
styleRightBold.SetFont(boldFont);
ICellStyle styleCenterBold = workbook.CreateCellStyle();
styleCenterBold.Alignment = HorizontalAlignment.Center;
styleCenterBold.VerticalAlignment = VerticalAlignment.Bottom;
styleCenterBold.SetFont(boldFont);
var sheet = workbook.CreateSheet("Report");
//should work, but not!
sheet.PrintSetup.FitWidth = 1;
//Title row
sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, 3));
sheet.AddMergedRegion(new CellRangeAddress(0, 0, 4, 7));
sheet.AddMergedRegion(new CellRangeAddress(0, 0, 8, 10));
var titleRow = sheet.CreateRow(0);
titleRow.CreateCell(0).SetCellValue("Left part of title");
titleRow.GetCell(0).CellStyle = styleLeftBold;
titleRow.CreateCell(4).SetCellValue("Middle part of title");
titleRow.GetCell(4).CellStyle = styleCenterBold;
titleRow.CreateCell(8).SetCellValue("Right part of title");
titleRow.GetCell(8).CellStyle = styleRightBold;
FileStream file = new FileStream(@"test.xlsx", FileMode.Create);
workbook.Write(file);
file.Close();
Ответы (1 шт):
Итак, я немного разобрался. NPOI имеет некоторые неочевидные, но весьма важные нюансы. Вот один из них: sheet.PrintSetup.FitWidth = 1; будет работать только в комбинации с другими свойствами:
sheet.FitToPage = true; // заставляет вписывать документ в необходимые размеры при печати
sheet.PrintSetup.FitWidth = 1; // задает размер по ширине в страницах
sheet.PrintSetup.FitHeight = 0; // задает размер по высоте в страницах. Если 0 - то значение будет "Авто" (то что мне и нужно)
sheet.PrintSetup.PaperSize = (short)PaperSize.A4 + 1; // задает размер бумаги. Смещение на 1 из-за разной базы (0 - в С#, 1 - в Excel)