Paul G. Scannell Ответов: 1

Openxml excel: проблема открытия диалогового окна печати. Файл имеет замороженные строки


Я надеюсь, что кто-то столкнулся с этой проблемой и нашел решение.

Я могу успешно создать файл Excel, используя DocumentFormat.OpenXml.dll

Проблема в том, что если мой код замораживает верхнее x-число строк, то позже, когда я открываю документ в Excel и пытаюсь использовать диалоговое окно печати, я получаю одно из этих диалоговых окон "Microsoft Excel перестал работать".

Если я размораживаю строки; сохраняю файл; снова открываю его; диалоговое окно печати работает нормально. Я даже тогда могу вручную заморозить строки; сохранить файл; открыть его в Excel; диалоговое окно печати работает нормально.

Я даже открыл оба файла в инструменте производительности OpenXML, и код выглядит точно так же в обоих.

Значит, в том, что я делаю, должно быть что-то еще не так.

Если это поможет, вот функция, которая делает все. Таблица стилей и таблица данных заполняются в другом месте:

public void CreateSpreadsheetWorkbook ( string filepath, List<string []> dataList, List<string> excelHeader )
    {
    SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create ( filepath, SpreadsheetDocumentType.Workbook );    // Create a spreadsheet document by supplying the filepath.By default, AutoSave = true, Editable = true, and Type = xlsx.

    WorkbookPart            workbookpart        = spreadsheetDocument.AddWorkbookPart ();                                        // Add a WorkbookPart to the document.
    workbookpart.Workbook = new Workbook ();

    WorksheetPart           worksheetPart       = workbookpart.AddNewPart<WorksheetPart> ();                                     // Add a WorksheetPart to the WorkbookPart.
  //Worksheet               worksheet1          = new Worksheet     ();
    Worksheet               worksheet1          = new Worksheet     () { MCAttributes = new MarkupCompatibilityAttributes () { Ignorable = "x14ac" } };

    SheetData               sheetData1          = new SheetData     ();
    Columns                 columns1            = new Columns       ();


    worksheet1.AddNamespaceDeclaration ( "r",     "http://schemas.openxmlformats.org/officeDocument/2006/relationships" );
    worksheet1.AddNamespaceDeclaration ( "x",     "http://schemas.openxmlformats.org/spreadsheetml/2006/main"           );
    worksheet1.AddNamespaceDeclaration ( "x14ac", "http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac"         );

    //
    // Freeze at row x...
    //
    string strFreezeRow = "";
    double numRows      = 0.00;

    if ( xlRegular_Heading != "" )
        {
        numRows      = 4;
        strFreezeRow = "A5";
        }
    else
        {
        numRows      = 1;
        strFreezeRow = "A2";
        }

    int             numSheetRows = numRecordCount + (int)numRows;

    SheetDimension          sheetDimension1         = new SheetDimension        () { Reference = "A1:" + strHighestColumn + numSheetRows.ToString() };
    SheetFormatProperties   sheetFormatProperties1  = new SheetFormatProperties () { DefaultRowHeight = 11.25D, DyDescent = 0.2D };
    sheetFormatProperties1.AddNamespaceDeclaration ( "x14ac", "http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac" );


    SheetViews              sheetViews1             = new SheetViews            ();

    SheetView               sheetView1              = new SheetView             () { TabSelected = true, WorkbookViewId = (UInt32Value) 0U };
    Pane                    pane1                   = new Pane                  () { VerticalSplit = numRows, TopLeftCell = strFreezeRow, ActivePane = PaneValues.BottomLeft, State = PaneStateValues.Frozen };
    Selection               selection1              = new Selection             () { Pane = PaneValues.BottomLeft, ActiveCell = strFreezeRow, SequenceOfReferences = new ListValue<StringValue> () { InnerText = strFreezeRow } };

    sheetView1.Append  ( pane1      );
    sheetView1.Append  ( selection1 );
    sheetViews1.Append ( sheetView1 );

    uint x = 0;
    for ( x = 0; x < layoutList.Count; x++ )
        {
        uint numIndex = x + 1;

        Column column1 = new Column () { Min = numIndex, Max = numIndex, Width = layoutList [ (int) x ].numColumnWIDTH, Style = 2, CustomWidth = true };
        columns1.Append ( column1 );
        }

    worksheet1.Append ( sheetDimension1         );
    worksheet1.Append ( sheetViews1             );
    worksheet1.Append ( sheetFormatProperties1  );
    worksheet1.Append ( columns1                );
    worksheet1.Append ( sheetData1              );

    if ( xlRegular_Heading != "" )
        {
        MergeCells mergeCells1 = new MergeCells () { Count = (UInt32Value) 2U                   };
        MergeCell  mergeCell1  = new MergeCell  () { Reference = "A1:B1"                        };
        MergeCell  mergeCell2  = new MergeCell  () { Reference = "A2:" + strHighestColumn + "2" };

        mergeCells1.Append ( mergeCell1 );
        mergeCells1.Append ( mergeCell2 );

        worksheet1.Append  ( mergeCells1 );
        }

    worksheet1.Append ( pageMargins );
    worksheet1.Append ( pageSetup   );
    if ( oPrinterSetup.psLeftHeader != "" && oPrinterSetup.psCenterHeader != "" && oPrinterSetup.psRightHeader != "")
        worksheet1.Append ( AddHeader() );

    worksheetPart.Worksheet = worksheet1;

    Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.AppendChild<Sheets> ( new Sheets () );                                       // Add Sheets to the Workbook.
    Sheet  sheet  = new Sheet () { Id = spreadsheetDocument.WorkbookPart.GetIdOfPart ( worksheetPart ), SheetId = 1, Name = "MySheet" };   // Append a new worksheet and associate it with the workbook.
    sheet.AddNamespaceDeclaration ( "r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships" );


    DefinedNames definedNames1 = new DefinedNames ();
    DefinedName  definedName1  = new DefinedName  () { Name = "_xlnm.Print_Titles", LocalSheetId = (UInt32Value) 0U };

    sheets.Append ( sheet );


    SheetData sData = worksheetPart.Worksheet.GetFirstChild<SheetData> ();                      // data for the sheet

    excelHeaderMethod ( spreadsheetDocument, sData, _headerColumns,           excelHeader );   // Export header
    ForeachToExcel    ( spreadsheetDocument, sData, _headerColumns, dataList, excelHeader );   // Export data content

    definedName1.Text = "MySheet!" + oPrinterSetup.psPrintTitleRows;
    definedNames1.Append ( definedName1 );

    workbookpart.Workbook.Append ( definedNames1 );

    workbookpart.Workbook.Save ();
    spreadsheetDocument.Close  (); // Close the document.
    }


Что я уже пробовал:

В моем первом наборе кода не было различных вызовов функций " AddNamespaceDeclaration ()". Я даже не знаю, нужны они или нет. Я нашел их в файле после изменения файлов в графическом интерфейсе Excel, а затем открыл их в инструменте производительности, поэтому решил, что они могут понадобиться. Я поискал в интернете "AddNamespaceDeclaration ()", и все, что я нашел, было страницей MSDN, которая показывала функцию и ее параметры. Никаких причин для его использования не было дано, и не было никаких примеров его использования.

У меня также никогда раньше не было свойств SheetDimension или SheetFormatProperties. То же самое сверху за то, почему я их добавил.

1 Ответов

Рейтинг:
2

Member 14737583

Я знаю, что этот пост старый, но нашел решение, которое сработало для меня здесь:

c# - Open XML Excel. Не удается открыть диалоговое окно печати после создания файла. Файл имеет замороженные строки - переполнение стека[^]