Как я могу разместить все столбцы на одной странице в электронной таблице? - PullRequest
1 голос
/ 10 мая 2019

Я экспортировал отчет в Excel, и он отлично работает, но когда я печатаю файл, ширина электронной таблицы не помещается во все столбцы на одной странице. Чтобы это произошло, я должен изменить макет страницы и установить масштабирование, чтобы оно соответствовало 1 по ширине и 43 по высоте. Как я могу получить это из кода?


using (var workbook = SpreadsheetDocument.Create(Savepath, SpreadsheetDocumentType.Workbook))
{
    var workbookPart = workbook.AddWorkbookPart();
    workbook.WorkbookPart.Workbook = new Workbook();
    workbook.WorkbookPart.Workbook.Sheets = new Sheets();

    //declare our MergeCells here
    MergeCells mergeCells = null;

    foreach (DataRow dsrow in table.Rows)
    {
        int innerColIndex = 0;
        rowIndex++;
        Row newRow = new Row();
        foreach (String col in columns)
        {
            Stylesheet stylesheet1 = new Stylesheet();
            Cell cell = new Cell();
            cell.DataType = CellValues.String;
            cell.CellValue = new CellValue(dsrow[col].ToString());
            cell.CellReference = excelColumnNames[innerColIndex] + rowIndex.ToString();

            if (table.TableName == "Work Order Report")
            {
                string cellNameWorkOrder = dsrow[col].ToString();
                if (cellNameWorkOrder == "POSTER: 10% MUST HAVE APPROACH AND CLOSE-UP SHOTS - PHOTO OF EACH CREATIVE" || cellNameWorkOrder == "BULLETINS: 100% CLOSE-UP AND APPROACH OF EACH UNIT")
                {
                    if (mergeCells == null)
                        mergeCells = new MergeCells();

                    var cellAddress = cell.CellReference;
                    var cellAddressTwo = "I" + rowIndex.ToString();
                    mergeCells.Append(new MergeCell() { Reference = new StringValue(cellAddress + ":" + cellAddressTwo) });
                }
            }

            newRow.AppendChild(cell);
            innerColIndex++;
        }

        sheetData.AppendChild(newRow);
    }
    //add the mergeCells to the worksheet if we have any
    if (mergeCells != null)
        sheetPart.Worksheet.InsertAfter(mergeCells, sheetPart.Worksheet.Elements<SheetData>().First());
}

 workbook.WorkbookPart.Workbook.Save();
}

Отчет Excel выглядит как https://www.screencast.com/t/CCMR96Mw7u, когда я печатаю сейчас, как https://www.screencast.com/t/MkTpDc98RD0l, https://www.screencast.com/t/MRyzpEiFICM ожидаемый результат https://www.screencast.com/t/ztgvm6mISSwp

1 Ответ

0 голосов
/ 10 мая 2019

Чтобы достичь этого, вам нужно сделать две вещи. Во-первых, вам нужно добавить экземпляр PageSetupProperties в экземпляр SheetProperties, который, в свою очередь, должен быть добавлен к вашему Worksheet. У PageSetupProperties есть свойство FitToPage, которое устанавливает переключатель в Excel в «Fit to».

Далее вам нужно использовать класс PageSetup, чтобы установить необходимую ширину и высоту. Это делается через свойства FitToWidth и FitToHeight. PageSetup также необходимо добавить к Worksheet.

Обратите внимание, что порядок элементов важен, вы можете увидеть правильный порядок в спецификации ECMA.

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

using (SpreadsheetDocument myDoc = SpreadsheetDocument.Create(filename, SpreadsheetDocumentType.Workbook))
{
    WorkbookPart workbookpart = myDoc.AddWorkbookPart();
    workbookpart.Workbook = new Workbook();

    // Add a WorksheetPart to the WorkbookPart.
    WorksheetPart worksheetPart = workbookpart.AddNewPart<WorksheetPart>();

    SheetData sheetData = new SheetData();

    //add a row
    Row row = new Row();
    row.RowIndex = 1;

    //create a cell
    Cell cell = new Cell();
    cell.CellReference = "A1";
    CellValue cellValue = new CellValue();
    cellValue.Text = "123";
    cell.Append(cellValue);

    row.AppendChild(cell);

    sheetData.AppendChild(row);
    // Add a WorkbookPart to the document.
    worksheetPart.Worksheet = new Worksheet(sheetData);

    //this sets the "Fit to" radio in Excel.
    //note this must come before the SheetData
    SheetProperties sheetProperties = new SheetProperties();
    PageSetupProperties pageSetupProperties = new PageSetupProperties() { FitToPage = true };
    sheetProperties.Append(pageSetupProperties);
    worksheetPart.Worksheet.InsertBefore(sheetProperties, sheetData);

    // this changes the fit to width and height
    PageSetup pageSetup = new PageSetup() { FitToWidth = 1, FitToHeight = 43 };
    worksheetPart.Worksheet.AppendChild(pageSetup);

    //append the sheets / sheet
    Sheets sheets = myDoc.WorkbookPart.Workbook.AppendChild(new Sheets());
    sheets.AppendChild(new Sheet()
    {
        Id = myDoc.WorkbookPart.GetIdOfPart(myDoc.WorkbookPart.WorksheetParts.First()),
        SheetId = 1,
        Name = "Sheet1"
    });
}
...