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. То же самое сверху за то, почему я их добавил.