【问题标题】:Freeze pane on he second tab第二个选项卡上的冻结窗格
【发布时间】:2020-06-25 06:33:42
【问题描述】:

所以我想向现有的 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】:

    这一行

    SheetView sheetView1 = new SheetView() { TabSelected = true, WorkbookViewId = sheetId };
    

    应该是

    SheetView sheetView1 = new SheetView() {  WorkbookViewId = (UInt32Value)0U };
    

    这样就解决了

    【讨论】:

      猜你喜欢
      • 2020-09-26
      • 1970-01-01
      • 2018-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多