冻结第二个选项卡上的窗格

问题描述 投票:0回答:1

所以我想向现有的XLSX添加工作表,它似乎可以工作,但是在打开它时会出现错误,并且excel需要对其进行修复,我尝试使用开放的xml生产力工具进行查找,但是找不到任何可以看到的东西的地方

public static void ExportExcel(string Query, string targetFileName, Boolean Overwrite, string Sheet) {

            FileInfo fi = new FileInfo(targetFileName);
            string filePath = fi.DirectoryName;
            string fileName = fi.Name;
            if (filePath == string.Empty || fileName == string.Empty) {
                throw new Exception(string.Format("{0}: is invalid", targetFileName));
            }
            if (fi.Exists == true && !Overwrite) {
                bfirst = true;
                //throw new Exception("File already exists, and OverwriteIfExists was specified as false.");
            }
            if (fi.Exists == true && Overwrite == true) {
                fi.Delete();
            }
            if (bfirst == false) {
                using (SpreadsheetDocument document = SpreadsheetDocument.Create(targetFileName, SpreadsheetDocumentType.Workbook)) {
                    using (SqlConnection conn = new SqlConnection(_sqlConnStr)) {
                        SqlDataAdapter da = new SqlDataAdapter(Query, conn);
                        DataSet ds = new DataSet();
                        da.Fill(ds, "Q1");
                        DataTable table = ds.Tables["Q1"];

                        var workbookPart = document.AddWorkbookPart();
                        document.WorkbookPart.Workbook = new Workbook();
                        document.WorkbookPart.Workbook.Sheets = new Sheets();

                        var sheetPart = document.WorkbookPart.AddNewPart<WorksheetPart>();
                        var sheetData = new SheetData();



                        //Autofit comes first – we calculate width of columns based on data
                        sheetPart.Worksheet = new Worksheet();
                        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 };
                        sheetView1.Append(pane1);
                        sheetViews1.Append(sheetView1);
                        sheetPart.Worksheet.Append(sheetViews1);
                        sheetPart.Worksheet.Append(AutoFit_Columns(table));
                        sheetPart.Worksheet.Append(sheetData);



                        //Adding styles to worksheet
                        Worksheet_Style(document);

                        Sheets sheets = document.WorkbookPart.Workbook.GetFirstChild<Sheets>();
                        string relationshipId = document.WorkbookPart.GetIdOfPart(sheetPart);

                        uint sheetId = 1;
                        if (sheets.Elements<Sheet>().Count() > 0) {
                            sheetId = sheets.Elements<Sheet>().Select(s => s.SheetId.Value).Max() + 1;
                        }

                        Sheet sheet = new Sheet() { Id = relationshipId, SheetId = sheetId, Name = Sheet };
                        sheets.Append(sheet);

                        Row headerRow = new Row(); //Adding column headers

                        for (int col = 0; col < table.Columns.Count; col++) {
                            Cell cell = new Cell {
                                DataType = CellValues.String,
                                CellValue = new CellValue(table.Columns[col].ColumnName.ToString()),
                                StyleIndex = 1// bold font
                            };
                            headerRow.AppendChild(cell);
                        }

                        // Add the row values to the excel sheet 
                        sheetData.AppendChild(headerRow);

                        for (int row = 0; row < table.Rows.Count; row++) {
                            Row newRow = new Row();

                            for (int col = 0; col < table.Columns.Count; col++) {
                                Cell cell = new Cell();
                                    //ommited for readability
                                }
                                newRow.AppendChild(cell);
                            }
                            sheetData.AppendChild(newRow);
                        }
                    }
                }

            } else {
                //Add a New Sheet to the newly created .xlsx file
                AddSheet(targetFileName,
                         Query,
                         Sheet);
            }
        }


        private static void AddSheet(string targetFileName, string Query, string Sheet) {
            using (SqlConnection conn = new SqlConnection(_sqlConnStr)) {
                SqlDataAdapter da = new SqlDataAdapter(Query, conn);
                DataSet ds = new DataSet();
                da.Fill(ds, "Q1");
                DataTable table = ds.Tables["Q1"];
                using (SpreadsheetDocument document = SpreadsheetDocument.Open(targetFileName, true)) {

                    WorksheetPart sheetPart = document.WorkbookPart.AddNewPart<WorksheetPart>();
                    sheetPart.Worksheet = new Worksheet();


                    Sheets sheets = document.WorkbookPart.Workbook.GetFirstChild<Sheets>();
                    string relationshipId = document.WorkbookPart.GetIdOfPart(sheetPart);

                    uint sheetId = 1;
                    if (sheets.Elements<Sheet>().Count() > 0) {
                        sheetId = sheets.Elements<Sheet>().Select(s => s.SheetId.Value).Max() + 1;
                    }


                    //Autofit comes first – we calculate width of columns based on data
                    var sheetData = new SheetData();

                    //sheetPart.Worksheet = new Worksheet();
                    SheetViews sheetViews1 = new SheetViews();
                    SheetView sheetView1 = new SheetView() { TabSelected = true, WorkbookViewId = sheetId };
                    Pane pane1 = new Pane() { VerticalSplit = 1D, TopLeftCell = "A2", ActivePane = PaneValues.BottomLeft, State = PaneStateValues.Frozen };

                    sheetView1.Append(pane1);
                    sheetViews1.Append(sheetView1);
                    sheetPart.Worksheet.Append(sheetViews1);
                    sheetPart.Worksheet.Append(AutoFit_Columns(table));
                    sheetPart.Worksheet.Append(sheetData);

                    Sheet sheet = new Sheet() { Id = relationshipId, SheetId = sheetId, Name = Sheet + "_" + sheetId };
                    sheet.AddNamespaceDeclaration("r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships");

                    sheets.Append(sheet);


                   //Can only add one stylesheet
                   //Worksheet_Style(document);

                    Row headerRow = new Row(); //Adding column headers

                   for (int col = 0; col < table.Columns.Count; col++) {
                       Cell cell = new Cell {
                           DataType = CellValues.String,
                           CellValue = new CellValue(table.Columns[col].ColumnName.ToString()),
                           StyleIndex = 1// bold font
                       };
                       headerRow.AppendChild(cell);
                   }

                   // Add the row values to the excel sheet 
                   sheetData.AppendChild(headerRow);

                   for (int row = 0; row < table.Rows.Count; row++) {
                       Row newRow = new Row();

                       for (int col = 0; col < table.Columns.Count; col++) {
                           Cell cell = new Cell();
                                //ommited for readability 
                           }
                           newRow.AppendChild(cell);
                       }
                       sheetData.AppendChild(newRow);

                   }

                }
            }
        }

代码的第一部分生成了可以正常打开的xlsx,但是当我再次运行该程序以添加第二张表时,它可以完成所有操作,但是excel不喜欢我明显地这样做的方式并说需要修复它,这是来自excel的错误日志

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<recoveryLog xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
<logFileName>error116880_01.xml</logFileName>
<summary>Er zijn fouten aangetroffen in bestand \file1.xlsx</summary>
<removedFeatures><removedFeature>Verwijderde functie: Weergave van het onderdeel /xl/worksheets/sheet2.xml</removedFeature></removedFeatures>
</recoveryLog>

这会导致错误,我的问题是我如何还要冻结第二个选项卡的第一行

 SheetViews sheetViews1 = new SheetViews();
                    SheetView sheetView1 = new SheetView() { TabSelected = true, WorkbookViewId = sheetId };
                    Pane pane1 = new Pane() { VerticalSplit = 1D, TopLeftCell = "A2", ActivePane = PaneValues.BottomLeft, State = PaneStateValues.Frozen };

                    sheetView1.Append(pane1);
                    sheetViews1.Append(sheetView1);
                    sheetPart.Worksheet.Append(sheetViews1);
c# excel sax
1个回答
0
投票

此行

© www.soinside.com 2019 - 2024. All rights reserved.