SheetViews 为 null 试图冻结行 openXML

SheetViews is null trying to freeze rows openXML

正在尝试引用此 link:

https://social.msdn.microsoft.com/Forums/office/en-US/e1c08add-b610-44c9-b60e-fa8ef6c24978/openxmlexcelc?forum=oxmlsdk

我在这一行遇到了 sheetview 空指针异常:

SheetView sw = wsp.Worksheet.SheetViews.FirstOrDefault() asSheetView;

我在创建电子表格时没有使用任何工作表视图,而是使用内存流传回使用。

使用此代码:

如何冻结前两行?谢谢!

MemoryStream ms = new MemoryStream();
        SpreadsheetDocument xl = SpreadsheetDocument.Create(ms, SpreadsheetDocumentType.Workbook);

        WorkbookPart wbp = xl.AddWorkbookPart();
        WorksheetPart wsp = wbp.AddNewPart<WorksheetPart>();
        Workbook wb = new Workbook();
        FileVersion fv = new FileVersion();
        fv.ApplicationName = "Microsoft Office Excel";
        Worksheet ws = new Worksheet();

        SheetData sd = new SheetData();

        WorkbookStylesPart stylesPart = xl.WorkbookPart.AddNewPart<WorkbookStylesPart>();
        stylesPart.Stylesheet = GenerateStyleSheet();
        stylesPart.Stylesheet.Save();




        //create header
        uint colHeaderIndex = 1;
        Row r1 = new Row() { RowIndex = colHeaderIndex };
        foreach (System.ComponentModel.PropertyDescriptor descriptor in System.ComponentModel.TypeDescriptor.GetProperties(list[0]))
        {
            Cell headerCell = new Cell();
            headerCell.DataType = CellValues.String;
            headerCell.CellValue = new CellValue(descriptor.DisplayName);
            r1.Append(headerCell);
        }
        //append header row to sheet
        sd.Append(r1);


        //now fill the rest of the rows with data
        uint rowIndex = 1; //Start at 1, since we reserved index 1 for the heading. The indexer will increase its value by 1 before it is used.  
        for (int i = 0; i < list.Count; i++)
        {
            uint colIndex = 1;
            Row row = new Row() { RowIndex = ++rowIndex };
            foreach (System.ComponentModel.PropertyDescriptor descriptor in System.ComponentModel.TypeDescriptor.GetProperties(list[i]))
            {
                Cell cell = new Cell();
                cell.CellReference = rowIndex + " x " + colIndex;
                cell.DataType = CellValues.String;
                cell.StyleIndex = 1;
                var val = descriptor.GetValue(list[i]);
                cell.CellValue = new CellValue(val != null ? val.ToString() : "");
                row.Append(cell);
            }

            //append data row to sheet
            sd.Append(row);
        }

        ws.Append(sd);
        wsp.Worksheet = ws;
        wsp.Worksheet.Save();
        Sheets sheets = new Sheets();
        Sheet sheet = new Sheet();
        sheet.Name = "first sheet";
        sheet.SheetId = 1; //we will only have one sheet for now, unless we are maxing out on sheets then we can create new ones
        sheet.Id = wbp.GetIdOfPart(wsp);
        sheets.Append(sheet);
        wb.Append(fv);
        wb.Append(sheets);
        freezeHeader(wbp, wsp);
        xl.WorkbookPart.Workbook = wb;
        xl.WorkbookPart.Workbook.Save();

        xl.Close();

        Response.Clear();
        byte[] dt = ms.ToArray();

        Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
        Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.xlsx", fileName));
        Response.BinaryWrite(dt);
        Response.End();

通过使用开放的 XML SDK 2.0 生产力工具解决了这个问题。显然,附加到工作的顺序 sheet 很重要。所以我确实需要创建一个新的SheetViews列表和SheetView,但是SheetViews列表需要在数据sheet之前附加到工作sheet。

所以添加,

    SheetViews sheetViews1 = new SheetViews();

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

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

    sheetViews1.Append(sheetView1);

并致电

ws.Append(sheetViews1);

就在之前,

ws.Append(sd);

成功了。如果我在 sheetdata (sd) 已经追加之后追加,那么文件将由于抛出的错误而损坏;我可以使用生产力工具看到它。

使用该工具,我能够首先使用我的工作代码打印我的 Excel sheet(在尝试冻结 header 行之前)然后我冻结了 header 在 excel 内手动行并重新保存文件。我在工具中打开了这个新文件,我能够查看用于创建文档的代码并看到附加的顺序。

希望这对某人有所帮助。我能够看到其他一些类似的问题,但没有解决方案(或跟进)。