Надеюсь, кто-нибудь столкнулся с этой проблемой и нашел решение.
Мне удалось успешно создать файл Excel, используя DocumentFormat.OpenXml.dll библиотека.
Проблема в том, что если мой код фиксирует верхнее число x строк, позже, когда я открываю документ в Excel и пытаюсь использовать диалоговое окно «Печать», я получаю одну из этих диалоговых окон «Microsoft Excel перестал работать».
Если я разблокирую строки, сохраню файл и снова открою его, диалоговое окно «Печать» будет работать нормально. Даже тогда я могу вручную заморозить строки, сохранить файл и открыть его в Excel; Диалоговое окно «Печать» работает нормально.
Я даже открыл оба файла в инструменте повышения производительности OpenXML, и код в обоих выглядит одинаково.
Значит, в том, что я делаю, должно быть что-то не так.
Если это поможет, вот функция, которая делает все. Таблица стилей и таблица данных заполнены в другом месте:
public void CreateSpreadsheetWorkbook ( string filepath, List dataList, List 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 (); // 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/offic ... ationships" );
worksheet1.AddNamespaceDeclaration ( "x", "http://schemas.openxmlformats.org/sprea ... /2006/main" );
worksheet1.AddNamespaceDeclaration ( "x14ac", "http://schemas.microsoft.com/office/spr ... /2009/9/ac" );
//
// Setup Freeze and SheetDimensions data elements...
//
string strFreezeRow = "";
double numRows = 0.00;
if ( xlRegular_Heading != "" )
{
numRows = 4;
strFreezeRow = "A5";
}
else
{
numRows = 1;
strFreezeRow = "A2";
}
int numSheetRows = numRecordCount + (int)numRows;
SheetViews sheetViews1 = new SheetViews ();
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/spr ... /2009/9/ac" );
if ( oPrinterSetup.psFreezeRows )
{
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 () { 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 );
if ( oPrinterSetup.psFreezeRows )
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 ( 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/offic ... ationships" );
DefinedNames definedNames1 = new DefinedNames ();
DefinedName definedName1 = new DefinedName () { Name = "_xlnm.Print_Titles", LocalSheetId = (UInt32Value) 0U };
sheets.Append ( sheet );
SheetData sData = worksheetPart.Worksheet.GetFirstChild (); // 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.
}
Подробнее здесь: https://stackoverflow.com/questions/373 ... frozen-row
Откройте XML Excel. Невозможно открыть диалоговое окно печати после создания файла. В файле есть замороженные строки ⇐ C#
Место общения программистов C#
1729026418
Anonymous
Надеюсь, кто-нибудь столкнулся с этой проблемой и нашел решение.
Мне удалось успешно создать файл Excel, используя DocumentFormat.OpenXml.dll библиотека.
Проблема в том, что если мой код фиксирует верхнее число x строк, позже, когда я открываю документ в Excel и пытаюсь использовать диалоговое окно «Печать», я получаю одну из этих диалоговых окон «Microsoft Excel перестал работать».
Если я разблокирую строки, сохраню файл и снова открою его, диалоговое окно «Печать» будет работать нормально. Даже тогда я могу вручную заморозить строки, сохранить файл и открыть его в Excel; Диалоговое окно «Печать» работает нормально.
Я даже открыл оба файла в инструменте повышения производительности OpenXML, и код в обоих выглядит одинаково.
Значит, в том, что я делаю, должно быть что-то не так.
Если это поможет, вот функция, которая делает все. Таблица стилей и таблица данных заполнены в другом месте:
public void CreateSpreadsheetWorkbook ( string filepath, List dataList, List 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 (); // 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" );
//
// Setup Freeze and SheetDimensions data elements...
//
string strFreezeRow = "";
double numRows = 0.00;
if ( xlRegular_Heading != "" )
{
numRows = 4;
strFreezeRow = "A5";
}
else
{
numRows = 1;
strFreezeRow = "A2";
}
int numSheetRows = numRecordCount + (int)numRows;
SheetViews sheetViews1 = new SheetViews ();
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" );
if ( oPrinterSetup.psFreezeRows )
{
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 () { 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 );
if ( oPrinterSetup.psFreezeRows )
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 ( 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 (); // 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.
}
Подробнее здесь: [url]https://stackoverflow.com/questions/37394307/open-xml-excel-cant-open-print-dialog-after-creating-file-file-has-frozen-row[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия