为什么我的WorkbookView序列始终使用OpenXml返回“空”值?

时间:2019-09-30 16:35:27

标签: c# html asp.net excel openxml

我在C#/ asp.net中创建了一个下载按钮,该按钮使用GridView,将其转换为数据表,然后将其存储为.xlsx文件。我要做的是能够更改我创建的电子表格的活动标签。

这是下面的代码:

 protected void downloadBtn_Click(object sender, EventArgs e)
    {

        using (var spreadSheet = SpreadsheetDocument.Create(Server.MapPath("~/Downloads/TestSheet.xlsx"), DocumentFormat.OpenXml.SpreadsheetDocumentType.Workbook))
        {
            WorkbookPart workbookPart = spreadSheet.AddWorkbookPart();
            workbookPart.Workbook = new Workbook();

            WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
            worksheetPart.Worksheet = new Worksheet(new SheetData());

            //Fine up to this point

            spreadSheet.WorkbookPart.Workbook.Sheets = new Sheets();

            DataTable table = new DataTable();
            //Converts GridView into Data Table **
            for (int i = 0; i < gvEmployee.HeaderRow.Cells.Count - 1; i++)
            {

                table.Columns.Add(gvEmployee.HeaderRow.Cells[i + 1].Text);
            }
            // fill rows     
            for (int i = 0; i < gvEmployee.Rows.Count; i++)
            {
                DataRow dr = table.NewRow();
                for (int j = 0; j < gvEmployee.Columns.Count - 1; j++)
                {
                    dr[j] = gvEmployee.Rows[i].Cells[j + 1].Text;
                }
                table.Rows.Add(dr);

            }

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

            Sheets sheets = spreadSheet.WorkbookPart.Workbook.GetFirstChild<Sheets>();
            string relationshipId = spreadSheet.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 = "TestSheet" };
            sheets.Append(sheet);

            Row headerRow = new Row();
            List<String> columns = new List<string>();
            foreach (DataColumn column in table.Columns)
            {

                columns.Add(column.ColumnName);

                Cell cell = new Cell();
                cell.DataType = CellValues.String;
                cell.CellValue = new CellValue(column.ColumnName);
                headerRow.AppendChild(cell);
            }


            sheetData.AppendChild(headerRow);
            foreach (DataRow dsrow in table.Rows)
            {
                Row newRow = new Row();
                foreach (String col in columns)
                {
                    Cell cell = new Cell();
                    cell.DataType = CellValues.String;
                    cell.CellValue = new CellValue(dsrow[col].ToString()); //
                    newRow.AppendChild(cell);
                }

                sheetData.AppendChild(newRow);
            }


            Sheet sheet2 = new Sheet() { Id = spreadSheet.WorkbookPart.GetIdOfPart(sheetPart), SheetId = 2, Name = "AdditionalSheet" };
            sheets.Append(sheet2);

            var sheetIndex = workbookPart.Workbook.Descendants<Sheet>().ToList().IndexOf(sheet2);
            WorkbookView workbookView = workbookPart.Workbook.Descendants<WorkbookView>().FirstOrDefault(); //new WorkbookView();
            workbookView.ActiveTab = Convert.ToUInt32(sheetIndex);

            workbookPart.Workbook.Save();
            spreadSheet.Close();

        }
    }

当我尝试运行此代码时,它在最后几行指出

的“ workbookView.ActiveTab”上引发错误。

System.NullReferenceException:“对象引用未设置为对象的实例。”

workbookView为空。

关于为什么要这样做的任何想法?

1 个答案:

答案 0 :(得分:0)

好的,我只是想出了问题所在,没有初始化WorkbookView,因为我认为它不需要这样做。但是,您必须先为工作簿制作一个WorkbookView,然后才能进行更改。我只需要这一行:

    ngOnInit() {
  }
  fileProgress(fileInput: any) {
    this.fileData = <File>fileInput.target.files[0];
    this.preview();
  }
  preview() {
    // Show preview
    this.previewUrl = null;
    var mimeType = this.fileData.type;
    if (mimeType.match(/image\/*/) == null) {

      return;
    }
    var reader = new FileReader();
    reader.readAsDataURL(this.fileData);
    reader.onload = (_event) => {
      this.previewUrl = reader.result;
    }
  }
  onSubmit() {
    const formData = new FormData();
    formData.append('file', this.previewUrl);
    this.http.post('http://127.0.0.1:5000/uploadimage', formData)
      .subscribe(res => {
        console.log(res);
        console.log('data passed to backend');
        //this.count = res.count;
        //this.uploadedFilePath = res.data.filePath;
        alert('SUCCESS !!');
      });
  }